操作系统实验第六讲进程的同步方案.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函数 修改PsReleaseSemaphore函数 PsWaitForSemaphore函数流程 PsReleaseSemaphore函数流程 5. 源程序并附上注释 // 缓冲池。 #define BUFFER_SIZE 10 int Buffer[BUFFER_SIZE]; // 产品数量。 #define PRODUCT_COUNT 30 // 用于生产者和消费者同步的对象句柄。 HANDLE MutexHandle; HANDLE EmptySemaphoreHandle; HANDLE FullSemaphoreHandle; // 生产者和消费者的线程函数 ULONG Producer(PVOID Param); ULONG Consumer(PVOID Param); int main(int argc, char* argv[]) { HANDLE ProducerHandle; HANDLE ConsumerHandle; #ifdef _DEBUG __asm(int $3\n nop); #endif // 创建用于互斥访问缓冲池的 Mutex 对象。 MutexHandle = CreateMutex(FALSE, NULL); if (NULL == MutexHandle) { return 1; } // 创建 Empty 信号量,表示缓冲池中空缓冲区数量。初始计数和最大计数都为 BUFFER_SIZE。 // EmptySemaphoreHandle = CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); if (NULL == EmptySemaphoreHandle) { return 2; } // 创建 Full 信号量,表示缓冲池中满缓冲区数量。初始计数为 0,最大计数为 BUFFER_SIZE。 FullSemaphoreHandle = CreateSemaphore(0, BUFFER_SIZE, NULL); if (NULL == FullSemaphoreHandle) { return 3; } // 创建生产者线程。 // ProducerHandle = CreateThread( 0, // 默认堆栈大小 Producer, // 线程函数入口地址 NULL, // 线程函数参数 0, // 创建标志 NULL ); // 线程 ID if (

文档评论(0)

70后老哥 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档