实验三进程管理.doc

上传人:小** 文档编号:16729463 上传时间:2020-10-22 格式:DOC 页数:14 大小:305KB
收藏 版权申诉 举报 下载
实验三进程管理.doc_第1页
第1页 / 共14页
实验三进程管理.doc_第2页
第2页 / 共14页
实验三进程管理.doc_第3页
第3页 / 共14页
资源描述:

《实验三进程管理.doc》由会员分享,可在线阅读,更多相关《实验三进程管理.doc(14页珍藏版)》请在装配图网上搜索。

1、实验三 进程管理背景知识Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C+ 运行库来说,这一调用发生在应用程序的main() 函数返回之后。 1. 创建进程CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 3-4详细地列出了每个参数的类型和名称。表3-4 CreateProcess() 函数的参数参数名称

2、使用目的LPCTSTR lpApplivationName全部或部分地指明包括可执行代码的EXE文件的文件名LPCTSTR lpCommandLine向可执行文件发送的参数LPSECURIITY_ATTRIBUTES lpProcessAttributes返回进程句柄的安全属性。主要指明这一句柄是否应该由其他子进程所继承LPSECURIITY_ATTRIBUTES lpThreadAttributes返回进程的主线程的句柄的安全属性BOOL bInheritHandle一种标志,告诉系统允许新进程继承创建者进程的句柄DWORD dwCreationFlage特殊的创建标志 (如CREATE_S

3、USPENDED) 的位标记LPVOID lpEnvironment向新进程发送的一套环境变量;如为null值则发送调用者环境LPCTSTR lpCurrentDirectory新进程的启动目录STARTUPINFO lpStartupInfoSTARTUPINFO结构,包括新进程的输入和输出配置的详情LPPROCESS_INFORMATION lpProcessInformation调用的结果块;发送新应用程序的进程和主线程的句柄和ID可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序

4、发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。接着是CreateProcess() 函数调用所需要的三个通常使用缺省值的参

5、数。第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区。以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。 2. 正在运行的进程如果一个进程拥

6、有至少一个执行线程,则为正在系统中运行的进程。通常,这种进程使用主线程来指示它的存在。当主线程结束时,调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。首先可查看的进程特性是系统进程标识符 (PID) ,可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess() 相似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用。其他的可显示当前进程信息的API函数还有GetStartupInfo()和GetProces

7、sShutdownParameters() ,可给出进程存活期内的配置详情。通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在CreateProcess() 中的参数以启动应用程序。在创建应用程序时可使用的另一个API函数是IsDebuggerPresent() 。可利用API函数GetGuiResources() 来查看进程的GUI资源。此函数既可返回指定进程中的打开的GUI对象的数目,也可返回指定进程中打开的USER对象的数目。进程的其他性能信息可通过GetProcessIoCounters()、

8、GetProcessPriorityBoost() 、GetProcessTimes() 和GetProcessWorkingSetSize() API得到。以上这几个API函数都只需要具有PROCESS_QUERY_INFORMATION访问权限的指向所感兴趣进程的句柄。另一个可用于进程信息查询的API函数是GetProcessVersion() 。此函数只需感兴趣进程的PID (进程标识号) 。本实验程序清单3-6中列出了这一API函数与GetVersionEx() 的共同作用,可确定运行进程的系统的版本号。 3. 终止进程所有进程都是以调用ExitProcess() 或者Terminat

9、eProcess() 函数结束的。但最好使用前者而不要使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前者的。而外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能引起错误的行为。TerminateProcess() API函数只要打开带有PROCESS_TERMINATE访问权的进程对象,就可以终止进程,并向系统返回指定的代码。这是一种“野蛮”的终止进程的方式,但是有时却是需要的。如果开发人员确实有机会来设计“谋杀”(终止别的进程的进程) 和“受害”进程 (被终止的进程) 时,应该创建一个进程间通讯的内核对象如一个互斥程序这样一来,“受害”进

10、程只在等待或周期性地测试它是否应该终止。 4.进程同步Windows 2000/XP提供的常用对象可分成三类:核心应用服务、线程同步和线程间通讯。其中,开发人员可以使用线程同步对象来协调线程和进程的工作,以使其共享信息并执行任务。此类对象包括互锁数据、临界段、事件、互斥体和信号等。多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。在进程内或进程间实现线程同步的最方便的方法是使用事件对象,这一组内核对象允许一个线程对其受信状态进行直接控制 (见表2-1) 。而互斥体则是另一个可命

11、名且安全的内核对象,其主要目的是引导对共享资源的访问。拥有单一访问资源的线程创建互斥体,所有想要访问该资源的线程应该在实际执行操作之前获得互斥体,而在访问结束时立即释放互斥体,以允许下一个等待线程获得互斥体,然后接着进行下去。与事件对象类似,互斥体容易创建、打开、使用并清除。利用CreateMutex() API可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体。表2-1 用于管理事件对象的APIAPI名称描述CreateEvent()在内核中创建一个新的事件对象。此函数允许有安全性设置、手工还是自动重置的标

