欢迎来到天天文库
浏览记录
ID:39186240
大小:2.09 MB
页数:16页
时间:2019-06-26
《操作系统实验五》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、操作系统实验报告课程名称操作系统实验实验项目名称操作系统实验报告物理存储器与进程逻辑地址空间的管理学号2011班级姓名型钢专业学生所在学院指导教师实验室名称地点哈尔滨工程大学一、实验概述1.实验名称进程的同步2.实验目的1.使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。3.实验类型验证二、实验环境OSLab三、实验过程3.1准备实验按照下面的步骤准备本次实验:1.启动OSLab。2.新建一个EOSKernel项目。3
2、.生成EOSKernel项目,从而在该项目文件夹中生成SDK文件夹。4.新建一个EOS应用程序项目。5.使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。3.2使用EOS的信号量解决生产者-消费者问题按照下面的步骤查看生产者-消费者同步执行的过程:1.使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。2.按F7生成修改后的EOS应用程序项目。3.按F5启动调试。OSLab会首先弹出一个调试异常对话框。4.在调试异常对话框中选择“否”,继续执行。5.立即激活虚拟机窗口查看生产者-消费者同步执行的过程。146.待应用
3、程序执行完毕后,结束此次调试。3.3调试EOS信号量的工作过程3.3.1创建信号量按照下面的步骤调试信号量创建的过程:1.按F5启动调试EOS应用项目。OSLab会首先弹出一个调试异常对话框。2.在调试异常对话框中选择"是",调试会中断。3.在main函数中创建Empty信号量的代码行(第77行)EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE,BUFFER_SIZE,NULL);添加一个断点。4.按F5继续调试,到此断点处中断。5.按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsC
4、reateSemaphoreObject函数来创建信号量对象。6.14按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject函数。在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。7.在semaphore.c文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。8.按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始
5、化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。9.按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开"调用堆栈"窗口,查看函数的调用层次。143.3.2等待、释放信号量3.3.2.1等待信号量(不阻塞)生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试:1.删除所有的断点(防止有些断点影响后面的调试)。2.在eosapp.c文件的Produce
6、r函数中,等待Empty14信号量的代码行(144)WaitForSingleObject(EmptySemaphoreHandle,INFINITE);添加一个断点。3.按F5继续调试,到断点处中断。4.WaitForSingleObject函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。所以,在semaphore.c文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。5.按F5继续调试,到断点处中断。6.按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将E
7、mpty信号量的计数减少了1(由10变为了9)就返回了。如图所示,empty的初始值为10。在完成PsWaitForSemaphore函数中的所有操作后empty的值变成了9。3.3.2.2释放信号量(不唤醒)1.删除所有的断点(防止有些断点影响后面的调试)。2.在eosapp.c文件的Producer函数中,释放Full信号量的代码行(第152行)14ReleaseSemaphore(FullSemaphoreHandle,1,NULL);添加一个断点。3.按F5继
此文档下载收益归作者所有