操作系统实验五_第1页
操作系统实验五_第2页
操作系统实验五_第3页
操作系统实验五_第4页
操作系统实验五_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统实验报告课程名称操作系统实验实验项目名称操作系统实验报告物理存储器与进程逻辑地址空间的管理学号2011班级姓名型钢专业学生所在学院指导教师实验室名称地点哈尔滨工程大学一、实验概述1 .实验名称进程的同步2 .实验目的1 .使用EOS的信号量,编程解决生产者一消费者问题,理解进程同步的意义。2 .调试跟踪EOS信号量的工作过程,理解进程同步的原理。3 .修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),力口深 理解进程同步的原理。3.实验类型验证二、实验环境OS Lab三、实验过程3.1 准备实验按照下面的步骤准备本次实验:1 .启动 OS Lab。2 .新建一个EOS Ke

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

3、执行的过程。6 .待应用程序执行完毕后,结束此次调试。7 .3调试EOS!号量的工作过程3.3.1创建信号量按照下面的步骤调试信号量创建的过程:1 .按F5启动调试EOSZ用项目。OS Lab会首先弹出一个调试异常对话框。2 .在调试异常对t框中选择 "是",调试会中断。3 .在main函数中创建Empty信-号量的代码行(第77行)EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE,NULL);添加一个断 点。4 .按F5继续调试,到此断点处中断。5 .按F11调试进入CreateSemaphore函

4、数。可以看到此API函数只是调用了 EOS核中的 PsCreateSemaphoreObject函数来创建信号量对象。6 .按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject函数。在此函数中,会在 EO呐核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。7 .在semaphore.c文件的顶部查找到 PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。8 .按F5继续调试,到断点处中断。观察PsIn

5、itializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。9 .按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开"调用堆栈"窗口,查看函数的调用层次。10 3.2 等待、释放信号量等待信号量(不阻塞)生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject 函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试:1 .删除所有的断点(防止有些断点影响后面的调

6、试)。2 .在eosapp.c文件的Producer函数中,等待Empty信号量的代码行(144)WaitForSingleObject(EmptySemaphoreHandle, INFINITE);添加一个断点。3 .按F5继续调试,到断点处中断。4 . WaitForSingleObject函数最终会调用内核中的 PsWaitForSemaphore函数完成等待操作。所以,在semaphore.c文件中PsWaitForSemaphore函数的第一行(第 68行)添加一个断 点。5 .按F5继续调试,到断点处中断。6 .按F10单步调试,直到完成PsWaitForSemaphore函数中

7、的所有操作。 可以看到此次执行并 没有进行等待,只是将 Empty信号量的计数减少了 1 (由10变为了 9)就返回了。如图所示,empty的初始值为10。在完成PsWaitForSemaphore函数中的所有操作后 empty的值变成了 9。释放信号量(不唤醒)1.删除所有的断点(防止有些断点影响后面的调试)。2 .在eosapp.c文件的Producer函数中,释放Full信号量的代码行(第152行) ReleaseSemaphore(FullSemaphoreHandle, 1, NULL); 添加一个断点。3 .按F5继续调试,到断点处中断。4 .按 F11 调试进入 ReleaseS

8、emaphore 函数。5 .继续按 F11 调试进入 PsReleaseSemaphoreObject 函数。6 .先使用F10单步调试,当黄色箭头指向第269行时使用F11单步调试,进入PsReleaseSemaphore 函数。7 .按F10单步调试,直到完成PsReleaseSemaphore函数中的所有操作。 可以看到此次执行没 有唤醒其它线程(因为此时没有线程在 Full信号量上被阻塞),只是将Full信号量的计数增 加了 1 (由0变为了 1)。full信号量初始值为0full信号量由0变为1生产者线程通过等待 Empty言号量使空缓冲区数量减少了1,通过释放Full信号量使满缓

9、冲区数量增加了 1,这样就表示生产者线程生产了一个产品并占用了一个缓冲区。等待信号量(阻塞)由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产品时就会被阻塞,下面调试这种情况。1 .结束之前的调试。2 .删除所有的断点。3 .按F5重新启动调试。OS Lab会首先弹出一个调试异常对话框。4 .在调试异常对话框中选择是“,调试会中断。5 .在semaphore© 文件中的 PsWaitForSemaphore 函数的 PspWait(&Semaphore->WaitListHead, INF

10、INITE); 代码行(第 78行)添加一个断点。6 .按F5继续调试,并立即激活虚拟机窗口查看输出。开始时生产者、消费者都不会被信号 量阻塞,同步执行一段时间后才在断点处中断。7 .中断后,查看 调用堆栈”窗口,有Producer函数对应的堆栈帧,说明此次调用是从生产 者线程函数进入的。8 .在调用堆栈”窗口中双击Producer函数所在的堆栈帧,绿色箭头指向等待Empty信号量的 代码行,查看Producer函数中变量i的值为14,表示生产者线程正在尝试生产14号产品。9 .在调用堆栈"窗口中双击PsWaitForSemaphore函数的堆栈帧,查看 Empty信号量计数(Sem

