下载此文档

操作系统实验二并发与调度.pdf


文档分类:IT计算机 | 页数:约11页 举报非法文档有奖
1/11
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/11 下载此文档
文档列表 文档介绍
该【操作系统实验二并发与调度 】是由【青山代下】上传分享,文档一共【11】页,该文档可以免费在线阅读,需要了解更多关于【操作系统实验二并发与调度 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..一、实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对WindowsServer2016线程同步的理解。1)回顾系统进程、线程的有关概念,加深对WindowsServer2016线程的理解;2)了解事件和互斥体对象;3)通过分析实验程序,了解管理事件对象的API;4)了解在进程中如何使用事件对象;5)了解在进程中如何使用互斥体对象;6)了解父进程创建子进程的程序设计方法。二、工具/;;++++编译器。三、实验环境操作系统:WindowsServer2016(虚拟机)编程语言:C++集成开发环境:VisualStudio2019四、-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent()API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent()API打开事件对象,调用SetEvent()API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。步骤1:登录进入WindowsServer2016。步骤2:在“开始”菜单中单击“程序”-“MicrosoftVisualStudio2019”,进入VisualStudio2019的窗口。:..步骤3:在VisualStudio2019窗口的工具栏中单击“文件”按钮,在解决方案OSLab中新建一个项目,命名为Lab2_1,并在源文件中添加新建项,,将实验指导书中的代码拷贝至该文件中。步骤4:单击“生成”菜单中的“编译”命令,。步骤5:编译完成后,单击“生成”菜单中的“生成”命令,。操作能否正常进行?如果不行,则可能的原因是什么?由于程序代码是由pdf文件复制出来的,调整缩进与分号等规范后,进一步调整了安全性,如使用sprint_s等,并使用了命名空间std,减少代码冗余,调整过后,程序代码可以调通。步骤6:在解决方案资源管理器中右键当前项目,并设置为启动项目。在工具栏单击“调试”-“开始执行(不调试)”按钮,。运行结果(分行书写。如果运行不成功,则可能的原因是什么?):图2-1程序Lab2_1运行结果1)eventcreated2)childcreated3))childprocessbegining......5)eventsignaled6)parentreceivedtheeventsignalingfromchild7)?(从进程并发的角度对结果进行分析)结果与期望一致。:..子进程向事件发出信号,父进程终止。两个进程在发出信号之后几乎立即终止。阅读和分析程序Lab2_1,请回答:1)程序中,创建一个事件使用了哪一个系统函数?创建时设置的初始信号状态是什么?()函数;。2)创建一个进程(子进程)使用了哪一个系统函数?创建一个(子)进程使用了CreateProcess()函数。3)从步骤6的输出结果,对照分析Lab2_1程序,可以看出程序运行的流程吗?请简单描述:如图2-2:开始创建事件创建子进程父进程等待子进程运行子进程发出信号事件收到信号父进程停止结束图2--ountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互:..斥体所需的资源(因而也就是共享资源)。步骤7:在VisualStudio2019窗口的工具栏中单击“文件”按钮,在解决方案OSLab中新建一个项目,命名为Lab2_2,并在源文件中添加新建项,,将实验指导书中的代码拷贝至该文件中。步骤8:单击“生成”菜单中的“编译”命令,。步骤9:编译完成后,单击“生成”菜单中的“生成”命令,。操作能否正常进行?如果不行,则可能的原因是什么?由于程序代码是由pdf文件复制出来的,调整缩进与分号等规范后,使用了命名空间std,减少代码冗余,调整过后,程序代码可以调通。步骤10:在解决方案资源管理器中右键当前项目,并设置为启动项目。在工具栏单击“调试”-“开始执行(不调试)”按钮,。分析程序Lab2_2的运行结果,可以看到线程(加和减线程)的交替执行(因为Sleep()API允许Windows切换线程)。在每次运行之后,数值应该返回初始值(0),因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。1)请描述运行结果(如果运行不成功,则可能的原因是什么?):thread:13524value:ess:50thread:15952value:ess:49thread:13524value:ess:48thread:15952value:ess:47thread:……value:…access:…thread:……value:…access:…thread:15952value:ess:3thread:13524value:ess:2thread:15952value:ess:1thread:13524value:ess:0具体结果如图2-3所示::..图2-3程序Lab3_2运行结果2)根据运行输出结果,对照分析Lab2_2程序,可以看出程序运行的流程吗?请简单描述:ountUpDown来保护能被同时访问的共享资源。该程序首先创建了两个进程来访问共享值,并创建了互斥体来访问数值,随后两个进程依次轮流访问数值(访问后改变并释放)。五、实验结果与分析实验结果与分析见实验步骤与实验过程。六、实验心得体会通过本次实验,我加深了对计算机线程的理解,并深入理解了互斥体等相关概念。通过分析实验程序,了解管理事件对象的API;通过对事件和互斥体对象的编程,加深了对WindowsServer2016线程同步的理解。:..附录程序清单清单2-11.//event项目2.#include<>3.#include<iostream>;.//以下是句柄事件。=;.//本方法只是创建了一个进程的副本,以子进程模式(由命令行指定)()11.{12.//[MAX_PATH];14.::GetModuleFileName(NULL,szFilename,MAX_PATH);.//格式化用于子进程的命令行,[MAX_PATH];18.::sprintf_s(szCmdLine,,szFilename);19.//;21.::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));=sizeof(si);//必须是本结构的大小23.//;25.//=::CreateProcess(,//,//,//,//,//,//,//,//当前目录35.&si,//启动信息结构36.&pi);//.//(bCreateOK){40.::CloseHandle();41.::CloseHandle();42.}:..(bCreateOK);44.}.//下面的方法创建一个事件和一个子进程,()48.{49.//createaneweventobjectforthechildprocess50.//=::CreateEvent(,//缺省的安全性,,//,//);//(hEventContinue!=NULL)58.{<<<<endl;60.//(::CreateChild())62.{<<<<endl;64.//等待,<<<<endl;66.::WaitForSingleObject(hEventContinue,INFINITE);67.::Sleep(1500);//<<<<endl;69.}.//清除句柄72.::CloseHandle(hEventContinue);=INVALID_HANDLE_VALUE;74.}75.}.//以下方法在子进程模式下被调用,()79.{80.//<<<<endl;=::OpenEvent(,//,//);//(hEventContinue!=NULL)88.{:..89.::SetEvent(hEventContinue);<<<<endl;91.}.//清除句柄94.::CloseHandle(hEventContinue);=INVALID_HANDLE_VALUE;96.}(intargc,char*argv[])99.{100.//(argc>1&&::strcmp(argv[1],)==0)102.{103.//向父进程创建的事件发出信号104.::SignalParent();105.}else{106.//创建一个事件并等待子进程发出信号107.::WaitForChild();108.::Sleep(1500);<<<<endl;110.};112.}清单2-21.//mutex项目2.#include<>3.#include<iostream>;.//.{:10.//创建者创建两个线程来访问共享值ountUpDown(esses):m_hThreadInc(INVALID_HANDLE_VALUE),m_hThreadDec(INVALID_HANDLE_VALUE),(INVALID_HANDLE_VALUE),m_nValue(0),ess(esses)13.{14.//=::CreateMutex(,//,//初始时拥有,);//匿名的:..=::CreateThread(,//,//,//<LPVOID>(this),//,//);//=::CreateThread(,//,//,//<LPVOID>(this),//,//);//.//允许另一线程获得互斥体37.::ReleaseMutex(m_hMutexValue);38.}.//()42.{43.::CloseHandle(m_hThreadInc);44.::CloseHandle(m_hThreadDec);45.::CloseHandle(m_hMutexValue);46.}.//简单的等待方法,()50.{51.//(m_hThreadInc!=INVALID_HANDLE_VALUE&&!=INVALID_HANDLE_VALUE)54.{55.//等待两者完成(顺序并不重要)56.::WaitForSingleObject(m_hThreadInc,INFINITE);57.::WaitForSingleObject(m_hThreadDec,INFINITE);58.}59.}:.//(intnStep):..{66.//67.(ess>0)68.{69.//等待访问数值70.::WaitForSingleObject(m_hMutexValue,INFINITE);71.//+=nStep;<<<<::GetCurrentThreadId()74.<<<<m_nValue75.<<<<ess<<endl;76.//发出访问信号并允许线程切换77.--ess;78.::Sleep(1000);//使显示速度放慢79.//释放对数值的访问80.::ReleaseMutex(m_hMutexValue);81.}82.}(LPVOIDlpParam)85.{86.//将参数解释为'this'指针ountUpDown*pThis=*>(lpParam);89.//->DoCount(+1);(0);92.}(LPVOIDlpParam)95.{96.//将参数解释为'this'指针ountUpDown*pThis=*>(lpParam);99.//->DoCount(-1);(0);102.}:;;;;;110.};:..()113.{ountUpDownud(50);();;117.}

操作系统实验二并发与调度 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数11
  • 收藏数0 收藏
  • 顶次数0
  • 上传人青山代下
  • 文件大小987 KB
  • 时间2024-03-25