操作系统 实 验 报 告
课程名称 实验项目名称 学号 姓名 2009063122 葛天奇 计算机科学与技学生所在学院 术学院 实验室名称地点
操作系统实验 进程的同步 班级 专业 090631 信息安全 指导教师 21#427 哈尔滨工程大学 计算机科学与技术学院
一、实验概述
1. 实验名称 进程的同步 2. 实验目的
(1)使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。 (2)调试跟踪EOS信号量的工作过程,理解进程同步的原理。
(3)修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 3. 实验类型(验证+设计) 4. 实验内容
(1)使用EOS的信号量解决生产者-消费者问题 (2)调试EOS信号量的工作过程 (3)修改EOS的信号量算法
二、实验环境
OS Lab实验环境 EOS操作系统
三、实验过程
部分实验过程截图:
1.按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开“调用堆栈”窗口,查看函数的调用层次。
1
实验要求完成的问题:
1.生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢?
答:因为此时生产了从0到13的14个产品,但是只消费了从0到3的4个产品,所以缓冲池中的10个缓冲区就都被占用了,所以必须等待消费者消费了4号产品后,才能生产14号产品。具体同步过程在调试过程中已验证。 2.修改EOS的信号量算法 代码(修改部分):
(1) 修改PsWaitForSemaphore函数: if (Semaphore->Count > 0){ Semaphore->Count--; flag=STATUS_SUCCESS; }
else if(Semaphore->Count = 0)
flag=PspWait(&Semaphore->WaitListHead, Milliseconds); KeEnableInterrupts(IntState); // 原子操作完成,恢复中断。 return flag;
(2) 修改PsReleaseSemaphore函数:
while ((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){ PspWakeThread(&Semaphore->WaitListHead, STATUS_SUCCESS);
2
PspThreadSchedule(); ReleaseCount--; }
Semaphore->Count = Semaphore->Count + ReleaseCount; //
// 可能有线程被唤醒,执行线程调度。 Status = STATUS_SUCCESS; }
KeEnableInterrupts(IntState); // 原子操作完成,恢复中断。 return Status;
运行结果:
3
3.思考与练习
1.思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作?
答:在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成原子操作。
四、实验体会
实验过程中遇到的问题主要是在修改信号量算法部分,在修改PsReleaseSemaphore函数时,开始考虑使用for循环,但经调试没有成功,后改为while循环,运行成功。
通过本次实验,我对生产者-消费者问题的解决办法有了更全面的认识,对进程的同步过程有了详细的认识,同时在动手修改信号量算法时,通过仔细阅读代码,对进程的同步算法也有了更加深刻的认识。
4
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务