ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:293.90KB ,
资源ID:24760041      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24760041.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验进程的同步heu.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统实验进程的同步heu.docx

1、操作系统实验进程的同步heu操作系统实 验 报 告课程名称操作系统实验课程编号0906553实验项目名称进程的同步学号年级姓名专业学生所在学院指导教师实验室名称地点 哈尔滨工程大学计算机科学与技术学院第六讲 进程的同步一、实验概述1. 实验名称进程的同步2. 实验目的(1)使用 EOS 的信号量编程解决生产者消费者问题,理解进程同步的意义。(2)调试跟踪 EOS 的信号量的工作过程,理解进程同步的原理。(3)修改 EOS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3. 实验类型验证型实验,设计性实验4. 实验内容(1)准备实验(2)使用 EOS 的信号量解决生

2、产者消费者问题(3)调试 EOS 信号量的工作过程1)创建信号量 2)等待释放信号量 3)等待信号量(不阻塞) 4)释放信号量(不唤醒) 5) 等待信号量(阻塞) 6) 释放信号量(唤醒)(4)修改 EOS 的信号量算法 二、实验环境操作系统集成实验环境OS Lab三、实验过程1. 设计思路和流程图2. 算法实现3. 需要解决的问题及解答(1). P143生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢生产者和消费者是怎样使用同步对象来实现该同步过程的呢答:此时生产了0-13号14个产品,消费了0-3号4个产品,缓冲区都

3、占满了。只有缓冲区有空闲生产者才能生产东西,有权向里面放东西。所以它必须等到消费者,取走产品,有空闲缓冲区时,才继续生产14号产品。(2). 修改EOS的信号量算法(只看一次消费1个产品的,一次消费2个产品的可以写到实验报告中)答:见三,四部分(3). 思考在ps/文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作 答:原子操作要求一旦开始就要运行到结束,不能有中断。在执行等待信号量和释放信号量的时候,不允许cpu响应外部中断,所以使用原子操作。(4). 绘制ps/文件内PsWaitForSemaphore和PsReleaseSema

4、phore函数的流程图。PsWaitForSemaphorePs Release Semaphore原子操作前关中断4. 主要数据结构、实现代码及其说明1)修改PsWaitForSemaphore函数if (Semaphore-Count0) Semaphore-Count-; flag=STATUS_SUCCESS; 源程序并附上注释#include VOIDPsInitializeSemaphore( IN PSEMAPHORE Semaphore, IN LONG InitialCount, IN LONG MaximumCount )/*+功能描述: 初始化信号量结构体。参数: Sem

5、aphore - 要初始化的信号量结构体指针。 InitialCount - 信号量的初始值,不能小于 0 且不能大于 MaximumCount。 MaximumCount - 信号量的最大值,必须大于 0。返回值: 无。-*/ ASSERT(InitialCount = 0 & InitialCount 0); Semaphore-Count = InitialCount; Semaphore-MaximumCount = MaximumCount; ListInitializeHead(&Semaphore-WaitListHead);STATUSPsWaitForSemaphore( I

6、N PSEMAPHORE Semaphore, IN INT Milliseconds, IN STATUS i )/*+功能描述: 信号量的 Wait 操作(P 操作)。参数: Semaphore - Wait 操作的信号量对象。 Milliseconds - 等待超时上限,单位毫秒。返回值: STATUS_SUCCESS。 当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回 STATUS_TIMEOUT。-*/ BOOL IntState; ASSERT(KeGetIntNesting() = 0); 程序运行时的初值和运行结果(1)准备实验1)启动 OS Lab。 2)新建一个

7、 EOS Kernel 项目。 3)生成 EOS Kernel 项目,从而在该项目文件夹中生成 SDK 文件夹。 4)新建一个 EOS 应用程序项目。 5)使用在第 3 步生成的 SDK 文件夹覆盖 EOS 应用程序项目文件夹中的 SDK 文件夹。 (2)使用EOS的信号量解决生产者消费者问题1)使用 文件中的源代码,替换之前创建的 EOS 应用程序项目中 文件内的源代码。 2)按 F7 生成修改后的 EOS 应用程序项目。 3)按 F5 启动调试。OS Lab 会首先弹出一个调试异常对话框。 4)在调试异常对话框中选择“否”,继续执行。 5)立即激活虚拟机窗口查看生产者消费者同步执行的过程。

