2022年操作系统实现生产者消费者问题 .pdf

上传人:Q****o 文档编号:28030188 上传时间:2022-07-26 格式:PDF 页数:13 大小:312.45KB
返回 下载 相关 举报
2022年操作系统实现生产者消费者问题 .pdf_第1页
第1页 / 共13页
2022年操作系统实现生产者消费者问题 .pdf_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《2022年操作系统实现生产者消费者问题 .pdf》由会员分享,可在线阅读,更多相关《2022年操作系统实现生产者消费者问题 .pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、操作系统课程设计- 0 -操作系统综合设计实现生产者消费者问题目录第一部分:实现生产者与消费者问题一、题目21、 课程设计目的2 2、 课程设计要求2 二、设计内容2 三、开发环境3 四、分析设计3 1、 设计原理3 2、 涉及的数据结构5 3、 流程图6 五、运行示例及结果分析8 1、 运行示例8 2、运行结果分析: 9 六、个人体会9 七、附录(源程序) 10 第一部分:实现生产者与消费者问题一、题目:实现生产者与消费者问题名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,

2、共 13 页 - - - - - - - - - 操作系统课程设计- 1 -此问题是经典的进程同步互斥问题,问题描述参见教材第36 页和第 46 页,要求编程实现,生产者放入产品的和消费者取走产品的速度可以调节。1、课程设计目的:在我们所学的 操作系统 这门课程中, 关于经典进程的同步问题进行了一定的描述和探讨, 介绍了几个经典的算法, 需要我们在实践中学会熟练运用。在生产者与消费者问题中, 需要我们了解进程同步的概念, 理解信号量机制的原理,掌握运用信号量解决进程同步问题的方法,进而学会运用进程的同步与互斥解决生产者与消费者的冲突问题。2、课程设计要求:生产者与消费者问题可以算作是经典进程同

3、步问题的典型代表。该课程设计要求运用基于单缓冲区和多缓冲区的生产者与消费者问题的多种实现机制, 其中利用了数据结构中的循环队列和堆栈来模拟实现是一种比较容易实现的方法。这种思想能够帮助我们更好的理解所学内容,并加以锻炼我们的动手实践能力, 实现它内在具有的超强的参考价值和实践意义。该课程设计通过了解进程间的两种制约关系,从而理解信号量机制; 通过对实例的分析和讨论, 理解信号量机制实现进程的同步及互斥的方法;通过对经典进程同步问题的剖析,初步掌握运用信号量解决进程同步问题的方法。二、设计内容在同一个进程地址空间内执行的两个线程。生产者线程生产物品, 然后将物品放置在一个空缓冲区中供消费者线程消

4、费。消费者线程从缓冲区中获得物品,然后释放缓冲区。 当生产者线程生产物品时, 如果没有空缓冲区可用, 那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时, 如果没有满的缓冲区, 那么消费者线程将被阻塞, 直到新的物品被生产出来, 我的具体做法也是如此,建立缓冲区,生产者生产的产品放入,消费者从中取产品,如果没有产品,则等待。三、开发环境此程序的设计在Windows XP操作系统下 , 基于 Microsoft Visual C+6.00环境下的一个关于实现生产者与消费者问题的程序。用C语言实现编程。名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

5、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 操作系统课程设计- 2 -四、分析设计1、设计原理进程同步是指几个进程相互合作,一个进程到达某个点后, 除非另一个进程已经完成某些操作, 否则就不得不停下来, 等待这些操作的结束, 这就是进程同步的概念。生产者 - 消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。 本作业要求设计在同一个进程地址空间内执行的两个线程。 生产者线程生产物品, 然后将物品放置在一个空缓冲区中供消费者线程消费。 消费者线程从

6、缓冲区中获得物品,然后释放缓冲区。 当生产者线程生产物品时, 如果没有空缓冲区可用, 那么生产者线程必须等待消费者线程释放出一个空缓冲区。 当消费者线程消费物品时, 如果没有满的缓冲区, 那么消费者线程将被阻塞,直到新的物品被生产出来。生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费或生产某类资源, 当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者是相互等效的,只要缓冲区未满,生产者就可以将产品送入缓冲区,类似地,只要缓冲区未空,消费者就可以

