1、安徽工业大学操作系统实验指导书郭玉华操作系统实验报告班级: 学号: 姓名: 实验一 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
2、 name”处输入工程名,在“Location” 处输入工程目录。创建一个新的控制台应用程序工程。步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C+ Source File”, 然后在“File” 处输入C/C+源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C+源程序中。编译成可执行文件。步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:课程os课os实验程序os11debughello.exe运行结果 (如果运行不
3、成功,则可能的原因是什么?) : Hello,Win32 Consol Application (2)计算进程在核心态运行和用户态运行的时间步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。步骤2: 在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。E:课程os课os实验程序os12debugtime TES
4、T.exe步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) :请给出你要查询的程序名可能的原因是执行了exit(0);语句,程序退出。if(argc2) cout请给出你要查询的程序名os21 (假设编译生成的可执行文件是os21.exe)Process ID:xxx, Clone ID:0Process ID:xxx, Clone ID:1Process ID:xxx, Clone ID:2Process ID:xxx, Clone ID:3Process ID:xxx, Clone ID:4Process ID:xxx, Clone ID:5生成6个控制台窗口,按Enter键终止
5、窗口,直至退出程序。按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:范例:E:课程os课os实验程序os11debugos21 3(假设编译生成的可执行文件是os21.exe)Process ID:xxx, Clone ID:3Process ID:xxx, Clone ID:4Process ID:xxx, Clone ID:5生成3个控制台窗口,按Enter键终止窗口,直至退出程序。按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:步骤4:修改清
6、单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:第一次修改后不影响程序运行的结果;第二次修改后造成程序死循环,即程序一直创建新的进程且Clone Id都是0。从中你可以得出什么结论:nClone的作用:确定要克隆的进程个数,以及克隆的进程ID号。从nClone开始依次创建新进程到nClone=5结束。变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?有影响。因为程序是根据nClone的值来创建新的进程的,若nClone的值在不一样的位置会影
7、响判断语句,当nClone=5时程序终止,不再创建新的进程。第二次修改后nClone的值始终为0,所以会进入死循环创建新进程。(2). 父子进程的简单通信及终止进程步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-2中的程序,编译成可执行文件。步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:范例:E:课程os课os实验程序os11debugos22 (假设编译生成的可执行文件是os22.exe)程序先创建父进程,然后再创建子进程,并
8、且子进程结束与否由父进程来控制。步骤3:按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果: 程序进入死循环,一直处于创建父进程的状态,并没有创建子进程。在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述:_步骤4:填空 CreateProcess() 函数有 10 个核心参数?本实验程序中设置的各个参数的值是:a. 产生的应用程序的名称 (本EXE文件) szFilenameb. 告诉我们这是一个子进程的标志 szCmdLinec. 用于进程
9、的缺省的安全性 NULLd. 用于线程的缺省安全性 NULLe. 不继承句柄 FALSEf. 创建新窗口 CREATE_NEW_CONSOLEg. 新环境 NULLh. 当前目录 NULLi. 启动信息结构 &sij. 返回的进程信息 &pi步骤5:按源程序中注释中的提示,修改源程序2-2,编译执行。运行结果: 程序创建父进程,子进程闪了一下就消失了。步骤6:参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述:在进
10、程内或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制 。利用CreateMutex() API可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体。_首先,进程创建一个互斥体,打开互斥体,如遇到互斥,则进行处理,处理完后,释放互斥体,下面便是进程等待下一个要处理的项目。3、实验结论每个进程都从调用CreateProcess()API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess()或TerminateProc
11、ess()API函数终止。通常应用程序的框架负责调用ExitProcess()函数。进程都是有始有终,其中有中断,还有处理进程间互斥的函数,已达到进程的完成后自然终止。实验三 进程同步的经典算法背景知识Windows 2000提供的常用对象可分成三类:核心应用服务、线程同步和线程间通讯。其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。此类对象包括互锁数据、临界段、事件、互斥体和信号等。多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。在进程内
12、或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制 (见表3-1) 。而互斥体则是另一个可命名且安全的内核对象,其主要目的是引导对共享资源的访问。拥有单一访问资源的线程创建互斥体,所有想要访问该资源的线程应该在实际执行操作之前获得互斥体,而在访问结束时立即释放互斥体,以允许下一个等待线程获得互斥体,然后接着进行下去。与事件对象类似,互斥体容易创建、打开、使用并清除。利用CreateMutex() API可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体。表3-
13、1 用于管理事件对象的APIAPI名称描述CreateEvent()在内核中创建一个新的事件对象。此函数允许有安全性设置、手工还是自动重置的标志以及初始时已接受还是未接受信号状态的标志OpenEvent()创建对已经存在的事件对象的引用。此API函数需要名称、继承标志和所需的访问级别SetEvent()将手工重置事件转化为已接受信号状态ResetEvent()将手工重置事件转化为非接受信号状态PulseEvent()将自动重置事件对象转化为已接受信号状态。当系统释放所有的等待它的线程时此种转化立即发生为了获得互斥体,首先,想要访问调用的线程可使用OpenMutex() API来获得指向对象的句
14、柄;然后,线程将这个句柄提供给一个等待函数。当内核将互斥体对象发送给等待线程时,就表明该线程获得了互斥体的拥有权。当线程获得拥有权时,线程控制了对共享资源的访问必须设法尽快地放弃互斥体。放弃共享资源时需要在该对象上调用ReleaseMute() API。然后系统负责将互斥体拥有权传递给下一个等待着的线程 (由到达时间决定顺序) 。1、实验目的1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。2) 了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。2、实验内容和步骤 (1). 生产者消
15、费者问题步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单3-1中的程序,编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:范例:E:课程os课os实验程序os11debugos31 (假设编译生成的可执行文件是os31.exe)消费者个数多于生产者,生产速度慢,消费者经常等待生产者。 步骤3:仔细阅读源程序,找出创建线程的WINDOWS API函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API函数的第几个参数中?创建生产者线程:CreateThread(NULL,0,Producer,NULL,0,&producerIDi)创建消费者线程:CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi)生产者函数:DWORD WINAPI Producer(LPVOID lpPara)消费者函数:DWORD WINAPI Consumer(LPVOID lpPara)执行函数位于第三个参数中步骤4:修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。运行结果:修改:生产者2,消费者5生产者个数多于消
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1