8、 6)待应用程序执行完毕后,结束此次调试。 (3)调试EOS信号量的工作过程1)创建信号量按 F5 启动调试 EOS 应用项目。OS Lab 会首先弹出一个调试异常对话框。在调试异常对话框中选择“是”,调试会中断。在 main 函数中创建 Empty 信号量的代码行(第 77 行) EmptySemaphoreHandle = CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一个断点。按 F5 继续调试,到此断点处中断。按 F11 调 试进入 CreateSemaphore 函数。 可以看 到此 API 函 数只是 调用了 EOS 内核中

9、的PsCreateSemaphoreObject 函数来创建信号量对象。按 F11 调试进入 文件中的 PsCreateSemaphoreObject 函数。在此函数中,会在 EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在 PsInitializeSemaphore 函数中完成的。在 文件的顶部查找到 PsInitializeSemaphore 函数的定义(第 19 行),在此函数的第一行(第 39 行)代码处添加一个断点。 按 F5 继续调试,到断点处中断。观察 PsInitializeSemaphore 函数中用来初始化信号量结构体成员的值

10、,应该和传入 CreateSemaphore 函数的参数值是一致的。 按 F10 单步调试 PsInitializeSemaphore 函数执行的过程,查看信号量结构体被初始化的过程。打开“调用堆栈”窗口,查看函数的调用层次。 2)等待信号量(不阻塞)删除所有的断点(防止有些断点影响后面的调试)。 在 文件的 Producer 函数中,等待 Empty 信号量的代码行(第 144 行) WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。 按 F5 继续调试,到断点处中断。 WaitForSingleObject 函数最终会调

11、用内核中的 PsWaitForSemaphore 函数完成等待操作。所以,在 文件中 PsWaitForSemaphore 函数的第一行(第 68 行)添加一个断点。 按 F5 继续调试,到断点处中断。 按 F10 单步调试,直到完成 PsWaitForSemaphore 函数中的所有操作。可以看到此次执行并没有进行等待,只是将 Empty 信号量的计数减少了 1(由 10 变为了 9)就返回了。 3)释放信号量(不唤醒)删除所有的断点(防止有些断点影响后面的调试)。 在 文件的 Producer 函数中,释放 Full 信号量的代码行(第 152 行) ReleaseSemaphore(Fu

12、llSemaphoreHandle, 1, NULL); 添加一个断点。 按 F5 继续调试,到断点处中断。 按 F11 调试进入 ReleaseSemaphore 函数。 继续按 F11 调试进入 PsReleaseSemaphoreObject 函数。 先使用 F10 单步调试,当黄色箭头指向第 269 行时使用 F11 单步调试,进入 PsReleaseSemaphore函数。 按 F10 单步调试,直到完成 PsReleaseSemaphore 函数中的所有操作。可以看到此次执行没有唤醒其它线程(因为此时没有线程在 Full 信号量上被阻塞),只是将 Full 信号量的计数增加了 1(

13、由 0 变为了 1)。 4)等待信号量(阻塞)结束之前的调试。 删除所有的断点。 按 F5 重新启动调试。OS Lab 会首先弹出一个调试异常对话框。 在调试异常对话框中选择“是”,调试会中断。 在 文件中的 PsWaitForSemaphore 函数的 PspWait(&Semaphore-WaitListHead, INFINITE); 代码行(第 78 行)添加一个断点。 按 F5 继续调试,并立即激活虚拟机窗口查看输出。开始时生产者、消费者都不会被信号量阻塞,同步执行一段时间后才在断点处中断。 中断后,查看“调用堆栈”窗口,有 Producer 函数对应的堆栈帧,说明此次调用是从生产者