12、志以及初始时已接受还是未接受信号状态的标志OpenEvent()创建对已经存在的事件对象的引用。此API函数需要名称、继承标志和所需的访问级别SetEvent()将手工重置事件转化为已接受信号状态ResetEvent()将手工重置事件转化为非接受信号状态PulseEvent()将自动重置事件对象转化为已接受信号状态。当系统释放所有的等待它的线程时此种转化立即发生为了获得互斥体,首先,想要访问调用的线程可使用OpenMutex() API来获得指向对象的句柄;然后,线程将这个句柄提供给一个等待函数。当内核将互斥体对象发送给等待线程时,就表明该线程获得了互斥体的拥有权。当线程获得拥有权时,线程控制

13、了对共享资源的访问必须设法尽快地放弃互斥体。放弃共享资源时需要在该对象上调用ReleaseMute() API。然后系统负责将互斥体拥有权传递给下一个等待着的线程 (由到达时间决定顺序) 。1、实验目的1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。2) 通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。2、实验内容和步骤 (1). 创建进程本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。步骤1:创建一个“Wi

14、n32 Consol Application”工程,然后拷贝清单2-1中的程序,编译成可执行文件。步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:范例:E:课程os课os实验程序os11debugos21 (假设编译生成的可执行文件是os21.exe)_E:qwdebugw.exe_ _按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:_ 步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:范例:E:课程os课os实验程序os11debugos21 3(假设编译生成的可执行文件是os21.exe)_ _按下ctrl+a

15、lt+del,调用windows的任务管理器,记录进程相关的行为属性:_ _步骤4:修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:_第一次修改_第二次修改_从中你可以得出什么结论:nClone的作用:_设置进程的起始ID号。_ 变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?_答:有影响。因为变量的定义和初始化的不同可能导致进程的克隆的次数及克隆进程的ID号不同。(2). 父子进程的简单通信及终止进程步骤1:创建一个“Win32

16、Consol Application”工程,然后拷贝清单2-2中的程序,编译成可执行文件。步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:范例:E:课程os课os实验程序os11debugos22 (假设编译生成的可执行文件是os22.exe)_步骤3:按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果: _答:_直接死机_在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,

17、理解父子进程如何传递参数。给出程序执行过程的大概描述:_ BOOL CreateProcess( LPCTSTR lpApplicationName,;/ pointer to name of executable module LPTSTR lpCommandLine, / pointer to command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, / process security attributes LPSECURITY_ATTRIBUTES lpThreadAttributes, / thread securi

18、ty attributes BOOL bInheritHandles, / handle inheritance flag DWORD dwCreationFlags, / creation flags LPVOID lpEnvironment, / pointer to new environment block LPCTSTR lpCurrentDirectory, / pointer to current directory name LPSTARTUPINFO lpStartupInfo, / pointer to STARTUPINFO LPPROCESS_INFORMATION l

19、pProcessInformation /pointer to PROCESS_INFORMATION);_步骤4:填空 CreateProcess() 函数有_6_个核心参数?本实验程序中设置的各个参数的值是:a.szFilename,产生的应用程序的名称 (本EXE文件).;b. szCmdLine,告诉我们这是一个子进程的标志;c. FALSE,不继承句柄;d.CREATE_NEW_CONSOLE,创建新窗口;e.&si,启动信息结构;f.&pi,返回的进程信息;g.;h.。步骤5:按源程序中注释中的提示,修改源程序2-2,编译执行。运行结果: _步骤6:参考MSDN中的帮助文件Crea

20、teMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述: _把某进程未获得合作进程发来消息之前,该进程等待,消息到来之后方可继续执行的进程合作关系,称为进程的同步。为了描述进程的互斥与同步,我们引入临界资源和临界区的概念。临界资源就是一次仅允许一个进程使用的共享资源。临界区就是一个进程中访问临界资源的那段程序。进程的互斥就可描述为:两个进程不能同时进入访问同一临界资源的临界区。为此,必须有软件算法或同步机构来协调它们,协调的准则是:(1)当有若干进程

21、欲进入临界区时,它们不应相互阻塞致使彼此都不能进入临界区,而应在有限时间内使一进程进入临界区;(2)每次至多有一个进程处于临界区;(3)进程仅在临界区内逗留有限时间。遵循以上准则,得到临界区的调用原则是:(1)当无一进程处于临界区内时,允许一进程立即进入;(2)已有进程在临界区时,其他试图进入临界区的进程必须等待;(3)一进程离开监界区时,若有等待者,则允许其中一个进入临界区。_3、 实验结论_通过本实验的进行,对Windows创建进程,以及父子进程之间的同步互斥有了切身的体会,从中感受到学习操作系统知识的乐趣。另外,通过本次加深了对信号量对于进程间对临界区访问的同步与互斥的理解。_4、 程序

