操作系统实验第六讲进程的同步全解.doc

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验第六讲进程的同步全解

操作系统 实 验 报 告 课程名称 操作系统实验 实验项目名称 进程的同步 学号 班级 姓名 专业 计算机科学与技术 学生所在学院 计算机科学 与技术学院 指导教师 初妍 实验室名称地点 21#428 哈尔滨工程大学 计算机科学与技术学院 一、实验概述 1. 实验名称 进程的同步 实验目的 使用 EOS 的信号量, 编程解决生产者—消费者问题,理解进程 同步的意义。调试跟踪 EOS 信号量的工作过程,理解进程同步的 原理。修改 EOS 的信号量算法,使之支持等待超时唤醒功能(有 限等待),加深理解进程同步的原理。 实验类型 验证+设计 实验内容 3.1 准备实验 3.2 使用 EOS 的信号量解决生产者-消费者问题 3.3 调试 EOS 信号量的工作过程 3.3.1 创建信号量 3.3.2 等待、释放信号量 3.3.2.1 等待信号量(不阻塞) 3.3.2.2 释放信号量(不唤醒) 3.3.2.3 等待信号量(阻塞) 3.3.2.4 释放信号量(唤醒) 3.4 修改 EOS 的信号量算法 二、实验环境 操作系统 windos xp 编译器 OS Lab 语言 c语言 三、实验过程 1. 设计思路和流程图 3. 需要解决的问题及解答 (1)生产者在生产了13号产品后本来要继续生产14号产品,可此时生产者为什么必须等待消费者消费了4号产品后,才能生产14号产品呢?生产者和消费者是怎样使用同步对象来实现该同步过程的呢? 答:这是因为临界资源的限制。临界资源的数值范围是0到10,只有当临界资源不满10时才能让生产者生产东西,每次生产一个临界资源数量加一,当临界资源数值到10时,无法继续生产,所以它必须等到消费者,消耗掉一个,临界资源数值才会减一并腾出空间,才能继续生产14号产品。 修改EOS的信号量算法 修改PsWaitForSemaphore函数: PsWaitForSemaphore( IN PSEMAPHORE Semaphore, IN ULONG Milliseconds ) /*++ 功能描述: 信号量的Wait操作(P操作)。 参数: Semaphore--Wait操作的信号量对象。 Milliseconds--等待超时上限,单位毫秒。 返回值: STATUS_SUCCESS。 当你修改信号量使之支持超时唤醒功能后,如果等待超时,应该返回STATUS_TIMEOUT。 --*/ { BOOL IntState; STATUS flag;//保存不同情况下的返回值, ASSERT(KeGetIntNesting()==0);//中断环境下不能调用此函数。 IntState=KeEnableInterrupts(FALSE);//开始原子操作,禁止中断。 if(Semaphore-Count0){ Semaphore-Count--; flag=STATUS_SUCCESS; }//如果信号量大于零,说明尚有资源,可以为线程分配 else flag=PspWait(Semaphore-WaitListHead,Milliseconds); KeEnableInterrupts(IntState);//原子操作完成,恢复中断。 return flag; } 修改PsReleaseSemaphore函数: PsReleaseSemaphore( IN PSEMAPHORE Semaphore, IN LONG ReleaseCount, OUT PLONG PreviousCount ) /*++ 功能描述: 信号量的Signal操作(V操作)。 参数: Semaphore--Wait操作的信号量对象。 ReleaseCount--信号量计数增加的数量。当前只能为1。当你修改信号量使之支持 超时唤醒功能后,此参数的值能够大于等于1。 PreviousCount--返回信号量计数在增加之前的值。 返回值: 如果成功释放信号量,返回STATUS_SUCCESS。 --*/ { STATUS Status; BOOL IntState; IntState=KeEnableInterrupts(FALSE);//开始原子操作,禁止中断。 if(Semaphore-Count+ReleaseCountSemaphore-MaximumCount){ Status=STATUS_SEMAPH

文档评论(0)

0022515 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档