7、从缓冲区中去走物品并消费它。生产者和消费者的同步关系将禁止生产者向满的缓冲区输送产品,也禁止消费者从空的缓冲区中提取物品。在生产者消费者问题中,信号灯具有两种功能。首先,它是跟踪资源的生产和消费的计数器; 其次,它是协调资源的生产者和消费者之间的同步器。消费者通过再一指派给它的信号灯上做P操作来表示消耗资源, 而生产者通过在同一信号灯上做 V操作来表示生产资源。 再这种信号灯的实施中, 计数在每次 P操作后减 1,而在每次 V操作中加 1。个这一计数器的初始值是可利用的资源数目。当资源是不可利用时, 将申请资源的进程放置在等待队列中。如果有一个资源释放,在等待队列中的第一个进程被唤醒并得到资源

8、的控制权。为解决这一类生产者消费者问题,设置了两个同步信号灯,一个说明空缓冲区的数目,用 empty 表示,其初值为有界缓冲区的大小n,另一个说明缓冲区的数目,用full表示,其初制值为0。由于有界缓冲区是一个零界资源,必须互斥使用,所以另外还需设置一个互斥信号灯mutex, 起初值为 1。假定在生产者和消费者之间的公用缓冲区中,具有 n 个缓冲区,这时可以利用互斥信号量 mutex实现诸进程对缓冲池的互斥使用; 利用信号量 empty和 full名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

9、- - 第 3 页,共 13 页 - - - - - - - - - 操作系统课程设计- 3 -分别表示缓冲池中空缓冲区和满缓冲区的数量。又假定这些生产者和消费者互相等效果,只要缓冲池未满,生产者便可以将消息送入缓冲池;只要缓冲池未空,消费者便可以从缓冲池中取走一个消息。在生产者 - 消费者问题中应注意:首先,在每个程序中用于互斥的wait(mutex) 和 signal(mutex)必须成对出现;其次, 对资源信号量 empty 和 full的 wait 和 signal操作,同样需要成对地出现,但它们分别处于不同的程序中。生产者与消费者进程共享一个大小固定的缓冲区。其中,一个或多个生产者生

10、产数据,并将生产的数据存入缓冲区, 并有一个或多个消费者从缓冲区中取数据。假设缓冲区的大小为n(存储单元的个数),它可以被生产者和消费者循环使用。分别设置两个指针in 和 out ,指向生产者将存放数据的存储单元和消费者将取出数据的存储单元,如图,指针in 和 out 初始化指向缓冲区的第一个存储单元。生产者从第一个存储单元开始存放数据,一次存放一条数据一条数据且in 指针向后移一个位置, 当 in 指针指向第 n 个存储单元, 下一次将指向第一个存储单元, 如此循环反复使用缓冲区。 消费者从缓冲区中逐条取走数据,一次取一条数据,相应的存储单元变为“空” ,可以被生产者再次使用。每次取走一条数

11、据, out 指针向后移一个存储单元位置。试想,如果不控制生产者与消费者,将会产生什么结果? 1 2 3 4 5 6 7 8 n , In out 1 2 3 4 5 6 7 8 n , In out 其中, in 表示存数据位置, out 表示取数据位置: :被占用单元:空存储单元图:生产者 / 消费者循环使用缓冲区首先,生产者和消费者可能同时进入缓冲区,甚至可能同时读/ 写一个存储单元,将导致执行结果不确定。这显然是不允许的。所以,必须使生产者和消费者互斥进入缓冲区。即某时刻只允许一个实体(生产者或消费者)访问缓冲区,名师资料总结 - - -精品资料欢迎下载 - - - - - - - -

12、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - 操作系统课程设计- 4 -生产者互斥消费者和其他任何生产者。其次, 生产者不能向满的缓冲区写数据, 消费者也不能在空缓冲区中取数据,即生产者与消费者必须同步。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待, 直到消费者取走一个存储单元的数据,唤醒它。若缓冲区内有“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区

13、的使用权,将数据存入缓冲区,释放缓冲区的使用权。 消费者取数据之前, 首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空” ,则阻塞等待,否则,判断缓冲区是否正在被使用,若正被使用,若正被使用,则阻塞等待,否则,获得缓冲区的使用权,进入缓冲区取数据,释放缓冲区的使用权。其执行流程如图所示,伪代码如图所示。2、涉及的数据结构用资源向量 Available 。这是一个含有 m个元素的数组,其中的每一个元素代表一类可利用的资源数目, 其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Availablej=K,则表示系统中县有 RJ类资源 K个。需求

