os实验指导书(新)1(2) 下载本文

操作系统教程

实验指导书

1

目录

实验一 WINDOWS进程初识 ............................................. 3

1、实验目的 ..................................................... 3 2、实验内容和步骤 ............................................... 3 3、实验结论 ..................................................... 4 4、程序清单 ..................................................... 4 实验二 进程管理 ................................................... 7

背景知识 ........................................................ 7 1、实验目的 .................................................... 10 2、实验内容和步骤 .............................................. 10 3、实验结论 .................................................... 15 4、程序清单 .................................................... 15 实验三 进程同步的经典算法 ......................................... 20

背景知识 ....................................................... 20 1、实验目的 .................................................... 21 2、实验内容和步骤 .............................................. 21 3、实验结论 .................................................... 23 4、程序清单 .................................................... 23 实验四 存储管理 ................................................... 27

背景知识 ....................................................... 27 1、实验目的 .................................................... 30 2、实验内容和步骤 .............................................. 30 3、实验结论 .................................................... 35 4、程序清单 .................................................... 36 实验五 文件和设备管理 ............................................. 40

背景知识 ....................................................... 40 1、实验目的 .................................................... 42 2、实验内容与步骤 .............................................. 42 3、实验结论 .................................................... 44

2

实验一 WINDOWS进程初识

1、 实验目的

(1) 学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2) 掌握WINDOWS API的使用方法。

(3) 编写测试程序,理解用户态运行和核心态运行。

2、 实验内容和步骤

(1)编写基本的Win32 Consol Application

步骤1:登录进入Windows,启动VC++ 6.0。

步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location” 处输入工程目录。创建一个新的控制台应用程序工程。

步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File” 处输入C/C++源程序的文件名。

步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。

步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:

E:\\课程\\os课\\os实验\\程序\\os11\\debug>hello.exe

运行结果 (如果运行不成功,则可能的原因是什么?) : _Hello,Win32ConsolApplication

________

(2)计算进程在核心态运行和用户态运行的时间

步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。

步骤2: 在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。

步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。

E:\\课程\\os课\\os实验\\程序\\os12\\debug>time TEST.exe

步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : _________

3

_____________________

_________________________________________________

步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

_______________________________________________________________________________屏蔽j循环:

_______________________________________________________________________________调整循环变量i的循环次数:

_______________________________________________________________________________调整循环变量j的循环次数:

_______________________________________________________________________________

3、 实验结论

_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4、 程序清单

清单1-1 一个简单的Windows控制台应用程序 // hello项目

# include void main() {

std::cout << “Hello, Win32 Consol Application” << std :: endl ; }

清单1-2 核心态运行和用户态运行时间比计算 // proclist项目

# include # include

4

# include

// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法 DWORD GetKernelModePercentage(const FILETIME& ftKernel, const FILETIME& ftUser) {

// 将FILETIME结构转化为64位整数

ULONGLONG qwKernel=(((ULONGLONG)ftKernel.dwHighDateTime) <<32)+ftKernel.dwLowDateTime;

ULONGLONG qwUser=(((ULONGLONG)ftUser.dwHighDateTime) <<32)+ftUser.dwLowDateTime;

// 将消耗时间相加,然后计算消耗在内核模式下的时间百分比 ULONGLONG qwTotal=qwKernel+qwUser;

DWORD dwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal); return(dwPct); }

// 以下是将当前运行过程名和消耗在内核模式下的时间百分数都显示出来的应用程序 void main(int argc,char *argv[]) { if(argc<2) { cout<<\请给出你要查询的程序名\ exit(0); } // 对当前系统中运行的过程拍取“快照” HANDLE hSnapshot=::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, // 提取当前过程 0); // 如果是当前过程,就将其忽略

// 初始化过程入口 PROCESSENTRY32 pe; ::ZeroMemory(&pe,sizeof(pe)); pe.dwSize=sizeof(pe); BOOL bMore=::Process32First(hSnapshot,&pe); BOOL found = FALSE; while(bMore) {

// 打开用于读取的过程 if(!strcmp(pe.szExeFile,argv[1])) { found = TRUE; HANDLE hProcess=::OpenProcess( PROCESS_QUERY_INFORMATION, // 指明要得到信息

5