2022年2022年进程的同步[借 .pdf

上传人:C****o 文档编号:32514634 上传时间:2022-08-09 格式:PDF 页数:12 大小:468.43KB
返回 下载 相关 举报
2022年2022年进程的同步[借 .pdf_第1页
第1页 / 共12页
2022年2022年进程的同步[借 .pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《2022年2022年进程的同步[借 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年进程的同步[借 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、操作系统实验报告课程名称操作系统实验实验项目名称进程的同步学号2009142212 班级20100614 姓名刘欣卓专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师初妍实验室名称地点21#428 哈尔滨工程大学计算机科学与技术学院名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 1 一、实验概述1. 实验名称第三讲进程的同步2. 实验目的使用 EOS的信号量,编程解决生产者消费者问题,理解进程同步的意义。调试跟踪 E

2、OS信号量的工作过程,理解进程同步的原理。修改 EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3. 实验类型验证性实验、设计性试验4. 实验内容( 1)准备实验启动 OS Lab。新建一个 EOS Kernel 项目。生成 EOS Kernel 项目,从而在该项目文件夹中生成SDK文件夹。新建一个 EOS 应用程序项目。使用在第 3步生成的 SDK 文件夹覆盖 EOS 应用程序项目文件夹中的SDK 文件夹。( 2)生产者消费者同步执行的过程使用 pc.c 文件中的源代码,替换之前创建的EOS 应用程序项目中EOSApp.c文件内的源代码。按F7生成修改后的

3、EOS 应用程序项目。 按F5启动调试。 OS Lab会首先弹出一个调试异常对话框。在调试异常对话框中选择“否”,继续执行。立即激活虚拟机窗口查看生产者消费者同步执行的过程。待应用程序执行完毕后,结束此次调试。( 3)调试 EOS 信号量的工作过程I 创建信号量按 F5 启动调试EOS 应用项目。 OS Lab 会首先弹出一个调试异常对话框。在调试异常对话框中 选择 “ 是 ” ,调 试会 中断 。在main 函 数中 创建Empty信 号量 的代 码 行(第77 行)EmptySemaphoreHandle = CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE

4、, NULL); 添加一个断点。按F5 继续调试,到此断点处中断。按 F11 调试进入CreateSemaphore 函数。可以看到此API 函数只是调用了EOS 内核中的PsCreateSemaphoreObject 函数来创建信号量对象。按F11 调试进入 semaphore.c 文件中的PsCreateSemaphoreObject 函数。在此函数中,会在EOS 内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -

5、 - - - - 第 2 页,共 12 页 - - - - - - - - - 2 PsInitializeSemaphore 函数中完成的。在semaphore.c 文件的顶部查找到PsInitializeSemaphore函数的定义(第19 行) ,在此函数的第一行(第39 行)代码处添加一个断点。按F5 继续调试,到断点处中断。观察PsInitializeSemaphore 函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。按 F10 单步调试 PsInitializeSemaphore 函数执行的过程,查看信号量结构体被初始化的过程。打

6、开“ 调用堆栈 ” 窗口,查看函数的调用层次。II 等待、释放信号量1、等待信号量(不阻塞)删除所有的断点。在eosapp.c 文件的 Producer 函数中,等待 Empty信号量的代码行(第144行) WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。按F5继续调试,到断点处中断。 WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore 函数完成等待操作。所以,在semaphore.c 文件中 PsWaitForSemaphore 函数的第一行(第68行)添加一个断点。按 F

7、5继续调试,到断点处中断。按F10单步调试,直到完成PsWaitForSemaphore 函数中的所有操作。2、释放信号量(不唤醒)删除所有的断点。在eosapp.c 文件的 Producer 函数中, 释放 Full信号量的代码行 (第 152行)ReleaseSemaphore(FullSemaphoreHandle, 1, NULL); 添加一个断点。按F5继续调试,到断点处中断。 按F11调试进入 ReleaseSemaphore 函数。 继续按 F11调试进入 PsReleaseSemaphoreObject函数。先使用F10单步调试,当黄色箭头指向第269行时使用 F11单步调试,

8、进入PsReleaseSemaphore 函数。按F10单步调试,直到完成PsReleaseSemaphore 函数中的所有操作。3、等待信号量(阻塞)结束之前的调试。删除所有的断点。按F5重新启动调试。OS Lab 会首先弹出一个调试异常对话框。在调试异常对话框中选择“是”,调试会中断。在semaphore.c 文件中的PsWaitForSemaphore 函数的 PspWait(&Semaphore-WaitListHead, INFINITE); 代码行(第 78行)添加一个断点。按F5继续调试,并立即激活虚拟机窗口查看输出。开始时生产者、消费者都不会被信号量阻塞,同步执行一段时间后才在

9、断点处中断。中断后,查看“调用堆栈”窗口,有Producer 函数对应的堆栈帧,说明此次调用是从生产者线程函数进入的。在“调用堆栈”窗口中双击 Producer 函数所在的堆栈帧,绿色箭头指向等待Empty信号量的代码行,查看Producer 函数中变量 i 的值为 14,表示生产者线程正在尝试生产14号产品。在“调用堆栈”窗口中双击PsWaitForSemaphore 函数的堆栈帧,查看Empty信号量计数( Semaphore-Count )的值为 -1 ,所以会调用 PspWait 函数将生产者线程放入Empty信号量的等待队列中进行等待(让出CPU )。激活虚拟机窗口查看输出的结果。生

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

11、ReleaseSemaphore 函数中名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 3 Empty信号量计数( Semaphore-Count )的值为 -1 ,和生产者线程被阻塞时的值是一致的。按F10单步调试 PsReleaseSemaphore 函数,直到在代码行(第132行)PspWakeThread(&Semaphore-WaitListHead, STATUS_SUCCESS); 处中断。 此时 Empty信号

12、量计数的值已经由 -1 增加为了 0,需要调用 PspWakeThread函数唤醒阻塞在Empty 信号量等待队列中的生产者线程(放入就绪队列中),然后调用PspSchedule 函数执行调度,这样生产者线程就得以继续执行。III 验证生产者线程被唤醒后从被阻塞时的状态继续执行在semaphore.c 文件中 PsWaitForSemaphore 函数的最后一行 (第 83行)代码处添加一个断点。按F5继续调试,在断点处中断。查看PsWaitForSemaphore 函数中 Empty信号量计数(Semaphore-Count )的值为 0,和生产者线程被唤醒时的值是一致的。在“调用堆栈”窗口

13、中可以看到是由Producer 函数进入的。激活Producer 函数的堆栈帧,查看Producer 函数中变量 i 的值为 14,表明之前被阻塞的、正在尝试生产14号产品的生产者线程已经从PspWait 函数返回并继续执行了。结束此次调试。( 4)修改 EOS 的信号量算法修改 PsWaitForSemaphore 函数先用计数值和 0比较,当计数值大于0时,将计数值减1后直接返回成功;当计数值等于0时,调用 PspWait 函数阻塞线程的执行(将参数 Milliseconds做为 PspWait 函数的第二个参数,并使用PspWait 函数的返回值做为返回值)。在函数开始定义一个STATU

14、S 类型的变量,用来保存不同情况下的返回值,并在函数最后返回此变量的值。绝不能在原子操作的中途返回!修改 PsReleaseSemaphore函数如果被阻塞的线程数量大于等于ReleaseCount ,则循环结束后,有ReleaseCount 个线程会被唤醒,而且信号量计数的值仍然为0; 如果被阻塞的线程数量(可以为0)小于 ReleaseCount ,则循环结束后, 所有被阻塞的线程都会被唤醒,并且信号量的计数值ReleaseCount 之前被阻塞线程的数量之前信号量的计数值。( 5)测试方法使用修改完毕的EOS Kernel 项目生成完全版本的SDK文件夹,并覆盖之前的生产者消费者应用程序

15、项目的SDK文件夹。按 F5调试执行原有的生产者消费者应用程序项目,结果必须仍然与图 13-2 一致。 如果有错误, 可以调试内核代码来查找错误,然后在内核项目中修改,将Producer函数中等待 Empty信号量的代码行WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT = WaitForSingleObject(EmptySemaphoreHandle,300) printf(Producer wait for empty semaphore timeoutn); 将Consumer函数中等待

16、 Full信号量的代码行WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替换为 while(WAIT_TIMEOUT=WaitForSingleObject(FullSemaphoreHandle,300) printf(Consumer wait for full semaphore timeoutn); 启动调试新的生产者消费者项名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - -

17、 - - 4 目,查看在虚拟机中输出的结果,验证信号量超时等待功能是否能够正常执行。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改。如果超时等待功能已经能够正常执行,可以考虑将消费者线程修改为一次消费两个产品,来测试 ReleaseCount 参数是否能够正常使用。使用实验文件夹中NewConsumer.c 文件中的 Consumer函数替换原有的Consumer 函数。二、实验环境Tevation OS Lab 1.0.3.9900 三、实验过程一、设计思路:1 启动 OS Lab 3.1 准备实验3.2 使用EOS 的信号量解决生产者消费者问题3.3 调试 EOS信号量的工作

18、过程3.3.1 创建信号量3.3.2 等待、释放信号量 3.3.2.1 等待信号量(不阻塞) 3.3.2.2 释放信号量(不唤醒) 3.3.2.3 等待信号量(阻塞) 3.3.2.4 释放信号量(唤醒)3.4 修改 EOS的信号量算法3.4.1 要求3.4.2 提示3.4.3 测试方法3.5 退出系统并保存oud 文件二、算法设计:本次实验要求修改信号量算法1、修改 PsWaitForSemaphore 函数PsWaitForSemaphore 函数中原有的代码段Semaphore-Count-; if (Semaphore-Count WaitListHead, INFINITE); 应被修

19、改为:先用计数值和0比较,当计数值大于0时,将计数值减1后直接返回成功;当计数值等于0时,调用 PspWait 函数阻塞线程的执行(将参数Milliseconds名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 5 做为 PspWait 函数的第二个参数,并使用 PspWait 函数的返回值做为返回值)。 在函数开始定义一个STATUS 类型的变量, 用来保存不同情况下的返回值,并在函数最返回此变量的值。绝不能在原子操作的中途返

20、回!在EOS Kernel 项目 ps/sched.c文件的第 190行查看 PspWait 函数的说明和源代码。按要求应修改为:if (Semaphore-Count 0) Semaphore-Count-; flag=STATUS_SUCCESS; / 信号量大于0,说明可以为线程分配资源else flag=PspWait(&Semaphore-WaitListHead, Milliseconds); / 信号量小于0,需要等待 KeEnableInterrupts(IntState); / 原子操作完成,恢复中断。return flag; 2、修改 PsReleaseSemaphore

21、函数编写一个使用 ReleaseCount 做为计数器的循环体,来替换 PsReleaseSemaphore函数中原有的代码段Semaphore-Count+; if (Semaphore-Count WaitListHead, STATUS_SUCCESS); 在循环体中完成下面的工作:1. 如果被阻塞的线程数量大于等于ReleaseCount , 则循环结束后, 有ReleaseCount个线程会被唤醒,而且信号量计数的值仍然为0;2. 如果被阻塞的线程数量(可以为0)小于 ReleaseCount ,则循环结束后,所有被阻塞的线程都会被唤醒,并且信号量的计数值ReleaseCount 之

22、前被阻塞线程的数量之前信号量的计数值。在EOS Kernel 项目 ps/sched.c文件的第 294行查看 PspWakeThread函数的说明和源代码。在循环的过程中可以使用宏定义函数ListIsEmpty判断信号量的等待队列是名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 6 否为空,例如 ListIsEmpty(&Semaphore-WaitListHead) 可以在 EOS Kernel 项目inc/rtl.h文件

23、的第 113行查看此宏定义的源代码。按要求应修改为:while (!ListIsEmpty(&Semaphore-WaitListHead)&(ReleaseCount) PspWakeThread(&Semaphore-WaitListHead, STATUS_SUCCESS); PspThreadSchedule(); ReleaseCount-; Semaphore-Count = Semaphore-Count + ReleaseCount; / 可能有线程被唤醒,执行线程调度。Status = STATUS_SUCCESS; KeEnableInterrupts(IntState);

24、 / 原子操作完成,恢复中断。return Status; 3、测试方法修改完毕后,可以按照下面的方法进行测试:1. 使用修改完毕的EOS Kernel 项目生成完全版本的SDK 文件夹, 并覆盖之前的生产者消费者应用程序项目的SDK 文件夹。2. 按F5调试执行原有的生产者消费者应用程序项目,结果必须仍然与图13-2 一致。如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤 1。3. 将Producer函数中等待Empty信号量的代码行WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 替换为while(WAIT_T

25、IMEOUT = WaitForSingleObject(EmptySemaphoreHandle, 300) printf(Producer wait for empty semaphore timeoutn); 将Consumer函数中等待Full信号量的代码行WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT = WaitForSingleObject(FullSemaphoreHandle, 300) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -

26、- - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - 7 printf(Consumer wait for full semaphore timeoutn); 启动调试新的生产者消费者项目,查看在虚拟机中输出的结果,验证信号量超时等待功能是否能够正常执行。如果有错误, 可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤1。如果超时等待功能已经能够正常执行,可以考虑将消费者线程修改为一次消费两个产 品 , 来 测 试 ReleaseCount 参 数 是 否 能 够 正 常 使 用 。 使 用 实 验 文 件 夹

27、 中NewConsumer.c文件中的 Consumer函数替换原有的Consumer函数。三、实验要求:1、P143 ,生产者在生产了13 号产品后本来要继续生产14 号产品,可此时生产者为什么必须等待消费者消费了4 号产品后,才能生产14 号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?因为缓冲池已满 , 此时生成了 14 个产品( 013) ,只消费了 4 个(03) ,缓冲池大小为 10, 因此生产者必须等消费者消费了4 号产品后,再生产 14 号产品。简单地说,在同一地址空间执行2个线程:生产者线程和消费者线程。生产者线程生产产品, 放入缓冲池等待消费者消费,消费者线

28、程从缓冲池中获得产品,释放缓冲池。 当生产者线程生产物品时, 如果缓冲池已满, 那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时, 如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。2、P145-3.4 修改 EOS的信号量算法 (只看一次消费1 个产品的,一次消费2 个产品的可以写到实验报告中) 修改方法请参考本实验报告算法部分。下面给出运行截图:修改前:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - -

29、 - - - - - 8 修改后:3、P147-四、 思考与练习 -2. 绘制 ps/semaphore.c 文件内PsWaitForSemaphore 和 PsReleaseSemaphore函数的流程图。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 9 PsWaitForSemaphore: 开始INFINITE != Milliseconds NO ASSERT(KeGetIntNesting() = 0); IntS

30、tate = KeEnableInterrupts(FALSE); Semphore-Count-; Semphore-Count WaitListHead,INFINITE); return STATUS_SUCCESS; 结束YES YES NO ASSERT(FALSE); return STATUS_INVALID_PARAMETER; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 10 PsReleaseSema

31、phore :开始ReleaseCount != 1 IntState = KeEnableInterrupts(FALSE); NO Semaphore-Count +ReleaseCount Semaphore- MaximumCount NO NULL != PreviousCount *PreviousCount = Semaphore-Count; YES Semaphore-Count+; ASSERT(FALSE); return STATUS_INVALID_PARAMETER; Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; YES YES

32、 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 11 四、实验心得 1 、了解了 EOS 在 PC 机上进程创的过程。 2、查看 EOS进程创建的状态和行为,理解进程同步的具体执行方法。 3、对创建进程的函数进行了修改,使得可以查看缓冲池是否满。Semaphore-Count WaitListHead, STATUS_SUCCESS); PspSchedule();Status = STATUS_SUCCESS; KeEnableInterrupts(IntState); return Status; 结束YES NO 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