操作系统实验5_第1页
操作系统实验5_第2页
操作系统实验5_第3页
操作系统实验5_第4页
操作系统实验5_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统 实 验 报 告 课程名称操作系统实验 实验项目名称进程的同步 学号2012201425班级20122014 姓名颜凡腾专业软件工程 学生所在学院软件学院指导教师曹雪 实验室名称地点21b 哈尔滨工程大学 软件学院 0 一 实验概述 1 实验名称 进程的同步 2 实验目的 使用 EOS 的信号量 编程解决生产者 消费者问题 理解进程同步的意义 调试跟踪 EOS 信号量的工作过程 理解进程同步的原理 修改 EOS 的信号量算法 使之支持等待超时唤醒功能 有限等待 加深理解 进程同步的原理 3 实验类型 设计 二 实验环境 OS Lab 三 实验过程 使用使用 EOSEOS 的信号量解决生产者的信号量解决生产者 消费者问题 消费者问题 立即激活虚拟机窗口查看生产者 消费者同步执行的过程 1 调试调试 EOSEOS 信号量的工作过程 信号量的工作过程 创建信号量创建信号量 2 按 F5 继续调试 到断点处中断 观察 PsInitializeSemaphore 函数中用来初 始化信号量结构体成员的值 应该和传入 CreateSemaphore 函数的参数值是一 致的 按 F10 单步调试 PsInitializeSemaphore 函数执行的过程 查看信号量结构 体被初始化的过程 打开 调用堆栈 窗口 查看函数的调用层次 3 等待 释放信号量 等待 释放信号量 等待信号量 不阻塞 等待信号量 不阻塞 按 F10 单步调试 直到完成 PsWaitForSemaphore 函数中的所有操作 可以看 到此次执行并没有进行等待 只是将 Empty 信号量的计数减少了 1 由 10 变 为了 9 就返回了 4 释放信号量 不换醒 释放信号量 不换醒 按 F10 单步调试 直到完成 PsReleaseSemaphore 函数中的所有操作 可以看 到此次执行没有唤醒其它线程 因为此时没有线程在 Full 信号量上被阻塞 只是将 Full 信号量的计数增加了 1 由 0 变为了 1 5 6 等待信号量 阻塞 等待信号量 阻塞 由于开始时生产者线程生产产品的速度较快 而消费者线程消费产品的速度 较慢 所以当缓冲池中所有的缓冲区都被产品占用时 生产者在生产新的产品 时就会被阻塞 在 调用堆栈 窗口中双击 Producer 函数所在的堆栈帧 绿色 箭头指向等待 Empty 信号量的代 码行 查看 Producer 函数中变量 i 的值为 14 表示生产者线程正在尝试生 产 14 号产品 7 在 调用堆栈 窗口中双击 PsWaitForSemaphore 函数的堆栈帧 查看 Empty 信号量计数 Semaphore Count 的值为 1 所以会调用 PspWait 函数将生 产者线程放入 Empty 信号量的等待队列中进行等待 让出 CPU 激活虚拟机窗口查看输出的结果 生产了从 0 到 13 的 14 个产品 但是只消 费了从 0 到 13 的 14 个产品 所以缓冲池中的 10 个缓冲区就都被占用了 这与之前调试的结果是一致的 8 释放信号量 唤醒 只有当消费者线程从缓冲池中消费了一个产品 从而产生一个空缓冲区后 生 产者线程才会被唤醒并继续生产 14 号产品 查看 Consumer 函数中变量 i 的值为 4 查看 PsReleaseSemaphore 函数中 Empty 信号量计数 Semaphore Count 的值为 1 和生产者线程被阻塞时的值是一致的 9 按 F10 单步调试 PsReleaseSemaphore 函数 直到在代码行 第 132 行 PspWakeThread 替换为 while WAIT TIMEOUT WaitForSingleObject EmptySemaphoreHandle 300 printf Producer wait for empty semaphore timeout n 将 Consumer 函数中等待 Full 信号量的代码行 WaitForSingleObject FullSemaphoreHandle INFINITE 替换为 while WAIT TIMEOUT WaitForSingleObject FullSemaphoreHandle 300 printf Consumer wait for full semaphore timeout n 启动调试新的生产者 消费者项目 查看在虚拟机中输出的结果 验证信号量 超时等待功能是否能够正常执行 13 14 将消费者线程修改为一次消费两个产品 来测试 ReleaseCount 参数是否能够 正常使用 4 思考题 1 思考在 ps semaphore c 文件内的 PsWaitForSemaphore 和 PsReleaseSemaphore 函数中 为什么要使用原子操作 可以参考本书第 2 章 中的第 2 6 节 答 当在执行 PsWaitForSemaphore 和 PsReleaseSemaphore 函数的时候 是不 允许 cpu 响应外部中断的 如果此时 cpu 响应了外部中断 就会产生不可预料 的结果 无法正常完成函数的功能 2 绘制 ps semaphore c 文件内 PsWaitForSemaphore 和 PsReleaseSemaphore 函数的流程图 15 PsWaitForSemaphore 流程图 PsReleaseSemaphore函数的流程图 16 PsReleaseSema phore从 从 从 从 从 从 从 从 从 从 Semaphore Count ReleaseCount Semaphore Max immCount 从 从 从 从 从 从 从 从 从 从 从 Status STATUS SECCESS 从 从 从 从 从 从 Status STATLS SEMSPHORE LIMIT EXEEDED 从 从 从 从 从 从 从 从 从 从 从 从 从 从 从 从 从 1 Semaphore Count 0 yes no no yes 3 生产者线程和消费者线程是如何使用Mutex Empty信号量和 Full信号 量来实现同步的 在两个线程函数中对这三个同步对象的操作能够改变顺序吗 答 Mutex Empty Full三个信号量的初始值分别为1 10 0 当出现一 个生产者线程访问缓冲池时 首先Empty要减1 如果大于0 就说明还有剩余的 缓冲区可以让生产者放入产品 小于等于0则生产者线程进入等待队列 再对 Mutex减1 如果大于等于0 就说明没有线程占用着缓冲池 小于0则生产者线 程进入等待队列 生产完产品后 对Mutex值加1 解除封锁 再对Full值加1 说明生产了一个产品占用了一个缓冲区 消费者线程也是这样的 对信号量的 17 操作顺序与生产者线程是相反 不能对这三个同步对象的操作改变顺序 否则 可能造成死锁 4 生产者在生产了13号产品后本来要继续生产14号产品 可此时生产者为 什么必须等待消费者消费了4号产品后 才能生产14号产品呢 生产者和消费者 是怎样使用同步对象来实现该同步过程的呢 答 因为临界资源的访问是受限制的 程序中限定了缓冲池的大小值为 10 只有缓冲池空余时生产者才能向里边放产品 同时只有缓冲池有产品的时 候消费者才能向外取东西 当生产者生产了13号产品后 共生产了从0到13的14 个产品 但是只取走了从0到3的4个产品 所以缓冲池中的10个缓冲区就都被占 用了 所以不能继续生产14号产品 而要等到消费者消费掉一个产品后 缓冲 池有空余位置 才能继续生产14号产品 当生产者线程生产了13号产品以后 这时候Full信号量的值为10 而Empty信号量的值为0 此时若生产者线程要再 生产一个产品 先对Empty减1 此时Empty值小于零 生产者线程进入等待队列 而此时若有一个消费者线程要消费一个产品 先对Full减1 此时Full值为9 大于0 如果没有线程占用缓冲池 消费者可以消费一个产品 这样 生产者和 消费者就能实现同步过程了 5 实验体会 通过本次实验 我对 EOS 操作系统的 P V 操作的调试 以及对源码的阅读 有了一个更加深入的理解 学会了一个真正运行的操作系统中是如何通过信号 量以及 P V 操作来解决进程同步问题的 我在这次实验中遇到的难点是修改 PsReleaseSemaphore 函数使其能批量释放 虽

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论