进程同步模拟设计—生产者和消费者_第1页
进程同步模拟设计—生产者和消费者_第2页
进程同步模拟设计—生产者和消费者_第3页
进程同步模拟设计—生产者和消费者_第4页
进程同步模拟设计—生产者和消费者_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、学 号: 0121010340621课 程 设 计题 目进程同步模拟设计生产者和消费者问题学 院计算机科学与技术学院专 业计算机科学与技术专业班 级1006班姓 名丁探指导教师刘洪星2013年1月17日课程设计任务书学生姓名: 丁探 专业班级: 计算机1006 指导教师: 刘洪星 工作单位: 计算机科学与技术学院 题 目: 进程同步模拟设计生产者和消费者问题 初始条件:1预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1模拟用信

2、号量机制实现生产者和消费者问题。2设计报告内容应说明: 课程设计目的与功能; 需求分析,数据结构或模块说明(功能与框图); 源程序的主要部分; 运行结果与运行情况分析; 自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭

3、,一旦发现,抄与被抄的一律按0分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目 录1、 需求分析.42、 功能设计.53、源程序.84、运行结果.135、总 结.166、参考文献.16生产者消费者问题1. 需求分析1.1问题描述: 一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。1.2规则:n 对于生产者进程:产生一个数据,当要送入缓冲区时,要检查缓冲区是否已满,若未满,则可将数据送入缓冲区,并通知消费者进程;否则,等待;n 对于消费者进程:当它去取数据时,要看缓冲区中是否有数据可取,若有则取走一个数据,并通知生产者进

4、程,否则,等待。n 缓冲区是个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,所以,还有个互斥的问题。1.3信号灯设置 :两个同步信号灯-    empty :表示空缓冲区的数目,初值为有界缓冲区的大小n;     full : 表示满缓冲区(即信息)的数目,其初值为0;一个互斥信号灯-    mutex:互斥信号灯,初值为1。 1.4同步描述: 1.5程序描述:main( )        int full=0; /*满缓冲区的数目*/    int empty=

5、n;/*空缓冲区的数目*/    int mutex=1;/*对有界缓冲区进行操作的互斥信号灯*/    cobegin    p1 ( ); p2( );    coend    p1() while(生产未完成) ··· 生产一个产品; p(empty); p(mutex); 送一个产品到有界缓冲区; v(mutex); v(full); p2( ) while(还要继续消费) p(full); p(mutex); 从有界缓冲区中取产品; v(mutex); v

6、(empty); ··· 消费一个产品; 1.6 C+语言程序模拟用信号量机制实现生产者和消费者问题:本次课程设计主要通过C+模拟信号量制中各个进程,及各进程之间的互斥、同步关系,来实现生产者和消费者问题。2. 功能设计2.1设计目的:通过实验模拟生产者和消费者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下: 1)掌握基本的同步互斥算法,理解生产者和消费者模型; 2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥; 3)学习使用windows中基本的同步对象,掌握相应的API。2.2设计功能:

7、利用模拟用信号量机制实现生产者和消费者问题:通过用户控制取进程和放进程,反应生产者和消费者问题中所涉及的进程的同步与互斥。2.3数据流程图:1、生产者2、消费者2.4模块说明:const unsigned short SIZE_OF_BUFFER = 10; /缓冲区长度 unsigned short ProductID = 0; /产品号 unsigned short ConsumeID = 0; /将被消耗的产品号 unsigned short in = 0; /产品进缓冲区时的缓冲区下标 unsigned short out = 0; /产品出缓冲区时的缓冲区下标 int g_buffe

8、rSIZE_OF_BUFFER; /缓冲区是个循环队列 bool g_continue = true; /控制程序结束 HANDLE g_hMutex; /用于线程间的互斥 HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); /生产者线程 DWORD WINAPI Consumer(LPVOID); /消费者线程 3、源程序#include <windows.h>#include <iostream>

9、const unsigned short SIZE_OF_BUFFER = 20;/有界缓冲区长度int g_bufferSIZE_OF_BUFFER;/开辟缓冲区,用数组表示,可以看成是一个循环队列unsigned short ProductID = 0;/新生产出来的产品的产品号unsigned short ConsumeID = 0;/被消耗的产品的产品号unsigned short in = 0;/产品进缓冲区时的缓冲区下标,用于记录生产者的指针位置unsigned short out = 0;/产品出缓冲区时的缓冲区下标,用于记录消费者的指针位置bool g_continue = 1

