进程线程的同步与互斥试验报告_第1页
进程线程的同步与互斥试验报告_第2页
进程线程的同步与互斥试验报告_第3页
进程线程的同步与互斥试验报告_第4页
进程线程的同步与互斥试验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统实验报告课程名称操作系统实验名称进程(线程)的同步与互斥成绩学生姓名作业君 专业软件工程班级、学号同组者姓名无实验日期 2020一、实验题目:进程(线程)的同步与互斥二、实验目的:自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状 态转换及其所带来的PCB内容、组织的变化,理解进程与其 PCBh的一一对应关系。.掌握基本的同步与互斥算法,理解生产者消费者模型。.学习使用 Windows中基本的同步对象,掌握相关 API的使用方法。, 了解Windows中多线程的并发执行机制,实现进程的同步与互斥三、实验内容与要求:1.实验内容以生产者/消费者模型为依据,在Wind

2、ows环境下创建一个控制台进程,在该进程 中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。2.实验要求学习并理解生产者/消费者模型及其同步/互斥规则;学习了解 Windows同步对象及其特性;熟悉实验环境,掌握相关API的使用方法;设计程序,实现生产者/消费者进程(线程)的同步与互斥;四、算法描述(含数据结构定义)或流程图#include #include #include #include #include #include using namespace std;共8一页(第一1一页)评阅教师时间#define MAX_THREAD_NUM 64/#define INTE_

3、PER_SEC 1000/const int SIZE_OF_BUFFER = 10;/int ProductID = 0;/int ConsumeID = 0;/int in = 0;/缓冲区下标int out = 0;/标bool running = true; /int g_bufferSIZE_OF_BUFFER;/HANDLEl_hMutex;/HANDLE g_hFullSemaphore;/迫使生产者等待HANDLfg_hEmptySemaphore;/消费者等待最大线程数延迟时间的毫秒值缓冲区长度产品号将被消耗的产品号产品进缓冲区时的产品出缓冲区时的缓冲区下判断程序能否继续执行

4、的逻辑值缓冲区是个循环队列公有信号量,用于线程间的互斥 生产者的私有信号量,当缓冲区满时消费者的私有信号量,当缓冲区空时迫使/定义一个结构体用于存储线程的信息struct ThreadInfo线程号线程类别(生产者或消费者)等待时间操作时间int serial; / char entity; / double delay; / double persist; /;/生产者void Producer(void* p)/定义变量用于存储当前线程的信息DWORD m_delay;DWORD m_persist;int m_serial;/从参数中获得信息m_serial = (ThreadInfo*

5、)(p)-serial;m_delay = (DWORD)(ThreadInfo*)(p)-delay * INTE_PER_SEC);m_persist = (DWORD)(ThreadInfo*)(p)-persist * INTE_PER_SEC);while (running)/P操作cout 生产者线程 m_serial 请求生产. endl;WaitForSingleObject(g_hEmptySemaphore, INFINITE);评阅教师时间共8一页(第一2一页)cout 生产者线程 m_serial WaitForSingleObject(g_hMutex, INFINI

6、TE);Sleep(m_delay); 延迟等待/生产一个产品cout 生产者线程 m_serial 产品成功. endl;cout 生产者线程 m_serial ”投入缓冲区. endl;把新生产的产品放入缓冲区g_bufferin = ProductID;in = (in +1)%SIZE_OF_BUFFER;Sleep(m_persist); / 操作等待 cout 生产者线程 m_serial 入缓冲区中成功. endl;请求独占缓冲区. endl;生产 +ProductID 号请求将产品 ProductID 将产品 ProductID 投cout I* endl n当前缓冲区情况如图

7、(代表已有产品,口代表没有产品):endl;for (int i = 0;i SIZE_OF_BUFFER;+i) (if (g_bufferi != 0) cout else cout 口;cout nn*n serial;m_delay = (DWORD)(ThreadInfo*)(p)-delay * INTE_PER_SEC);m_persist = (DWORD)(ThreadInfo*)(p)-persist * INTE_PER_SEC); while (running)共&一页(第一3一页)评阅教师时间/输出缓冲区当前的状态/P操作cout 消费者线程 m_serial 请求消

8、费. endl;WaitForSingleObject(g_hFullSemaphore, INFINITE);cout 消费者线程 m_serial WaitForSingleObject(g_hMutex,INFINITE);请求独占缓冲区. endl;Sleep(m_delay); / 延迟等待/从缓冲区中取出一个产品cout 消费者线程 m_serial ConsumeID = g_bufferout;g_bufferout = 0;out = (out + 1) % SIZE_OF_BUFFER;cout 消费者线程 m_serial 成功. endl;请求取出一个产品. endl;

