- 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)