实验四-进程的同步.docxVIP

  • 32
  • 0
  • 约4.38千字
  • 约 17页
  • 2022-06-30 发布于上海
  • 举报
上海应用技术学院 程序设计语言实验报告 实验名称 进程的同步 实验序号 实验四 实验日期 姓 名 学 号 指导教师 专 业 计算机科学与技术 班 级 成 绩 一、实验目的及要求 使用 EOS 的信号量编程解决生产者—消费者问题,理解进程同步的意义。 调试跟踪 EOS 的信号量的工作过程,理解进程同步的原理。 修改 EOS 的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 二、实验环境 Windows XP;Tevation OS Lab。 三、实验内容 准备实验 按照下面的步骤准备本次实验: 新建一个 EOS Kernel 项目。如图 1. 图 1 分别使用 Debug 配置和 Release 配置生成此项目,从而在该项目文件夹中生成完全版本的 EOS SDK 文件夹,如图 2、图 3。 图 2 图 3 新建一个 EOS 应用程序项目,如图 4。 图 4 使用在第 3 步生成的 SDK 文件夹覆盖 EOS 应用程序项目文件夹中的 SDK 文件夹,使用 Debug 配置和 Release 配置生成此项目如图 5、6,并重新生成此项目; 图 5 图 6 使用 EOS 的信号量解决生产者-消费者问题 使用 pc.c 文件中的源代码替换之前创建的 EOS 应用程序项目中的 EOSApp.c 文件内的源代码。 按 F7 生成修改后的 EOS 应用程序项目。 按 F5 启动调试。OS Lab 会首先弹出一个调试异常对话框如图 7。 图 7 在调试异常对话框中选择“否”,继续执行。 立即激活虚拟机窗口查看生产者-消费者同步执行的过程,如图 8。 图 8 结束此次调试。 调试 EOS 的信号量的工作过程 创建信号量 按 F5 启动调试 EOS 应用项目。OS Lab 会首先弹出一个调试异常对话框如图 9。 图 9 在调试异常对话框中选择“是”,调试会中断。 在 main 函数中创建 Empty 信号量的代码行(第 77 行) EmptySemaphoreHandle = CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一个断点如图 10。 图 10 按 F5 继续调试,到此断点处中断如图 11。 图 11 按 F11 调试进入 CreateSemaphore 函数。可以看到此 API 函数只是调用了 EOS 内核中的 PsCreateSemaphoreObject 函数来创建信号量对象,如图 12。 图 12 按 F11 调试进入 semaphore.c 文件中的 PsCreateSemaphoreObject 函数。在此函数中会在由 EOS 内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象的各个成员的操作是在 PsInitializeSemaphore 函数中完成的,如图 13。 图 13 在 semaphore.c 文件的顶部查找到 PsInitializeSemaphore 函数的定义(第 19 行), 在此函数的第一行(第 39 行)代码处添加一个断点,如图 14。 图 14 按 F5 继续调试,到断点处中断,如图 15。观察 PsInitializeSemaphore 函数中用来初始化信号量结构体成员的值,应该和传入 CreateSemaphore 函数的参数值是一致的。 图 15 等待、释放信号量 等待信号量(不阻塞) 开始时所有的缓冲区都是空的,所以第一次调用 WaitForSingleObject 函数等待 Empty 信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试: 删除所有的断点(防止有些断点影响后面的调试)。 在 eosapp.c 文件的 Producer 函数中,等待 Empty 信号量的代码行(第 144 行)(如图 16) WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。 图 16 按 F5 继续调试,到断点处中断,如图 17。 图 17 WaitForSingleObject 函数最终会调用 PsWaitForSemaphore 函数完成等待操作。所以,在 semaphore.c 文件中 PsWaitForSemaphore 函数的第一行(第 68 行)代码处添加一个断点,如图 18。 图 18 按 F5 继续调试,到断点处中断,如图 19。 图 19 按 F10 单步调试,直到完成 PsWaitForSemaphore 函数中的所有操作。可以看到此次执行并没有进行等待,只是将 Empty 信号量的计数减少了 1(由 10 变为了 9)就返回了,如图 20。 图 20 释放信号量(不唤醒) 删除所有的断点(防止有些断点影响后面的

文档评论(0)

1亿VIP精品文档

相关文档