14、线程函数进入的。 在“调用堆栈”窗口中双击 Producer 函数所在的堆栈帧,绿色箭头指向等待 Empty 信号量的代码行,查看 Producer 函数中变量 i 的值为 14,表示生产者线程正在尝试生产 14 号产品。 在“ 调用堆 栈” 窗口中 双击 PsWaitForSemaphore 函数的 堆栈 帧,查 看 Empty 信号 量计 数(Semaphore-Count)的值为-1,所以会调用 PspWait 函数将生产者线程放入 Empty 信号量的等待队列中进行等待(让出 CPU)。 激活虚拟机窗口查看输出的结果。生产了从 0 到 13 的 14 个产品,但是只消费了从 0 到 3

15、 的 4 个产品,所以缓冲池中的 10 个缓冲区就都被占用了,这与之前调试的结果是一致的。 5)释放信号量(唤醒)删除所有断点。 在 文件的 Consumer 函数中,释放 Empty 信号量的代码行(第 180 行) ReleaseSemaphore(EmptySemaphoreHandle, 1, NULL); 添加一个断点。 按 F5 继续调试,到断点处中断。 查看 Consumer 函数中变量 i 的值为 4,说明已经消费了 4 号产品。 按照 中的方法使用 F10 和 F11 调试进入 PsReleaseSemaphore 函数。 查看 PsReleaseSemaphore 函数中

16、Empty 信号量计数(Semaphore-Count)的值为-1,和生产者线程被阻塞时的值是一致的。 按 F10 单步调试 PsReleaseSemaphore 函数,直到在代码行(第 132 行) PspWakeThread(&Semaphore-WaitListHead, STATUS_SUCCESS); 处中断。此时 Empty 信号量计数的值已经由-1 增加为了 0,需要调用 PspWakeThread 函数唤醒阻塞在 Empty 信号量等待队列中的生产者线程(放入就绪队列中),然后调用 PspSchedule 函数执行调度,这样生产者线程就得以继续执行。6)验证生产者线程被唤醒后,

17、是从之前被阻塞时的状态继续执行的: 在 文件中 PsWaitForSemaphore 函数的最后一行(第 83 行)代码处添加一个断点。 按 F5 继续调试,在断点处中断。 查看 PsWaitForSemaphore 函数中 Empty 信号量计数(Semaphore-Count)的值为 0,和生产者线程被唤醒时的值是一致的。 在“调用堆栈”窗口中可以看到是由 Producer 函数进入的。激活 Producer 函数的堆栈帧,查看Producer 函数中变量 i 的值为 14,表明之前被阻塞的、正在尝试生产 14 号产品的生产者线程已经从 PspWait 函数返回并继续执行了。 结束此次调试

18、。 (4)修改 EOS 的信号量算法1)修改 PsWaitForSemaphore 函数2)修改 PsReleaseSemaphore 函数3)使用修改完毕的 EOS Kernel 项目生成完全版本的 SDK 文件夹,并覆盖之前的生产者消费者应用程序项目的 SDK 文件夹。 4)按 F5 调试执行原有的生产者消费者应用程序项目,结果必须仍然与图 13-2 一致。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤 1。 5)将 Producer 函数中等待 Empty 信号量的代码行 WaitForSingleObject(EmptySemaphoreHandle, INF

19、INITE); 替换为 while(WAIT_TIMEOUT = WaitForSingleObject(EmptySemaphoreHandle, 300) printf(Producer wait for empty semaphore timeoutn); 6)将 Consumer 函数中等待 Full 信号量的代码行 WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替换为 while(WAIT_TIMEOUT = WaitForSingleObject(FullSemaphoreHandle, 300) printf(Consum

20、er wait for full semaphore timeoutn); 7)启动调试新的生产者消费者项目,查看在虚拟机中输出的结果,验证信号量超时等待功能是否能够正常执行。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤 1。 8)如果超时等待功能已经能够正常执行,可以考虑将消费者线程修改为一次消费两个产品,来测试ReleaseCount 参数是否能够正常使用。使用实验文件夹中 文件中的 Consumer 函数替换原有的Consumer函数9)一次性消费一个产品10)一次性消费两个产品四、实验体会这次实验里我增强了对于进程同步算法的理解,对书上的消费者生产者模型有了更深的认识,并且留下了新的印象。这次实验提高了我的编程能力和各方面动手能力,让我感受到进程相关内容编程的风格和方法。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1