- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 (
您可能关注的文档
- 揭秘东汉开国皇帝:光武帝刘秀之秘密方案.doc
- 揭古代十八层地狱的神秘面纱方案.doc
- 揭开货币的神秘面纱-课件2(32p)方案.ppt
- 揭秘贵金属现货交易里面的骗局与陷阱方案.doc
- 搅拌器课件方案.ppt
- 搅拌摩擦焊方案.doc
- 搅拌桩施工1方案.doc
- 揽胜广告经验之谈方案.ppt
- 搜狗拼音输入法的讲解(张荣华)方案.ppt
- 搜索引擎基本原理及实现技术——索引方案.ppt
- 2025年再生医学与生物3D打印在人工关节移植中的应用报告.docx
- 社区旧家电回收拆解产业园建设2025年产业协同与区域经济发展研究.docx
- 剧本杀行业人才流失原因分析及行业人才流失应对措施探讨.docx
- 2025县域数字农业平台在农业产业扶贫中的应用研究.docx
- 2025年自动驾驶事故责任分担法律规范与实施指南.docx
- 旅居养老产业2025年新疆区域资源整合与养老产业布局策略.docx
- 剧本杀市场2025年区域竞争态势与市场细分领域竞争策略优化.docx
- 人工智能在金融风控领域的应用风险与监管策略.docx
- 2025年城市垃圾分类监管技术应用与城市垃圾分类技术创新分析.docx
- 密室逃脱游戏主题公园升级方案:2025年科技应用分析.docx
文档评论(0)