10、;/控制程序运行:1表示继续运行,0表示停止运行HANDLE g_hMutex;/线程间的互斥信号量HANDLE g_hFullSemaphore;/资源信号量:缓冲区满HANDLE g_hEmptySemaphore;/资源信号量:缓冲区空DWORD WINAPI Producer(LPVOID);/生产者线程DWORD WINAPI Consumer(LPVOID);/消费者线程const unsigned short PRODUCERS_COUNT=4;/生产者的个数const unsigned short CONSUMERS_COUNT=3;/消费者的个数const unsigned

11、short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/总线程数HANDLE hThreadsPRODUCERS_COUNT;/各线程的handleDWORD producerIDCONSUMERS_COUNT;/生产者线程的标识符DWORD consumerIDTHREADS_COUNT;/消费者线程的标识符/*-生产一个产品开始-*/生产一个产品,输出其ID号void Produce()std:cout<<std:endl;std:cerr<<"生产一个产品: "<<+ProductI

12、D;std:cout<<std:endl;/*-生产一个产品结束-*/*-把新生产的产品放入缓冲区开始-*/把新生产的产品放入缓冲区void Append()std:cerr<<"把生产的产品送入缓冲区"g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<"缓冲区 产品 生产者/消费者"<<std:endl;/新产品放入缓冲区后,输出缓冲区当前的状态for(int i=0;i<SIZE_OF_

13、BUFFER;+i) /输出缓冲区下标if (i<10)std:cout<<i<<" "<<g_bufferi;elsestd:cout<<i<<" "<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 生产者"/输出生产者的指针位置if(i=out)if(g_b

14、ufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消费者"/输出消费者的指针位置std:cout<<std:endl;/*-把新生产的产品放入缓冲区结束-*/*-消费一个产品开始-*/void Consume()/消费一个产品std:cout<<std:endl;std:cerr<<"消费一个产品: "<<ConsumeID;std:cout<<st

15、d:endl;/*-消费一个产品结束-*/*-从缓冲区中取出一个产品开始-*/从缓冲区中取出一个产品void Take()std:cout<<std:endl;std:cerr<<"从缓冲区取出一个产品"ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<std:endl;std:cout<<"缓冲区 产品 生产者/消费者"<<std:endl;/取出一个产品后,输出缓冲区当前的状

16、态for(int i=0;i<SIZE_OF_BUFFER;+i) /输出缓冲区下标if(i<10)std:cout<<i<<" "<<g_bufferi;elsestd:cout<<i<<" "<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 生产者"/

17、输出生产者的指针位置if(i=out)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消费者"/输出消费者的指针位置std:cout<<std:endl;/*-从缓冲区中取出一个产品结束-*/*-生产者线程开始-*/生产者线程DWORD WINAPI Producer(LPVOID lpPara) while(g_continue)/资源信号量的P操作WaitForSingleObject(g_hFul

18、lSemaphore,INFINITE); /互斥信号量的P操作WaitForSingleObject(g_hMutex,INFINITE); /生产一个产品Produce();/把新生产的产品放入缓冲区Append();Sleep(2000);/互斥信号量的V操作ReleaseMutex(g_hMutex); /资源信号量的V操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/*-生产者线程结束-*/*-消费者线程开始-*/消费者线程DWORD WINAPI Consumer(LPVOID lpPara) while(g_conti

19、nue)/资源信号量的P操作WaitForSingleObject(g_hEmptySemaphore,INFINITE); /互斥信号量的P操作WaitForSingleObject(g_hMutex,INFINITE); /从缓冲区中取出一个产品Take();/消费一个产品Consume();Sleep(2000);/互斥信号量的V操作ReleaseMutex(g_hMutex); /资源信号量的V操作ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;/*-消费者线程结束-*/*-创建生产者线程开始-*/void createPT()/

20、创建生产者线程for(int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)g_continue=0;/*-创建生产者线程结束-*/*-创建消费者线程开始-*/void createCT()/创建消费者线程for (int j=0;j<CONSUMERS_COUNT;+j)hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,&consum

21、erIDj);if (hThreadsj=NULL)g_continue=0;/*-创建消费者线程结束-*/*-主函数开始-*/void main()/创建互斥信号量g_hMutex=CreateMutex(NULL,FALSE,NULL); /创建资源信号量g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/创建生产者线程createPT();/创建消费者线程createCT();/不按回车键的话程序会一直运行下

温馨提示

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

评论

0/150

提交评论