14、矩阵 MAX 。这是一个 N*M的矩阵,它定义了系统中N个进程中的每一个进程对 M类资源的最大需求。如果MAXi,j=K ,则表示进程 I 需要 RJ类资源的最大数目为 K。矩阵 Allocation。这也是一个N*M的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocationi,j=K,则表示进程 i 当前已分得 RJ类资源的数目为 K。矩阵 Need 。这也是一个N*M的矩阵,用以表示每一个进程尚需的各类资源数。如果 Needi,j=K,则表示进程 I 还需要 RJ类资源 K个,方能完成其任务。上述三个矩阵间存在下述关系: Needi,j=MAXi,j-Alloc

15、ationi,j 3、流程图生产一条数据等待资源,阻塞名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - 操作系统课程设计- 5 -无有否是否可用存储单元是否可用被唤醒是否有数据单元名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 13 页 - - - - - - - - - 操作系统课程设计- 6 -有否是五

16、、运行示例及结果分析1、运行示例:是否可用空单元加 1,唤醒一个生产者取走一条数据归还使用权消费数据等待资源,阻塞被唤醒等待使用权,阻塞被唤醒名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 13 页 - - - - - - - - - 操作系统课程设计- 7 -2、运行结果分析:此程序可自动输入生产者、 消费者数目等条件, 但程序执行过程中也进入了一种无限循环状态,若要得到较好的结果和界面需要加强编程练习。名师资料总结 - - -精品资料欢迎下载 - - - - - -

17、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 13 页 - - - - - - - - - 操作系统课程设计- 8 -六、个人体会经过快一个月的时间来弄这个大型作业。我当时真的有点力不从心。后来老师只要我们实现OS 里面的一部分功能 -进程的控制和管理。就是比较有名的那两个进程算法。 有于当时在实验室就对进程之间的运转有了一个全面的了解,虽然好多的细节部分还不是太了解,但是对一个进程的流向和执行过程还是有个大概的认识,所以这个大型作业做起来也不是那么的简单。那些东西的详细说明在我们的教材上是没有的。后来,我就在网上和图书馆大量的找资料

18、。先对那些算法有一个大致全面的了解。 经过两个多星期的查资料。我就开始对那两个算法的代码进行完善和修改,以达到我的要求。 有经过了一个多星期的调试和运行终于达到了我的要求了。并把结果截取如下。在生产者与消费者问题的算法编写程序的时候要尽可能用全所学到的函数,因为这是检测我们用C 语言进行程序设计的能力的重要方式。在编写程序的时候我们不可能一次就成功,往往一个图形要修改甚至是十几次数据才能得到预期的结果。 因此在编写程序的时候一定不能急躁,要耐心地检测输入的数据和输出的结果, 在没达到预期目的的情况下, 要及时修改数据进行下一次的检测,只有这样才能成功地用C 语言编写出需要的程序。编写程序是一个

19、长期的过程,因此不能急躁,要坐的住。由于对C 语言知识已经有些遗忘,所以我找出了以前的笔记,花了半天的时间去回忆和理解。对操作系统有关消费者 -生产者问题的含义也已经有点模糊, 我花了一天的时间看教材,还到图书馆借阅了相关的资料,才开始编程。 刚开始对如何动态实现消费者-生产者问题一筹莫展, 于是和一些同学就这个问题讨论过,但是没什么好的效果。编写程序有的时候需要的就是灵感,因此当有灵感的时候就要开始做,而不能等,必须在灵感未消失前付诸行动, 所以才有了凌晨两点才最后做完大型作业。虽然很累,但是觉得值得。历经快一个月的时间让我马马乎乎的完成了它,从中让我得到了好多的东西,首先,这个过程锻炼了我

20、的意志, 还让我对进程的控制和编写过程有了一个更深层次的认识和理解。其次,我现在对Windows 操作系统执行流程有了一个透明的认识,同时也让我对它更有亲切感。总之,这次作业让我受益匪浅!七、附录 ( 源程序 ) #include #include #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 13 页 - - - - - - - - - 操作系统课程设计- 9 -typedef HANDLE Semaphore; /信号量的 Windows 原型#d

21、efine P(S) WaitForSingleObject(S, INFINITE) / 定义 Windows 下的 P 操作#define V(S) ReleaseSemaphore(S, 1, NULL)/ 定义 Windows 下的 V 操作#define rate 1000 #define CONSUMER_NUM 4 /* 消费者个数*/ #define PRODUCER_NUM 4 /* 生产者个数*/ #define BUFFER_NUM 4 /* 缓冲区个数*/ char *thing10=s1, s2, s3, s4,; struct Buffer int productB

