您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页操作系统实验报告

操作系统实验报告

来源:筏尚旅游网


操作系统 实 验 报 告

课程名称 实验项目名称 学号 姓名 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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务