2022年2022年进程的同步[借 .pdf
《2022年2022年进程的同步[借 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年进程的同步[借 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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 页 - - - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年进程的同步借 2022 进程 同步
限制150内