22、UFFER_NUM; / 缓冲区int start, end; / 两个指针 g_buf; Semaphore g_semBuffer, g_semProduct, g_mutex; /消费者线程DWORD WINAPI Consumer(LPVOID para) /i 表示第 i 个消费者Int i = *(int *)para; int ptr; /待消费的内容的指针printf( 小白兔 -%03d: 叶子n, i); Sleep(1800); while (1) printf( 小白兔 -%03d: 我饿了 .!n,i); /等待产品P(g_semProduct); /有产品,先锁住缓

23、冲区g_buf P(g_mutex); /记录消费的物品ptr=g_buf.start; /再移动缓冲区指针g_buf.start= (g_buf.start+1)%BUFFER_NUM; /让其他消费者或生产者使用g_buf V(g_mutex); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 13 页 - - - - - - - - - 操作系统课程设计- 10 -printf( 小白兔 -%03d: 我需要 buf%d = %sn, i, ptr, thingg

24、_buf.productptr); Sleep(rate*rand()%10+1800); /消费完毕,并释放一个缓冲printf( 小白兔 -%03d: 吃绿叶 buf%d = %sn,i, ptr, thingg_buf.productptr); V(g_semBuffer); Return 0; /生产者线程DWORD WINAPI Producer(LPVOID para) int i=*(int*)para-CONSUMER_NUM; int ptr; int data; /产品printf( 小草-%03d: 小白兔快来找我!n, i); Sleep(1800); while (1

25、) printf( 小草-%03d: 我爱阳光 ,n, i); Sleep(rate*rand()%10+1800); data = rand()%10; printf( 小草-%03d: 我要长大 !data = %s!n, i, thingdata); /等待存放空间P(g_semBuffer); /有地方 ,先锁住缓冲区g_buf P(g_mutex); /记录消费的物品ptr = g_buf.end; /再移动缓冲区指针g_buf.end = (g_buf.end+1)%BUFFER_NUM; /让其他消费者或生产者使用g_buf V(g_mutex); printf( 小草-%03d

26、: 长大了 !buf%d = %sn, i, ptr, thingdata); g_buf.productptr = data; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 13 页 - - - - - - - - - 操作系统课程设计- 11 -Sleep(rate/2*rand()%10+1800); /放好了完毕,释放一个产品printf( 小草-%03d: buf%d=%s 小白兔快来 !n,i, ptr,thingg_buf.productptr); V(

27、g_semProduct); return 0; int main(int argc, char *argv) /线程技术,前面为消费者线程,后面为生产者线程HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; /线程计数/srand(time(); DWORD tid; int i=0; /初始化信号量g_mutex=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,mutexOfConsumerAndProducer); g_semBuffer=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NU

28、M,BufferSemaphone); g_semProduct= CreateSemaphore(NULL, 0, BUFFER_NUM, ProductSemaphone); if (!g_semBuffer|!g_semProduct|!g_mutex) printf(Create Semaphone Error!n); return -1; Int totalThreads = CONSUMER_NUM+PRODUCER_NUM; / 开启消费者线程printf( 先请小白兔就位!n); for (i=0; iCONSUMER_NUM; i+) hThreadi = CreateThr

29、ead(NULL, 0, Consumer, &i, 0, &tid); if ( hThreadi ) WaitForSingleObject(hThreadi, 10); printf( 请小草就位! n); for (;itotalThreads; i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 13 页 - - - - - - - - - 操作系统课程设计- 12 -hThreadi = CreateThread(NULL, 0, Producer, &

30、i, 0, &tid); if ( hThreadi ) WaitForSingleObject(hThreadi, 10); /生产者和消费者的执行WaitForMultipleObjects(totalThreads, hThread, TRUE, INFINITE); return 0; 参考文献:1 计算机操作系统汤子瀛 哲凤屏 汤小丹主编西安电子科技大学出版社2 计算机操作系统概论陈宏 杨忠耀 主编重庆邮电大学出版社3 计算机操作系统基本知识廖成 崔阳 主编电子工业出版社4 UNIX进程间通信 美Jhon Shapley Gray著 张宁译电子工业出版社5 操作系统实现与设计陆刚望能主编电子工业出版 注 还有一系列网站,由于当时未留心,现在不能将其列如下。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 13 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