2022年操作系统实验四进程的同步 .pdf
《2022年操作系统实验四进程的同步 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统实验四进程的同步 .pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作系统实验报告课程名称操作系统实验课程编号0920311 实验项目名称操作系统的启动学号年级2011级姓名专业软件工程学生所在学院软件学院指导教师王红滨实验室名称地点软件工程实验室21B282 哈尔滨工程大学软件学院名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 24 页 - - - - - - - - - 1 第六讲进程的同步一、实验概述1. 实验名称实验系统的启动2. 实验目的1).使用 EOS 的信号量编程解决生产者消费者问题,理解进程同步的意义。2).调试跟踪E
2、OS 的信号量的工作过程,理解进程同步的原理。3).修改 EOS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3. 实验类型(验证、设计)验证4. 实验内容1).准备实验2).使用 EOS 的信号量解决生产者消费者问题3).调试 EOS 信号量的工作过程创建信号量等待释放信号量等待信号量(不阻塞)释放信号量(不唤醒)等待信号量(阻塞)释放信号量(唤醒)4).修改 EOS 的信号量算法在目前 EOS Kernel 项目的 ps/semaphore.c文件中, PsWaitForSemaphore函 数 的Milliseconds 参 数 只 能 是INFINITE
3、 , PsReleaseSemaphore 函 数 的ReleaseCount 参数只能是1。现在要求同时修改PsWaitForSemaphore函数和PsReleaseSemaphore 函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。二、实验环境操作系统: windows xp 编译环境: OS Lab 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 24 页 - - - - - - - - - 2 三、实验过程1. 设计思
4、路和流程图图 3-1.整体试验流程图准备实验使用 EOS 的信号量解决生产者消费者问题调试EOS 信号量的工作过程创建信号量释 放 信号量(唤醒)等 待 信号量(阻塞)释 放 信号量(不唤醒)等 待 信号量(不阻塞)等 待 释放 信 号量修改 EOS 的信号量算法结束实验名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 24 页 - - - - - - - - - 3 图 3-2.Main 函数流程图、生产者消费、消费者流程图main 函数开始创建 Mutex 对象创建 E
5、mpty 信号量对象创建 Full 信号量对象创建生产者线程创建消费者线程等待生产者线程和消费者线程结束关闭句柄main 函数结束Producer函数开始生产完毕?等待 Empty 信号量等待 Mutex 对象生产一个产品,占用一个缓冲区循环向后移动缓冲区指针释放 Mutex 对象释放 Full 信号量对等待 500毫秒Producer函 数结束Consumer 函数开始消 费完 毕等待 Full 信号量对象等待 Mutex 对象消费一个产品,清空一个缓冲区循环向后移动缓释放 Mutex 对象释放 Empty 信号量对象前 10个 产等待 2000 毫秒等待100毫秒Consumer函数结束名
6、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 24 页 - - - - - - - - - 4 2. 需要解决的问题及解答(1). 思 考 在ps/semaphore.c 文 件 内 的PsWaitForSemaphore 和PsReleaseSemaphore 函数中,为什么要使用原子操作?答: 在执行等待信号量和释放信号量的时候,是不允许 cpu响应外部中断的,如果此时 cpu响应了外部中断,会产生不可预料的结果, 无法正常完成原子操作。(2). 绘制 ps/sema
7、phore.c文件内 PsWaitForSemaphore 和 PsReleaseSemaphore函数的流程图。1).PsWaitForSemaphore 函数流程图。2). PsReleaseSemaphore 函数流程图开始1.原子操作前关中断3.If Wait 操作的信号量大于0 4.If Wait 操作的信号量大于0 执行 P操作,否则返回执行3 5.P 操作结束2.开始原子操作P 操作结束开始1.原子操作前关中断名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共
8、24 页 - - - - - - - - - 5 (3). P143生产者在生产了 13 号产品后本来要继续生产14 号产品,可此时生产者为什么必须等待消费者消费了4 号产品后,才能生产14 号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?答:这是因为临界资源的限制。缓冲区只有十个空间,现在消费比生产慢,此时分别装了 4 到 13 号产品,而消费者只消费了3 个。此时装入产品与产品的存储空间成为直接相互制约关系, 再消费者消费了下一个产品之前生产者不能继续装入。因此,可解释生产者为什么必须等待消费者消费了4 号产品后才能生产14 号产品。(4). 根据本实验 3.3.2 节中设
9、置断点和调试的方法,自己设计一个类似的调试方案来验证消费者线程在消费24 号产品时会被阻塞,直到生产者线程生产了24 号产品后,消费者线程才被唤醒并继续执行的过程。2.开始原子操作V 操作3.if P 和 V 操作的信号量之和大于缓冲队列长度4.如果 3 成立返回“信号数目量超出范围”函数结束,否则记录当前信号量的值5.执行一次信号量的释放操作。使信号量的值增加 1。 如果 P 操作控制的信号量不大于零唤醒等待进程,返回,唤醒成功,函数结束。6.if 被阻塞进程的数量小于要释放的信号量的个数,唤醒等待队列中的进程,直到等待队列为空。返回,唤醒成功,函数结束。7.if 被阻塞的线程数量大于等于R
10、eleaseCount,则循环结束后,有ReleaseCount 个线程会被唤醒,而且信号量计数的值仍然为0;如果被阻塞的线程数量小于ReleaseCount,则循环结束后,所有被阻塞的线程都会被唤醒,并且信号量的计数值=ReleaseCount之前被阻塞线程的数量+之前信号量的计数值。函数结束结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 24 页 - - - - - - - - - 6 答:可以按照下面的步骤进行调试(1) 删除所有的断点。(2) 按 F5启动调试
11、。 OS Lab会首先弹出一个调试异常对话框。(3) 在调试异常对话框中选择 “ 是” ,调试会中断。(4) 在Consumer 函 数 中 等 待Full信 号 量 的 代 码 行 ( 第 173 行 )WaitForSingleObject(FullSemaphoreHandle, INFINITE); 添加一个断点。(5) 在“ 断点” 窗口(按 Alt+F9 打开)中此断点的名称上点击右键。(6) 在弹出的快捷菜单中选择 “ 条件” 。(7) 在“ 断点条件 ” 对话框(按 F1 获得帮助) 的表达式编辑框中, 输入表达式“i = 24”。(8) 点击“ 断点条件 ” 对话框中的 “
12、确定” 按钮。(9) 按 F5继续调试。只有当消费者线程尝试消费24 号产品时才会在该条件断点处中断。3. 主要数据结构、实现代码及其说明1).对 PsWaitForSemaphore 函数的修改:PsWaitForSemaphore( IN PSEMAPHORE Semaphore, IN ULONG Milliseconds ) /*+ 功能描述:信号量的Wait 操作( P 操作) 。参数:Semaphore - Wait 操作的信号量对象。Milliseconds - 等待超时上限,单位毫秒。返回值:STATUS_SUCCESS 。当你修改信号量使之支持超时唤醒功能后,如果等待超时,应
13、该返回名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 24 页 - - - - - - - - - 7 STATUS_TIMEOUT 。-*/ BOOL IntState; STATUS a; ASSERT(KeGetIntNesting() = 0); / 中断环境下不能调用此函数。IntState = KeEnableInterrupts(FALSE); / 开始原子操作,禁止中断。/ / 目前仅实现了标准记录型信号量, 不支持超时唤醒功能, 所以 PspWait 函
14、数/ 的第二个参数的值只能是INFINITE 。/ if (Semaphore-Count0) Semaphore-Count-; a=STATUS_SUCCESS; else if(Semaphore-Count=0) a=PspWait(&Semaphore-WaitListHead, Milliseconds); KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。return a; 对PsReleaseSemaphore函数的修改:PsReleaseSemaphore( IN PSEMAPHORE Semaphore, IN LONG Release
15、Count, OUT PLONG PreviousCount ) /*+ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 24 页 - - - - - - - - - 8 功能描述:信号量的 Signal 操作( V 操作) 。参数:Semaphore - Wait 操作的信号量对象。ReleaseCount - 信号量计数增加的数量。当前只能为1。当你修改信号量使之支持超时唤醒功能后,此参数的值能够大于等于1。PreviousCount - 返回信号量计数在增加之前的值
16、。返回值:如果成功释放信号量,返回STATUS_SUCCESS 。-*/ STATUS Status; BOOL IntState; / int bobo; IntState = KeEnableInterrupts(FALSE); / 开始原子操作,禁止中断。if (Semaphore-Count + ReleaseCount Semaphore-MaximumCount) Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; else / / 记录当前的信号量的值。/ if (NULL != PreviousCount) *PreviousCount = Se
17、maphore-Count; / / 目前仅实现了标准记录型信号量,每执行一次信号量的释放操作/ 只能使信号量的值增加1。/ if(ReleaseCount0&!(ListIsEmpty(&Semaphore-WaitListHead);ReleaseCount-名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 24 页 - - - - - - - - - 9 =1) PspWakeThread(&Semaphore-WaitListHead,STATUS_SUCCESS)
18、; Semaphore-Count+=ReleaseCount; Status = STATUS_SUCCESS; KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。return Status; 4. 源程序并附上注释#include psp.h VOID PsInitializeSemaphore( IN PSEMAPHORE Semaphore, IN LONG InitialCount, IN LONG MaximumCount ) /*+ 功能描述:初始化信号量结构体。参数:Semaphore - 要初始化的信号量结构体指针。InitialCoun
19、t - 信号量的初始值,不能小于0 且不能大于MaximumCount。MaximumCount - 信号量的最大值,必须大于0。返回值:无。-*/ ASSERT(InitialCount = 0 & InitialCount 0); Semaphore-Count = InitialCount; Semaphore-MaximumCount = MaximumCount; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 24 页 - - - - - - - - - 1
20、0 ListInitializeHead(&Semaphore-WaitListHead); STATUS PsWaitForSemaphore( IN PSEMAPHORE Semaphore, IN ULONG Milliseconds ) /*+ 功能描述:信号量的 Wait 操作(P 操作) 。参数:Semaphore - Wait 操作的信号量对象。Milliseconds - 等待超时上限,单位毫秒。返回值:STATUS_SUCCESS 。当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回STATUS_TIMEOUT 。-*/ BOOL IntState; STATUS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年操作系统实验四进程的同步 2022 操作系统 实验 进程 同步
限制150内