- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统试验第六讲_进程的同步
操作系统
实 验 报 告
课程名称 操作系统实验 实验项目名称 进程的同步 学号 班级 姓名 专业 学生所在学院 指导教师 实验室名称地点
哈尔滨工程大学
计算机科学与技术学院
一、实验概述
1. 实验名称 进程的同步
实验目的
(1)使用 EOS 的信号量编程解决生产者—消费者问题,理解进程同步的意义。
(2)调试跟踪 EOS 的信号量的工作过程,理解进程同步的原理。
(3)修改 EOS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。
3. 实验类型 验证,设计
4. 实验内容
(1)准备实验
(2)使用EOS的信号量解决生产者-消费者问题
(3)调试EOS信号量的工作过程
(4)修改EOS的信号量算法
在目前创建的EOS Kernel项目的ps/semaphore.c文件中,PsWaitForSemaphore函数的Milliseconds参数只能是INFINITE,PsReleaseSemaphore函数的ReleaseCount参数只能是1。现在要求同时修改PsWaitForSemaphore函数和PsReleaseSemaphore函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。
二、实验环境
EOS操作系统和OS Lab集成实验环境
三、实验过程
1.生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?
答:缓冲区只有十个空间,现在消费比生产慢,此时分别装了4到13号产品,而消费者只消费了3个。此时装入产品与产品的存储空间成为直接相互制约关系,在消费者消费了下一个产品之前生产者不能继续装入。因此,可解释生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品。
2.绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。
(1)PsWaitForSemaphore函数的流程图。
1.原子操作前关中断 ↓
2.开始原子操作P操作 ↓
3.If Wait操作的信号量大于0
4.if Wait操作的信号量大于0执行P操作,否则返回执行3 ↓
5.P操作结束 (2)PsReleaseSemaphore函数的流程图
1.原子操作前关中断 ↓
2.开始原子操作V操作 ↓
3.if P和V操作的信号量之和大于缓冲队列长度 ↓
4.如果3成立返回“信号数目量超出范围”函数结束,否则记录当前信号量的值 ↓
5. 执行一次信号量的释放操作,使信号量的值增加1。如果P操作控制的信号量不大于零唤醒等待进程,返回,唤醒成功。函数结束 ↓
6. if被阻塞进程的数量小于要释放的型号量的个数,唤醒等待队列中的进程,直到等待队列为空。返回,唤醒成功。函数结束 ↓
7.if被阻塞的线程数量大于等于ReleaseCount,则循环结束后,有ReleaseCount个线程会被唤醒,而且信号量计数的值仍然为0;如果被阻塞的线程数量小于ReleaseCount,则循环结束后,所有被阻塞的线程都会被唤醒,并且信号量的计数值=ReleaseCount-之前被阻塞线程的数量+之前信号量的计数值。函数结束
3.修改EOS的信号量算法
(1)对PsWaitForSemaphore的修改
PsWaitForSemaphore(
IN PSEMAPHORE Semaphore,
IN ULONG Milliseconds
)
/*++
功能描述:
信号量的 Wait 操作(P 操作)。
参数:
Semaphore -- Wait 操作的信号量对象。
Milliseconds -- 等待超时上限,单位毫秒。
返回值:
STATUS_SUCCESS。
当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回 STATUS_TIMEOUT。
--*/
{
STATUS value;
BOOL IntState;
ASSERT(KeGetIntNesting() == 0); // 中断环境下不能调用此函数。
IntState = KeEnableInterrupts(FALSE); // 开始原子操作,禁止中断。
//
// 目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以 PspWait 函数
// 的第二个参数的值只能是 INFINITE。
//
文档评论(0)