22、清单清单2-1 创建子进程/ proccreate项目#include #include #include / 创建传递过来的进程的克隆过程并赋于其ID值void StartClone(int nCloneID) / 提取用于当前可执行文件的文件名 TCHAR szFilenameMAX_PATH ; GetModuleFileName(NULL, szFilename, MAX_PATH) ; / 格式化用于子进程的命令行并通知其EXE文件名和克隆ID TCHAR szCmdLineMAX_PATH;sprintf(szCmdLine,%s %d,szFilename,nCloneID);/

23、 用于子进程的STARTUPINFO结构 STARTUPINFO si; ZeroMemory(&si , sizeof(si) ) ; si.cb = sizeof(si) ;/ 必须是本结构的大小 / 返回的用于子进程的进程信息 PROCESS_INFORMATION pi; / 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质 BOOL bCreateOK=:CreateProcess( szFilename,/ 产生这个EXE的应用程序的名称 szCmdLine,/ 告诉其行为像一个子进程的标志 NULL,/ 缺省的进程安全性 NULL,/ 缺省的线程安全性 FALSE,/

24、不继承句柄 CREATE_NEW_CONSOLE,/ 使用新的控制台 NULL,/ 新的环境 NULL,/ 当前目录 &si,/ 启动信息 &pi) ;/ 返回的进程信息 / 对子进程释放引用 if (bCreateOK) CloseHandle(pi.hProcess) ; CloseHandle(pi.hThread) ; int main(int argc, char* argv ) / 确定派生出几个进程,及派生进程在进程列表中的位置 int nClone=0;/修改语句:int nClone;/第一次修改:nClone=0; if (argc 1) / 从第二个参数中提取克隆ID :

25、 sscanf(argv1 , %d , &nClone) ; /第二次修改:nClone=0;/ 显示进程位置 std : cout Process ID: : GetCurrentProcessId() , Clone ID: nClone std : endl; / 检查是否有创建子进程的需要 const int c_nCloneMax=5; if (nClone c_nCloneMax) / 发送新进程的命令行和克隆号 StartClone(+nClone) ; / 等待响应键盘输入结束进程 getchar(); return 0;清单2-2 父子进程的简单通信及终止进程的示例程序/

26、procterm项目# include # include # include static LPCTSTR g_szMutexName = w2kdg.ProcTerm.mutex.Suicide ;/ 创建当前进程的克隆进程的简单方法void StartClone() / 提取当前可执行文件的文件名 TCHAR szFilenameMAX_PATH ; GetModuleFileName(NULL, szFilename, MAX_PATH) ; / 格式化用于子进程的命令行,字符串“child”将作为形参传递给子进程的main函数 TCHAR szCmdLineMAX_PATH ;/实验

27、2-2步骤3:将下句中的字符串child改为别的字符串,重新编译执行,执行前请先保存已经完成的工作 sprintf(szCmdLine, %schild , szFilename) ; / 子进程的启动信息结构 STARTUPINFO si; ZeroMemory(&si,sizeof(si) ; si.cb = sizeof(si) ;/ 应当是此结构的大小 / 返回的用于子进程的进程信息 PROCESS_INFORMATION pi; / 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程 BOOL bCreateOK=CreateProcess( szFilename,/ 产生的

28、应用程序的名称 (本EXE文件) szCmdLine,/ 告诉我们这是一个子进程的标志 NULL,/ 用于进程的缺省的安全性 NULL,/ 用于线程的缺省安全性 FALSE,/ 不继承句柄 CREATE_NEW_CONSOLE,/创建新窗口 NULL,/ 新环境 NULL,/ 当前目录 &si,/ 启动信息结构 &pi ) ;/ 返回的进程信息 / 释放指向子进程的引用 if (bCreateOK) CloseHandle(pi.hProcess) ; CloseHandle(pi.hThread) ; void Parent() / 创建“自杀”互斥程序体 HANDLE hMutexSuic

29、ide=CreateMutex( NULL,/ 缺省的安全性 TRUE,/ 最初拥有的 g_szMutexName) ;/ 互斥体名称 if (hMutexSuicide != NULL) / 创建子进程 std : cout Creating the child process. std : endl; StartClone() ; / 指令子进程“杀”掉自身 std : cout Telling the child process to quit. std : endl;/等待父进程的键盘响应 getchar() ;/释放互斥体的所有权,这个信号会发送给子进程的WaitForSingleO

30、bject过程ReleaseMutex(hMutexSuicide) ; / 消除句柄 CloseHandle(hMutexSuicide) ; void Child() / 打开“自杀”互斥体 HANDLE hMutexSuicide = OpenMutex( SYNCHRONIZE,/ 打开用于同步 FALSE,/ 不需要向下传递 g_szMutexName) ;/ 名称 if (hMutexSuicide != NULL) / 报告我们正在等待指令 std : cout Child waiting for suicide instructions. std : endl; /子进程进入阻塞状态,等待父进程通过互斥体发来的信号 WaitForSingleObject(hMutexSuicide, INFINITE) ;/实验2-2步骤5:将上句改为WaitForSingleObject(hMutexSuicide, 0) ,重新编译执行 / 准备好终止,清除句柄 std : cout Child quiting. 1 & : strcmp(argv1 , child )= 0) Child() ; else Parent() ; return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!