操作系统
实 验 报 告
课程名称 结束实验 关闭句柄信号量对Full释放待等10前毫100产个 秒 毫秒等待500 函数结束main 毫秒2000等待行操作系统实验 生产者-消费者问题信号量Empty等待使信号量的值增 课程编号 等待 0920311 信号量对象Full P操作,否则返回执行3 5.P操作结束 执行一次信号量的释放操作。5. 操作控制的信号量不大于零唤醒等P1。如果加 待进程,返回,唤醒成功,函数结束。7.ifReleaseCount果被阻塞的线程数量小于塞的线程都会被唤醒,阻塞线程的数量 实验项目名称 创 操作系统的启动信号调试EOS 量的工作过程 对象等待Mutex 对建Full信 号量对象 开始 象等待Mutex 被阻塞进程的数量小于要释放的信号量的个6.if 学号 创建生产者线程 1.原子操作前关中断 唤醒等待队列中的进程,数, 返回,唤醒成功,函数结束。 生产一个产品,占 用一个缓冲区 直到等待队列为空。 2011级年级 消费一个产品,清空 一个缓冲区 姓名 创建号信2.开始原子操作 于等于 待等待等释信号信号量(不放P操作 ,则循环 软件工程专业 信放释信放等待信释 结束后,有ReleaseCount (唤号量(不号量号量(阻循环向后移动缓 被阻塞的线程数量大 学生所在学院 量 创建消费者线程3.If 个线程会被唤醒,而且信号量计数的值仍然为ReleaseCount 并且信号量的计数值 软件学院 阻塞) 量 王红滨指导教师 醒)塞) 唤循环向后移动缓冲 区指针0 ,醒) ;如0—之前被 Wait操作的信号量大于 则循环结束后,所有被阻=ReleaseCount 实验室名称地点 软件工程实验室 21B282 的信号量算法EOS修改对象Mutex等待生产者线程和消 费者线程结束4.If Wait操作的信释放 对象释放Mutex0执 结束 号量大于 +之前信号量的计数值。函数结束
哈尔滨工程大学 软件学院.
第六讲 进程的同步
一、实验概述 1. 实验名称 实验系统的启动
2. 实验目的
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函数中的代码,使这两个参数能够真正起到作用,使信号量对象支持等待超时唤醒功能和批量释放功能。 二、实验环境
操作系统:windows xp
编译环境:OS Lab
1
三、实验过程
1. 设计思路和流程图
准备实验
的信号量解决EOS使用 整体试验流程图图3-1. 2
函数开始ConsumerProducer函数开始函数开始mainProd 对象Mutex创建ucer生产完Consumer费消数函 毕? 函
数结束毕完 结束信号Empty创建 量对信号量对释Empty
3-2.Main图函数流程图、生产者消费、消费者流程图
3
2. 需要解决的问题及解答
(1).思考在ps/semaphore.c文件内的PsWaitForSemaphore和PsReleaseSemaphore函数中,为什么要使用原子操作?
答:在执行等待信号量和释放信号量的时候,是不允许cpu响应外部中断的,如果此时cpu响应了外部中断,会产生不可预料的结果,无法正常完成原子操作。 (2). 绘制ps/semaphore.c文件内PsWaitForSemaphore和PsReleaseSemaphore函数的流程图。
1).PsWaitForSemaphore函数流程图。
结束
函数流程图 2). PsReleaseSemaphore
开始
1.原子操作前关中断 4
V操作 2.开始原子操作操作的信号量之和V3.if P 和大于缓冲队列长度
成立返回“信号数目量超34.如果出范围”函数结束,否则记录当前 信号量的值
可此时生(3). P143生产者在生产了14号产品,13号产品后本来要继续生产号产品呢?生产者14产者为什么必须等待消费者消费了4号产品后,才能生产 和消费者是怎样使用同步对象来实现该同步过程的呢?答:这是因为临界资源的限制。缓冲区只有十个空间,现在消费比生产慢,个。此时装入产品与产品的313此时分别装了4到号产品,而消费者只消费了再消费者消费了下一个产品之前生产者不能继存储空间成为直接相互制约关系,号产品后才能生产续装入。因此,可解释生产者为什么必须等待消费者消费了4 号产品。14节中设置断点和调试的方法,自己设计一个类似的调根据本实验3.3.2(4).
号产品时会被阻塞,直到生产者线程生产了试方案来验证消费者线程在消费24 号产品后,消费者线程才被唤醒并继续执行的过程。24
5
答:可以按照下面的步骤进行调试 (1) 删除所有的断点。
(2) 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 (3) 在调试异常对话框中选择“是”,调试会中断。
(4) 在Consumer函数中等待Full信号量的代码行(第173行)
WaitForSingleObject(FullSemaphoreHandle, INFINITE); 添加一个断点。
操作系统实验四 进程的同步
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)