《操作系统原理 第2版实验与思考第5章互斥与同步.docx》由会员分享,可在线阅读,更多相关《操作系统原理 第2版实验与思考第5章互斥与同步.docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【实验与思考】Windows进程同步在本实验中:(1)回顾和理解系统进程、线程的有关概念。(2)通过对事件的了解,加深理解Windows线程同步(3)通过分析实验程序,了解管理事件对象的API。(4) 了解在进程中如何使用事件对象。1 .工具/准备工作在开始本实验之前,请回顾教科书的相关内容。需要准备一台运行Windows操作系统的计算机,且该计算机中需安装Visual C+ 6.0。2 .实验内容与步骤清单5-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent()API创建一 个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时, 子进程
2、通过OpenEvent。API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。 两个进程在发出信号之后几乎立即终止。步骤1:登录进入Windows o步骤2:在“开始”菜单中单击Microsoft Visual C+6.0命令,进入Visual C+窗口。步骤3:编辑实验源程序5-1 .cpp (也可直接打开下载的源程序文件5-l.cpp)。清单57创建和打开事件对象在进程间传送信号。/ event 项目# include windows,h# include /以下是句柄事件。实际中很可能使用共享的包含文件来进行通讯static LPCTSTR g_szContinu
3、eEvent = nw2kdg.EventDemo . event.Continue;/本方法只是创建了一个进程的副本,以子进程模式(由命令行指定)工作 BOOL CreateChild()/提取当前可执行文件的文件名TCHAR szFilenameMAX_PATH;:GetModuleFileName(NULL,szFilename,MAX PATH);/格式化用于子进程的命令行,指明它是一个EXE文件和子进程 TCHAR szCmdLineMAX_PATH;:sprintf(szCmdLine,”schild”,szFilename);/子进程的启动信息结构STARTUPINFO si;:
4、ZeroMemory(reinterpret_cast(&si) , sizeof(si);si . cb=sizeof (si) ;/必须是本结构的大小 /返回的子进程的进程信息结构PROCESS.工NFORMAT工ON pi;/使用同一可执行文件和告诉它是一个子进程的命令行创建进程BOOL bCreateOK=:CreateProcess(szFilename, szCmdLine, NULL,NULL, FALSE, 0,NULL,NULL,&si,&pi);/生成的可执行文件名/指示其行为与子进程一样的标志/子进程句柄的安全性/子线程句柄的安全性/不继承句柄/特殊的创建标志/新环境/当
5、前目录/启动信息结构/返回的进程信息结构/释放对子进程的引用if (bCreateOK):CloseHandle(pi.hProcess):CloseHandle(pi.hThread);return (bCreateOK);/下面的方法创建一个事件和一个子进程,然后等待子进程在返回前向事件发出信号 void WaitForChild()/ create a new event object for the child process/ to use when releasing this processHANDLE hEventContinue = : CreateEvent(NULL,TR
6、UE,FALSE,g szContinueEvent);/缺省的安全性,子进程将具有访问权限/手工重置事件/初始时是非接受信号状态/事件名称if (hEventContinue!=NULL)(std: : coutnevent creatednstci: : endl;/创建子进程if (:CreateChild ()(std:cout child creatednstd:endl;/等待,直到子进程发出信号std:coutnParent waiting on child.nstd:endl; :WaitForSingleObj ect(hEventContinue,INFINITE);:Sl
7、eep (1500);/删去这句试试std:coutnparent received the envent signalingfrom childnstd:endl;)/清除句柄:CloseHandle(hEventContinue);hEventContinue=INVALID_HANDLE_VALUE;/以下方法在子进程模式下被调用,其功能只是向父进程发出终止信号 void SignalParent()/尝试打开句柄std:coutnchild process beginningnstd:endl;HANDLE hEventContinue=:OpenEvent(EVENT_MODIFY_
8、STATE,/所要求的最小访问权限FALSE,/不是可继承的句柄g_szContinueEvent) ;/ 事件名称if (hEventContinue!=NULL) (:SetEvent(hEventContinue);std:coutnevent signalednl & :strcmp(argv1, nchild)=0) (/向父进程创建的事件发出信号:SignalParent (); ) else (/创建一个事件并等待子进程发出信号 :WaitForChild();:Sleep (1500);std:coutnParent released.std:endl; return 0;)步
9、骤4:单击Build菜单中的Compile 5-l.cpp命令,并单击“是按钮确认,系统对5-l.cpp 进行编译。步骤5:编译完成后,单击Build菜单中的Build 5-l.exe命令,建立5-l.exe可执行文件。 操作能否正常进行?如果不行,则可能的原因是什么?步骤6:在工具栏单击Execute Program (执行程序)按钮,执行5-l.exe程序。 请记录:运行结果(分行书写。如果运行不成功,则可能的原因是什么?): 请从进程并发的角度对结果进行分析,这个结果与你期望的一致吗?阅读和分析程序5-1,请回答: 程序中,创建一个事件使用了哪一个系统函数?创建时设置的初始信号状态是什么? 创建一个进程(子进程)使用了哪一个系统函数? 从步骤6的输出结果,对照分析5-1程序,可以看出程序运行的流程吗?请简单描述: 这是一个简单的进程同步的例子。请简述进程同步在这个程序中是如何实现的。3 .实验总结4 .教师实验评价116操作系统原理(第2版)