实际操作系统实验五.docVIP

  • 21
  • 0
  • 约6.01千字
  • 约 16页
  • 2019-11-11 发布于安徽
  • 举报
-/ PAGE 操作系统 实 验 报 告 课程名称 操作系统实验 实验项目名称 操作系统实验报告物理存储器与进程逻辑地址空间的管理 学号 2011 班级 姓名 型钢 专业 学生所在学院 指导教师 实验室名称地点 哈尔滨工程大学 -/ 一、实验概述 1. 实验名称 进程的同步 2. 实验目的 1.使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。 2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。 3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 3. 实验类型 验证 二、实验环境 OS Lab 三、实验过程 3.1 准备实验 按照下面的步骤准备本次实验: 1. 启动OS Lab。 2. 新建一个EOS Kernel项目。 3. 生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。 4. 新建一个EOS应用程序项目。 5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。 3.2 使用EOS的信号量解决生产者-消费者问题 按照下面的步骤查看生产者-消费者同步执行的过程: 1. 使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。 2. 按F7生成修改后的EOS应用程序项目。 3. 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 4. 在调试异常对话框中选择“否”,继续执行。 5. 立即激活虚拟机窗口查看生产者-消费者同步执行的过程。 6. 待应用程序执行完毕后,结束此次调试。 3.3 调试EOS信号量的工作过程 3.3.1 创建信号量 按照下面的步骤调试信号量创建的过程: 1. 按F5启动调试EOS应用项目。OS Lab会首先弹出一个调试异常对话框。 2. 在调试异常对话框中选择是,调试会中断。 3. 在main函数中创建Empty信号量的代码行(第77行) EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一个断点。 4. 按F5继续调试,到此断点处中断。 5. 按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsCreateSemaphoreObject函数来创建信号量对象。 6. 按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject函数。在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。 7. 在semaphore.c文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。 8. 按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。 9. 按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开调用堆栈窗口,查看函数的调用层次。 3.3.2 等待、释放信号量 3.3.2.1 等待信号量(不阻塞) 生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试: 1. 删除所有的断点(防止有些断点影响后面的调试)。 2. 在eosapp.c文件的Producer函数中,等待Empty信号量的代码行(144)WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。 3. 按F5继续调试,到断点处中断。 4. WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。所以,在semaphore.c文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。 5. 按F5继续调试,到断点处中断。 6. 按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。 如图所示,empty的初始值为10。 在完成PsWaitFor

文档评论(0)

1亿VIP精品文档

相关文档