操作系统进程实验
实验一、进程管理(3学时、必做)一、实验目的通过实验使学生进一步了解进程、进程状态、进程控制等基本概念基本能 达到下列具体的目标:1、 理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理2、 复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实现进程的管理二、实验内容1、 建立一个结点,即 PCB 块包括用户标识域、状态域(执行、等待、就 绪)、 link 域2、 建立三个队列(执行队列、就绪队列、等待队列)3、 根据进程状态转换实现对三个队列的具体操作具体的驱动可以采用时间片算法或手动调度的形式完成三个状态之间的转换4、 用 switch 选择语句选择状态5、 按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)三、实验步骤1、 复习进程管理三状态模型部分内容2、 预习 C++Builder 或 VC++、Delphi、JBuilder 线程编程3、 运行示例程序,进一步明确实验要求可以采用控制台模式或窗口模式4、 上机编程、调试程序5、 完成实验报告实验1的附加资料1、控制台模式进程管理的使用说明1十▲ nuttfluttu-uitiiunuat^ 程序 亂宇 母耗示进程 名 uttiuutiuitiuiiuuiuutiuit请输A结東标缶 %图 1. 输入结束字符本程序是输入一个字符串,每个作为一个进程的名称,以指定的字符为结束字符,比较容易实现,其实可以在程序运行期间任意创建进程才是最好的。
L □ Xdfa. II料料iinii脚料iihii.•卜号 二几亍 母表示进徑S #ittaana#H#i»a#i#»话综:'-巴.中环丄: "请输入您巽运行脚进程屯以雄東!FlEJCDliFu图 2. 输入进程名称一次性的创建了多个进程,进入三状态模型,按照要求进行状态之间的转移, 只要输入1、2、3、4、5 数字,按回车即可nniiiiiitiniiiiiiiiR卞f?.宁〜、"[耳.古.…丁誓 £ti"・・itttttttti"・・tttttftfti谊砌厶结克長芯: ■■请輸入■您娶富疔的磁程宅以口结東耳 BOEFo队列情抚为, A >B >C >D >E >F >HULL/峯B;邂岳冷覽扉e于*5图 3. 进程管理程序的主界面2、窗口模式的进程管理图 4. 简单进程管理的主界面创建进程进入就绪队列,其排序可以按照 FIFO 的形式,也可以按照优先级 的形式,为此需要在 PCB 节点中增加优先级数进程状态的转化在三个队列之间 实现,输入进程的名称,选择合适的功能按钮如果不符合状态转换的规则,则 弹出错误的对话框,说明原因3、基于时间片调度的进程管理图 5. 基于时间片的进程管理主界面创建一个进程,给出工作量,每个进程所占的时间片大小为 20 个单位,实 现就绪状态到执行状态之间的转化。
如果一个进程在执行,点击其 I/O 请求即可 产生阻塞,实现了等待一个事件的状态转移阻塞状态到就绪状态需要事件发生, 本程序为了简化,过 40 个时间单位自动解锁本程序可以在 VC、Delphi 或 VB 程序设计语言中实现,容易使用时钟控件在控制台模式下,该方式不是非常合 适4、Windows 2000 进程控制Windows 所创建的每个进程都从调用 CreateProcess() API 函数开始,该函 数的任务是在对象 管 理器子 系 统内初 始 化进程对 象每 一进程都以 调用 ExitProcess() 或 TerminateProcess() API 函数终止通常应用程序的框架负 责调用 ExitProcess() 函数对于 C++ 运行库来说,这一调用发生在应用程序 的 main() 函数返回之后这些详细的内容可以参考相关的 MSDN 模块1) 创建进程CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行 表 2-1 详细地列出了每个参数的类型和名称表 1CreateProcess() 函数的参数LPCTSTR IpApplivationName全部或部分地指明包括可执行代码的EXE文件的文件名LPCTSTR lpCommandLine向可执行文件发送的参数LPSECURIITY ATTRIBUTES返回进程句柄的安全属性。
主要指明这一句柄是否应该由其他参数名称使用目的返回进程的主线程的句柄的安全属性BOOL blnheritHandle一种标志,告诉系统允许新进程继承创建者进程的句柄DWORD dwCreationFlage特殊的创建标志(如CREATE_SUSPENDED)的位标记LPVOID lpEnvironment向新进程发送的一套环境变量;如为null值则发送调用者环境LPCTSTR lpCurrentDirectory新进程的启动目录LPSECURIITY_ATTRIBUTESlpThreadAttributesSTARTUPINFO lpStartupInfoSTARTUPINFO结构,包括新进程的输入和输出配置的详情调用的结果块;发送新应用程序的进程和主线程的句柄和IDLPPROCESS_INFORMATION lpProcessInformation可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前 目录的全路径或者利用搜索方法找到的路径;IpCommandLine参数允许调用者向 新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该 对象的句柄的安全性有关。
然后是标志参数,用以在 dwCreationFlags 参数中指明系统应该给予新进程 什么行为经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停当 准备好时,应该使用 ResumeThread() API 来启动进程另一个常用的标志是 CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父 窗口这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有 其他的活动进程来说,给此进程多少CPU时间接着是CreateProcessO函数调用所需要的三个通常使用缺省值的参数第一 个参数是 lpEnvironment 参数,指明为新进程提供的环境;第二个参数是 lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊 的当前目录;第三个参数是 STARTUPINFO 数据结构所必需的,用于在必要时 指明新应用程序的主窗口的外观CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和 ID 的返回值缓冲区 以 PROCESS_INFORMATION 结构中返回的句柄调用 CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及 主创进程终止之前的任何未释放的资源。
2) 正在运行的进程如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程通常, 这种进程使用主线程来指示它的存在当主线程结束时,调用 ExitProcess() API 函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程 当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改首 先 可 查 看 的 进 程 特 性 是 系 统 进 程 标 识 符 (PID) , 可 利 用 GetCurrentProcessId() API 函数来查看,与 GetCurrentProcess() 相似,对该函数的 调用不能失败,但返回的 PID 在整个系统中都可使用其他的可显示当前进程 信息的 API 函数还有 GetStartupInfo()和 GetProcessShutdownParameters(),可给 出进程存活期内的配置详情通常, 一个进程需要它的 运行期环境的 信 息 例如 API 函 数 GetModuleFileName() 和 GetCommandLine() ,可以给出用在 CreateProcess() 中 的参数以启动应用程序在创建应用程序时可使用的另一个 API 函数是 IsDebuggerPresent() 。
可利用API函数GetGuiResources()来查看进程的GUI资源此函数既可返 回指定进程中的打开的 GUI 对象的数目,也可返回指定进程中打开的 USER 对 象 的 数 目 进 程 的 其 他 性 能 信 息 可 通 过 GetProcessIoCounters() 、 GetProcessPriorityBoost() 、GetProcessTimes() 和 GetProcessWorkingSetSize() API 得到以上这几个 API 函数都只需要具有 PROCESS_QUERY_INFORMATION 访问权限的指向所感兴趣进程的句柄另一个可用于进程信息查询的API函数是GetProcessVersion()此函数只需 感兴趣进程的PID (进程标识号)本实验程序清单3-6中列出了这一 API函数 与 GetVersionEx() 的共同作用,可确定运行进程的系统的版本号3) 终止进程所有进程都是以调用 ExitProcess() 或者 TerminateProcess() 函数结束的但 最好使用前者而不要使用后者,因为进程是在完成了它的所有的关闭“职责”之 后以正常的终止方式来调用前者的。
而外部进程通常调用后者即突然终止进程的 进行,由于关闭时的途径不太正常,有可能引起错误的行为TerminateProcess() API 函数只要打开带有 PROCESS_TERMINATE 访问权的 进程对象,就可以终止进程,并向系统返回指定的代码这是一种“野蛮”的终 止进程的方式,但是有时却是需要的。