11、aphore->Count)的值为-1 ,所以会调用PspWait函数将生产者线程放入 Empty信号量的 等待队列中进行等待(让出 CPU 。10 .激活虚拟机窗口查看输出的结果。生产了从0到13的14个产品,但是只消费了从0到3的4个产品,所以缓冲池中的10个缓冲区就都被占用了,这与之前调试的结果是一致的。释放信号量(唤醒)只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品。可以按照下面的步骤调试: 1.删除所有断点。2 .在eosapp.c文件的Consumer函数中,释放Empty信号量的代码行(第180) ReleaseS

12、emaphor e (EmptySemaphoreHandle, 1, NULL);添加一个断点。3 .按F5继续调试,到断点处中断。4 .查看Consumer函数中变量i的值为4,说明已经消费了 4号产品。5 .按照中的方法使用 F10和F11调试进入PsReleaseSemaphore函数。6 .查看 PsReleaseSemaphore 函数中 Empty信号量计数 (Semaphore->Count)的值为-1 ,和生 产者线程被阻塞时的值是一致的。7 .按F10单步调试PsReleaseSemaphore函数,直到在代码行(第 132行) PspWakeThread(&

13、Semaphore->WaitListHead, STATUS_SUCCESS融中断。此时 Empty信号量 计数的值已经由-1增加为了 0,需要调用PspWakeThread函数唤醒阻塞在Empty信号量等待队 列中的生产者线程(放入就绪队列中),然后调用PspSchedule函数执行调度,这样生产者线程就得以继续执行。按照下面的步骤验证生产者线程被唤醒后,是从之前被阻塞时的状态继续执行的:1 .在semaphore©文件中PsWaitForSemaphore函数的最后一行 (第83行)代码处添加一个断 点。2 .按F5继续调试,在断点处中断。3 .查看PsWaitForSe

14、maphore函数中Empty信号量计数(Semaphore->Count)的值为0,和生 产者线程被唤醒时的值是一致的。4 .在调用堆栈”窗口中可以看到是由Producer函数进入的。激活Producer函数的堆栈帧, 查看Producer函数中变量i的值为14,表明之前被阻塞的、正在尝试生产14号产品的生产者线程已经从PspWait函数返回并继续执行了。5 .结束此次调试。6 .4修改EOS勺信号量算法 修改处代码 运行成功7 .4.3测试方法修改完毕后,可以按照下面的方法进行测试:1 .使用修改完毕的EOSKernel项目生成完全版本的 SDKC件夹,并覆盖之前的生产者消费 者应用

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

16、quot;); 4 .将Consumer函数中等待Full信号量的代码行WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替换为 while(WAIT_TIMEOUT = WaitForSingleObject(FullSemaphoreHandle, 300) printf("Consumer wait for full semaphore timeoutn"); 5 .启动调试新的生产者一消费者项目,查看在虚拟机中输出的结果,验证信号量超时等待 功能是否能够正常执行。如果有错误,可以调试内核代码来查找错误,然后在内核

17、项目中修改,并重复步骤1。6 .如果超时等待功能已经能够正常执行,可以考虑将消费者线程修改为一次消费两个产品,来测试ReleaseCount参数是否能够正常使用。使用实验文件夹中NewConsumer.c文件中的Consumer函数替换原有的Consumer函数。四、思考题1 .思考在 ps/semaphore.c 文件内的 PsWaitForSemaphore 和 PsReleaseSemaphore 函数中,为 什么要使用原子操作?可以参考本书第2章中的第2.6节。答:等待和释放操彳都是原语操作,在执行等待信号量和释放信号量的时候,不能被打断,所以cpu是不允许响应外部中断的,如果此时cp

18、u响应了外部中断,中间的某些共用的变量会产生不可预料的变化,无法正常完正常的操作。2 .绘制 ps/semaphore.c 文件内 PsWaitForSemaphore 和PsReleaseSemaphore 函数的流程图。PsWaitForSemaphore2 2) PsReleaseSemaphore3 .根据本实验3.3.2节中设置断点和调试的方法,练习调试消费者线程在消费第一个产品 时,等待Full信号量和释放Empty信号量的过程。注意信号量计数是如何变化的。4 .根据本实验3.3.2节中设置断点和调试的方法,自己设计一个类似的调试方案来验证消费者线程在消费24号产品时会被阻塞,直到生产者线程生产了 24号产品后,消费者线程才被唤 醒并继续执行的过程。提示,可以按照下面的步骤进行调试:(1)删除所有的断点。(2)按F5启动调试。OSLab会首先弹出一个调试异常对话框。(3)在调试异常对话框中选择是“,调试会中断。(4)在Consumer函数中等待Full信号量的代码行(第 17夕亍) WaitForSingleObject(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论