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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

操作系统实验五.docx

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

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

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

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

5、续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。 9. 按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开调用堆栈窗口,查看函数的调用层次。 3.3.2 等待、释放信号量 3.3.2.1 等待信号量(不阻塞)生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用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单步调试,直到完成PsWa

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

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

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

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

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

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

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

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

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

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

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

18、正常完正常的操作。 2. 绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。(1)PsWaitForSemaphore(2) PsReleaseSemaphore 3. 根据本实验3.3.2节中设置断点和调试的方法,练习调试消费者线程在消费第一个产品时,等待Full信号量和释放Empty信号量的过程。注意信号量计数是如何变化的。 4. 根据本实验3.3.2节中设置断点和调试的方法,自己设计一个类似的调试方案来验证消费者线程在消费24号产品时会被阻塞,直到生产者线程生产了24号产品后,消费者线程才被唤醒并继续执行的过程。

19、 提示,可以按照下面的步骤进行调试: (1) 删除所有的断点。 (2) 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 (3) 在调试异常对话框中选择“是”,调试会中断。 (4) 在Consumer函数中等待Full信号量的代码行(第173行) WaitForSingleObject(FullSemaphoreHandle, INFINITE); 添加一个断点。 (5) 在“断点”窗口(按Alt+F9打开)中此断点的名称上点击右键。 (6) 在弹出的快捷菜单中选择“条件”。 (7) 在“断点条件”对话框(按F1获得帮助)的表达式编辑框中,输入表达式“i = 24”。 (8) 点击“断点条件”对话框中的“确定”按钮。 (9) 按F5继续调试。只有当消费者线程尝试消费24号产品时才会在该条件断点处中断。五、实验体会本次实验我学会了使用EOS的信号量,编程解决生产者消费者问题,理解了进程同步的意义。并且修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。

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

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