10436编号河北工业大学2014操作系统实验报告

上传人:玩*** 文档编号:143874955 上传时间:2020-09-02 格式:PDF 页数:13 大小:347.19KB
返回 下载 相关 举报
10436编号河北工业大学2014操作系统实验报告_第1页
第1页 / 共13页
10436编号河北工业大学2014操作系统实验报告_第2页
第2页 / 共13页
10436编号河北工业大学2014操作系统实验报告_第3页
第3页 / 共13页
10436编号河北工业大学2014操作系统实验报告_第4页
第4页 / 共13页
10436编号河北工业大学2014操作系统实验报告_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《10436编号河北工业大学2014操作系统实验报告》由会员分享,可在线阅读,更多相关《10436编号河北工业大学2014操作系统实验报告(13页珍藏版)》请在金锄头文库上搜索。

1、1 河北工业大学河北工业大学 操作系统操作系统 2014 版版 实验报告实验报告 2 实验一实验一 进程控制与描述进程控制与描述 一、实验目的 通过对 Windows 2000 编程, 进一步熟悉操作系统的基本概念, 较好地理解 Windows 2000 的结构。 通过创建进程、 观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows 2000 进程的“一生” 。 三、实验内容和步骤 第一部分: Windows 2000 Professional 下的 GUI 应用程序,使用 Visual C+编译器创建一个 GUI 应用程序,代码中包 括了 Wi

2、nMain()方法,该方法 GUI 类型的应用程序的标准入口点。 程序 1-1 Windows 2000 的 GUI 应用程序 也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用 WORD 来键入和编辑程序,则应该注 意什么问题?保存时,将文件保存为扩展名为*.cpp 的 C+源文件。 在程序 1-1 的 GUI 应用程序中,首先需要 Windows.h 头文件,以便获得传送给 WinMain() 和 MessageBox() API 函数的数据类型定义。 接着的 pragma 指令指示编译器/连接器找到 User32.LIB 库文件并将其与产生的 EXE 文件连接起来。这样就 可以

3、运行简单的命令行命令 CL MsgBox.CPP 来创建这一应用程序,如果没有 pragma 指令,则 MessageBox() API 函数就成为未定义的了。这一指令是 Visual Studio C+ 编译器特有的。 接下来是 WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance 参数用来装入与代码 相连的图标或位图一类的资源,无论何时,都可用 GetModuleHandle() API 函数将这些资源提取出来。系统利用 实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是 EXE 文件映像的基地址,通常为 0 x00400000。下一个参数

4、hPrevInstance 是为向后兼容而设的,现在系统将其设为 NULL。应用程序的命令行 (不 包括程序的名称) 是 lpCmdLine 参数。另外,系统利用 nCmdShow 参数告诉应用程序如何显示它的主窗口 (选项 包括最小化、最大化和正常) 。 最后, 程序调用 MessageBox() API 函数并退出。 如果在进入消息循环之前就结束运行的话, 最后必须返回 0。 运行结果: 弹出一个消息框,标题为 Greetings,内容为 Hello,Windows Xp,中间有一个确认按钮。 进程对象 操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDL

5、E) 的号码,就 可与进程对象交互。这一号码只对当前进程有效。 本实验表示了一个简单的进程句柄的应用。 在系统中运行的任何进程都可调用 GetCurrentProcess() API 函数, 此函数可返回标识进程本身的句柄。然后就可在 Windows 需要该进程的有关情况时,利用这一句柄来提供。 程序 1-2: 获得和使用进程的句柄 程序 1-2 中列出的是一种获得进程句柄的方法。 对于进程句柄可进行的惟一有用的操作是在 API 调用时, 将 其作为参数传送给系统,正如程序 1-2 中对 GetPriorityClass() API 函数的调用那样。在这种情况下,系统向进程 3 对象内“窥视”

6、 ,以决定其优先级,然后将此优先级返回给应用程序。 OpenProcess() 和 CreateProcess() API 函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄, 而后者创建一个新进程,并将其句柄提供出来。 1-2.cpp 的运行结果: 进程优先权为 Normal。 程序 1-3 显示如何找出系统中正在运行的所有进程,如何利用 OpenProcess() API 函数来获得每一个访问进 程的进一步信息。 程序 1-3 利用句柄查出进程的详细信息 程序 1-3 程序首先利用 Windows 2000 的新特性,即工具帮助库来获得当前运行的所有进程的快照。然后应 用程序进入

7、快照中的每一个进程, 得到其以 PROCESSENTRY32 结构表示的属性。 这一结构用来向 OpenProcess() API 函数提供进程的 ID。Windows 跟踪每一进程的有关时间,示例中是通过打开的进程句柄和 GetProcessTimes() API 来直询得到有关时间的。接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下 消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继 续循环,直到所有进程都计算过为止。 运行结果: 第二部分:进程的“一生” 1、 创建进程 创建子进程 本程序展示的是一个简单的使用 Cr