9、取出产品 ConsumeID 消耗一个产品cout 消费者线程 m_serial 开始消费消费产品 ConsumeID . endl;Sleep(m_persist);cout 消费者线程 m_serial 消费产品 ConsumeID 成功. endl;/输出缓冲区当前的状态cout I* endl n当前缓冲区情况如图: endl;for (int i = 0;i SIZE_OF_BUFFER;+i) (if (g_bufferi != 0) cout else cout ;cout nn*n endl;/V操作ReleaseMutex(g_hMutex);ReleaseSemaphore

10、(g_hEmptySemaphore, 1, NULL); ).)void prod_cons()(./创建互斥信号量g_hMutex = CreateMutex(NULL, FALSE, NULL);评阅教师时间共&一页(第一4一页)/创建同步信号量g_hEmptySemaphore= CreateSemaphore(NULL, SIZE_OF_BUFFERS IZE_OF_BUFFER, NULL);g_hFullSemaphore = CreateSemaphore(NULL, 0, SIZE_OF_BUFFER, NULL);srand(unsigned)time(NULL); / 以

11、时间函数为种子const unsigned short THREADS_COUNT = rand() % 5 + 5; /总的线程数(随机生成)/线程对象的数组HANDLE hThreadsMAX_THREAD_NUM;Threadinfo thread_infoMAX_THREAD_NUM;DWORD thread_ID; / 线程 IDint num = 0;/ 临时变量,用于循环语句cout 系统开始模拟,并自动生成模拟数据.” endl;system(pause); 暂停确认开始执行cout 线程总数: THREADS_COUNT endl;/循环随机生成各个线程的信息while (n

12、um != THREADS_COUNT)(thread_infonum.serial = num + 1;if (rand() % 2 = 1)thread_infonum.entity = P;elsethread_infonum.entity = C;thread_infonum.delay = rand() % 5 + 1;thread_infonum.persist = rand() % 6 + 2;num+;)cout n 系统生成数据结束,模拟数据如下: endl 线程号 线程类别延迟时间操作时间 endl;for (int x = 0;x THREADS_COUNT;x+)cou

13、t thread_infox.serial t thread_infox.entity t thread_infox.delay tt thread_infox.persist endl;cout nn=生产者-消费者 开始=n endl;/创建线程for (int i = 0;i THREADS_COUNT;i+)(共一8一页(第一5一页)评阅教师时间/创建生产者线程if (thread_infoi.entity = P)hThreadsi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Producer), &thread_infoi, 0, &t

14、hread_ID);/创建消费标程 elsehThreadsi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consumer), &thread_infoi, 0, &thread_ID); while (running)if (getchar()/按回车后终止程序运行 running = false;cout 系统模拟结束. endl;int main()cout n=4产者-消费者 模拟=n endl;prod_cons();.五、实验过程1、记录生产者和消费者的同步执行过程。隆挈鬻霸模段踹下:操作时间 TOC o 1-5 h z 1P522C

15、443C234G545G2?共 8一页(第一6一页)评阅教师时间生产者一稍费者开始=&冲 ,X- 成器 柜 S1A 新,产 产占号汽1 主快肖01:?011肖1多口口 ,一K.-K/IKU,上KUKr., -,dndL/V/Id,二刁一广 Hr 请请请请请请将111-K-M口王呈口三呈口王口王口王口舌王三 二线戏一一 I者者公 三匚 一 U LL1J X线线线线线线者者者者者者.产产费辖.费费留扫扫肖肖肖r-u一生消泮充K情况如图代表已有产品,代表没有产品: 品 区区一-&-B-个 ;一工消i,J-品产占口霸品生独独1产道产ssstt-请请请请取香14 14 4 4 4口王口王王口王口王口王口

16、王5芭-K /声土产*再YK VQ括一招一布卷一卷一标一幺k幺k把k2E 丁幺L者者者者者者者产费产费费费费E4.当前缓冲区情况如图二AWg-冲区中成功.成襄一 斐 一一口 D2消2将品厂型 基请将共4 111二 呈口王匚一吉王二 一一二一二TW 二线线线者者看看一一费产产产一一T生生一 代表已有产品,代表没有产品力 口口 - 30-1- 2捎 2 一一 产出口胃呐一“ 生独独1产遁匚一 请请请请取信一1 s f 5ss 5 二 二 口王口王口王口王口王日王匕王-J J J-JF -7 -!- -J- J-JF :菁菁舂昔音音音一”产费产费费覆费一”生*消消消消霸普分析Producer函数和Consumer函数的功能,并画出对应的程序流程图。评阅教师时间8一页(第一7一页)2、共Producer函数:调用函数,获取资源情况,然后判断条件是否满足,判断是否执行, 接着发出生产请求,请求通过后独占缓冲区资源,接着生产-一个产品投入缓冲区,成 功后释放所占缓冲区资源,到此此函数执行完成。consumer函数:通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出消费请求, 请求通过后独占缓冲区资源, 接着消费一个产品取出缓 冲区,成功后释放所占缓冲区资源, 到此此函数执行完成。3、试将同步和互斥的P操作颠倒次序执行,观察并分析程序的运行情况。答:如将同步和互斥的P操作颠倒次序执

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论