版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软软 件件 学学 院院 操作系统实验报告操作系统实验报告 专专 业:业: 软件工程软件工程 班班 级:级: rb 软工互软工互 152 学学 号:号: 201560160226 学生姓名:学生姓名: 王泽华王泽华 指导教师:指导教师: 韩新超韩新超 实验二实验二: : 进程同步(生产者与消费者)进程同步(生产者与消费者) 一实验目的一实验目的 1)理解进程竞争资源的现象,进而理解进程的同步于互斥; 2)掌握基本的互斥与同步算法,进一步理解“生产者消费者”模型; 3)通过对“生产者消费者”问题编程实现,了解进程创建、同步信号量、 互斥信号量、临界区的创建和使用,初步了解并发程序设计方法; 4)进
2、一步理解 p、v 原语和信号量在线程互斥和同步机制中的运用。 二实验属性二实验属性 该实验为设计性实验。 三实验仪器设备及器材三实验仪器设备及器材 普通 pc386 以上微机 四四 实验理论基础实验理论基础 1、该实验中使用到相关的 windows api 函数: 1)create thread 建立新的线程; 2)create mutex 创建一个互斥体; 3)create semaphore 创建一个新的信号量; 4)release mutex 释放由线程拥有的一个互斥体; 5)release semaphore 对指定的信号量增加指定的值; 6)wait for single objec
3、t 用来检测 handle 时间的信号状态; 7)wait for multiple objects true 即等待所有信号量有效再往下执行,false 当其中一个信号量有效时向下执行; 8)close handle 关闭一个内核对象。 2、数据结构用实验一中的进程就绪队列,并在此基础上进行调度,如果队 列排序与算法要求不一致则编写一个排序函数。 3、进程调度算法:选择一种进程调度算法实现。 4、主界面设计:在实验一的界面上增加一个进程调度按钮、被调进程的 pcb 显示。 5、功能测试:从显示出的就绪队列状态和被调进程的 pcb,查看操作的正 确与否。 五五. .实验步骤实验步骤 (2)结果
4、分析: 在每个过程中先做 p(mutex),后做 v(mutex),二者要成对出现。夹 在二者中间的代码段就是该进程的临界区。 对同步信号量 full 和 empty 的 p,v 操作同样必须成对出现,但它们 分别位于不同的程序中。 无论在生产者进程中还是在消费者进程中,两个 p 操作的次序不能 颠倒:应先执行同步信号量的 p 操作,然后执行互斥信号量的 p 操作。否 则可能造成进程死锁。 6.6.实验总结实验总结 计算机操作系统中引入了进程后,极大的改善了系统资源的利用率和 提高了系统的吞吐量,但是由于多道环境中同时存在多个进程,它们共享 系统资源,各自按照各自的方式执行,给系统造成了混乱,
5、所以系统必须 提供一种机制管理进程,使这些并发执行的进程之间能有条不紊地运行, 能有效地共享资源和相互合作,使得程序的执行具有可再现性,这就是进 程同步的主要任务。 7.7.附录附录 #include #include #include using namespace std; / 生产者消费者问题,单个生产者,多个消费者,多个缓冲池 / 使用 信号量 和 关键段 来实现 using namespace std; int gi,gj; const int num = 10; / 产生数据的个数 const int size = 4; / 缓冲池的大小 volatile bool flag =
6、true; / 用于消费者线程之间 int bufsize; / 缓冲池 critical_section gc; / 关键段 handle empty,full; / semaphore unsigned int _stdcall pro(pvoid p) / 生产者线程 for(int i = 0; i = num ; i+) waitforsingleobject(empty,infinite); / 线程同步 entercriticalsection( / 线程互斥 bufgi = i; cout 生产者在 gi 号缓冲池放入 bufgi endl; gi = (gi+1)%size;
7、 leavecriticalsection( releasesemaphore(full,1,null); cout 生产者运行结束! endl; return 0; unsigned int _stdcall cus(pvoid p) / 消费者线程 while(true) waitforsingleobject(full,infinite); / 线程同步 if( flag = false ) / 线程之间的逻辑判断 break; entercriticalsection( / 线程互斥 cout 线程 getcurrentthreadid() 在缓冲池 gj 获取数据 bufgj end
8、l; if( bufgj = num ) / 结束条件 leavecriticalsection( releasesemaphore(full,1,null); flag = false; break; gj = (gj+1)%size; leavecriticalsection( sleep(50); releasesemaphore(empty,1,null); cout 消费者线程 getcurrentthreadid() 运行结束! endl; return 0; int main() / 相关变量的定义 const int sz = 3; gi = gj = 0; initializ
9、ecriticalsection( empty = createsemaphore(null,4,4,null); full = createsemaphore(null,0,4,null); handle handsz; hand0 = (handle)_beginthreadex(null,0,pro,null,0,null); / 创建了三个线程 hand1 = (handle)_beginthreadex(null,0,cus,null,0,null); hand2 = (handle)_beginthreadex(null,0,cus,null,0,null); waitformultipleobjects(sz,han
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交样工作制度
- 信通科工作制度
- 一米线工作制度
- 区地震工作制度
- 医保科工作制度
- 代办点工作制度
- 医务处工作制度
- 十必谈工作制度
- 军转办工作制度
- 创文工作制度
- 2026季华实验室测试中心招聘5人(广东)笔试参考题库及答案解析
- 电力建设“五新”推广应用信息目录(试行)
- 素能培优(七)平面向量与三角形的“四心”
- 核磁教学讲解课件
- 铁路工地混凝土拌和站标准化管理实施意见(工管办函2013283号)
- 大学专业排名证明(模板)
- 空域规划与管理
- 2023年湖北通山城市发展(集团)有限责任公司招聘笔试题库含答案解析
- 医用辐射防护与安全(省辐射站)
- 循环流化床锅炉检修规程
- 拉丁舞比赛服饰装饰元素的演变,服装设计论文
评论
0/150
提交评论