8、eateProcess() API 函数的例子。 首先形成简单的命令行, 提供当前的 EXE 文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:行为像一 个子进程的标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然 后该克隆进程的创建方法关闭传递过来的句柄并返回 main() 函数。 在关闭程序之前, 每一进程的执行主线程暂停 一下,以便让用户看到其中的至少一个窗口。 CreateProcess() 函数有 5 个核心参数?本实验程序中设置的各个参数的值是: a. (LPCTSTR lpApplicationName

9、) szFilename, / 产生这个 EXE 的应用程序的名称; b. (LPTSTR lpCommandLine) szCmdLine, / 告诉其行为像一个子进程的标志; c. (BOOL bInheritHandles) FALSE, / 不继承句柄; d. (LPSTARTUPINFO lpStartupInfo) / 返回的进程信息; 程序运行时屏幕显示的信息是: 4 2、 正在运行的进程 使用进程和操作系统的版本信息 运行结果: 当前 PID 信息:_4664 当前操作系统版本:5.1(我的操作系统为 Windows XP) 系统提示信息:Task Manager should

10、 now now indicate this process is high priority 程序向读者表明了如何获得当前的 PID 和所需的进程版本信息。为了运行这一程序,系统处理了所有的版 本不兼容问题。 接着,程序演示了如何使用 GetVersionEx() API 函数来提取 OSVERSIONINFOEX 结构。这一数据块中包括 了操作系统的版本信息。其中,“OS : 5.0”表示当前运行的操作系统是:Windows 2000。最后一段程序利用了 操作系统的版本信息,以确认运行的是 Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。 单击 Ctrl + Alt

11、 + Del 键,进入“Windows 任务管理器” ,在“应用程序”选项卡中右键单击本任务,在快捷 菜单中选择“转到进程”命令。 在“Windows 任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是 (为什么?) : VCSPAWN.EXE 右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高” 后重新运行程序,屏幕显示有变化吗? 没有。 3、 终止进程 指令其子进程来“杀掉”自己的父进程 程序说明了一个进程从“生”到“死”的整个一生。第一次执行时,它创建一个子进程,其行为如同“父亲” 。 在创建子进程之前,先创建一个互斥的内核对象,其行为对

12、于子进程来说,如同一个“自杀弹”。当创建子进程时, 就打开了互斥体并在其他线程中进行别的处理工作, 同时等待着父进程使用 ReleaseMutex() API 发出 “死亡” 信号。 然后用 Sleep() API 调用来模拟父进程处理其他工作,等完成时,指令子进程终止。 当调用 ExitProcess() 时要小心,进程中的所有线程都被立刻通知停止。在设计应用程序时,必须让主线程 在正常的 C+ 运行期关闭 (这是由编译器提供的缺省行为) 之后来调用这一函数。当它转向受信状态时,通常可 创建一个每个活动线程都可等待和停止的终止事件。 在正常的终止操作中,进程的每个工作线程都要终止,由主线程调

13、用 ExitProcess()。接着,管理层对进程增 加的所有对象释放引用,并将用 GetExitCodeProcess() 建立的退出代码从 STILL_ACTIVE 改变为在 ExitProcess() 调用中返回的值。最后,主线程对象也如同进程对象一样转变为受信状态。 等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。还没有一种函数可取得终止 后的进程对象为其参数,从而使其“复活” 。当进程对象引用一个终止了的对象时,有好几个 API 函数仍然是有 用的。进程可使用退出代码将终止方式通知给调用 GetExitCodeProcess() 的其他进程。同时,GetProce

14、ssTimes() API 函数可向主调者显示进程的终止时间。 运行结果: 1)_Creating the child process._ Child waiting for suicide instructions. 表示:_父进程正在创建子进程。子进程等待父进程杀死子进程。_ 2) _Telling the child process to quit._ 表示:_父进程杀死子进程。_ 四、实验总结 请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程的理解。 本次实验让我明白进程是程序的一次执行过程,是系统进行处理机调度和资源分配的基本单位。 (未引入线 5 程之前) 。进程是

15、操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处 理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单 元,对父进程和子进程的关系有了进一步的了解。 实验二实验二 并发与调度并发与调度 1、实验目的 在本实验中, 通过对事件和互斥体对象的了解, 来加深对 Windows 2000 线程同步的理解。 通过分析实验程序, 了解管理事件对象的 API。了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件 映射对象发送数据。 二、实验内容和步骤 第一部分:互斥体对象 本程序中显示的类 CCountUp

16、Down 使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企 图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等 待并释放,为的是共同使用互斥体所需的资源 (因而也就是共享资源) 。 1、利用互斥体保护共享资源 分析程序的运行结果,可以看到线程 (加和减线程) 的交替执行 (因为 Sleep() API 允许 Windows 切换线 程) 。在每次运行之后,数值应该返回初始值 (0) ,因为在每次运行之后写入线程在等待队列中变成最后一个, 内核保证它在其他线程工作时不会再运行。 1)请描述运行结果 (如果运行不成功,则可能的原因是什么?) : 两个线程交替运行,不断改变 value 的值。两个线程互斥访问 Value 的值。 2) 根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述: 线程 1(5296)先运行,将 value 值增 1,变为 1。然后,线程 2(6016)运行,将 value 值减 1,变为 0. 第二部分:线程通过文件对象发送数据 Wi

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号