efogbAAA操作系统实验五.pdf
《efogbAAA操作系统实验五.pdf》由会员分享,可在线阅读,更多相关《efogbAAA操作系统实验五.pdf(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 操作系统 实 验 报 告 课程名称 操作系统实验 实验项目名称 操作系统实验报告物理存储器与进程逻辑地址空间的管理 学号 2011 班级 姓名 型钢 专业 学生所在学院 指导教师 实验室名称地点 哈尔滨工程大学 一、实验概述 1.实验名称 进程的同步 2.实验目的 1.使用EOS的信号量,编程解决生产者消费者问题,理解进程同步的意义。2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3.实验类型 验证 二、实验环境 OS Lab 三、实验过程 准备实验 按照下面的步骤准备本次实验:1.启动OS L
2、ab。2.新建一个EOS Kernel项目。3.生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。4.新建一个EOS应用程序项目。5.使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。使用EOS的信号量解决生产者消费者问题 按照下面的步骤查看生产者消费者同步执行的过程:1.使用文件中的源代码,替换之前创建的EOS应用程序项目中文件内的源代码。2.按F7生成修改后的EOS应用程序项目。3.按F5启动调试。OS Lab会首先弹出一个调试异常对话框。4.在调试异常对话框中选择“否”,继续执行。5.立即激活虚拟机窗口查看生产者消费者同步执行的过程。6.待应用
3、程序执行完毕后,结束此次调试。调试EOS信号量的工作过程 创建信号量 按照下面的步骤调试信号量创建的过程:1.按F5启动调试EOS应用项目。OS Lab会首先弹出一个调试异常对话 框。2.在调试异常对话框中选择是,调试会中断。3.在main函数中创建Empty信号量的代码行(第77行)EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE,BUFFER_SIZE,NULL);添加一个断点。4.按F5继续调试,到此断点处中断。5.按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsCreateSemapho
4、reObject函数来创建信号量对象。6.按F11调试进入文件中的PsCreateSemaphoreObject函数。在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。7.在文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。8.按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的
5、。9.按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开调用堆栈窗口,查看函数的调用层次。等待、释放信号量 等待信号量(不阻塞)生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试:1.删除所有的断点(防止有些断点影响后面的调试)。2.在文件的Producer函数中,等待Empty信号量的代码行(144)WaitForSingleObject(EmptySemaphoreHandle,INFINI
6、TE);添加一个断点。3.按F5继续调试,到断点处中断。4.WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。所以,在文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。5.按F5继续调试,到断点处中断。6.按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。如图所示,empty的初始值为10。在完成PsWaitForSemaphore函数中的所有操作后empty的值变成了9。释
7、放信号量(不唤醒)1.删除所有的断点(防止有些断点影响后面的调试)。2.在文件的Producer函数中,释放Full信号量的代码行(第152行)ReleaseSemaphore(FullSemaphoreHandle,1,NULL);添加一个断点。3.按F5继续调试,到断点处中断。4.按F11调试进入ReleaseSemaphore函数。5.继续按F11调试进入PsReleaseSemaphoreObject函数。6.先使用F10单步调试,当黄色箭头指向第269行时使用F11单步调试,进入PsReleaseSemaphore函数。7.按F10单步调试,直到完成PsReleaseSemaphor
8、e函数中的所有操作。可以看到此次执行没有唤醒其它线程(因为此时没有线程在Full信号量上被阻塞),只是将Full信号量的计数增加了1(由0变为了1)。full信号量初始值为0 full信号量由0变为1 生产者线程通过等待Empty信号量使空缓冲区数量减少了1,通过释放Full信号量使满缓冲区数量增加了1,这样就表示生产者线程生产了一个产品并占用了一个缓冲区。等待信号量(阻塞)由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产品时就会被阻塞,下面调试这种情况。1.结束之前的调试。2.删除所有的断点。3.按F5重新启
9、动调试。OS Lab会首先弹出一个调试异常对话框。4.在调试异常对话框中选择“是”,调试会中断。5.在文件中的PsWaitForSemaphore函数的 PspWait(&Semaphore-WaitListHead,INFINITE);代码行(第78行)添加一个断点。6.按F5继续调试,并立即激活虚拟机窗口查看输出。开始时生产者、消费者都不会被信号量阻塞,同步执行一段时间后才在断点处中断。7.中断后,查看“调用堆栈”窗口,有Producer函数对应的堆栈帧,说明此次调用是从生产者线程函数进入的。8.在“调用堆栈”窗口中双击Producer函数所在的堆栈帧,绿色箭头指向等待Empty信号量的代
10、码行,查看Producer函数中变量i的值为14,表示生产者线程正在尝试生产14号产品。9.在“调用堆栈”窗口中双击PsWaitForSemaphore函数的堆栈帧,查看Empty信号量计数(Semaphore-Count)的值为-1,所以会调用PspWait函数将生产者线程放入Empty信号量的等待队列中进行等待(让出CPU)。10.激活虚拟机窗口查看输出的结果。生产了从0到13的14个产品,但是只消费了从0到3的4个产品,所以缓冲池中的10个缓冲区就都被占用了,这与之前调试的结果是一致的。释放信号量(唤醒)只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- efogbAAA 操作系统 实验
限制150内