操作系统课程设计生产者-消费者问题附代码_第1页
操作系统课程设计生产者-消费者问题附代码_第2页
操作系统课程设计生产者-消费者问题附代码_第3页
操作系统课程设计生产者-消费者问题附代码_第4页
操作系统课程设计生产者-消费者问题附代码_第5页
免费预览已结束,剩余12页可下载查看

付费下载

下载本文档

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

文档简介

1、信息科学与工程学院课程设计任务书题目:生产者-消费者问题的实现姓名:学号:专业:计算机科学与技术课程:操作系统指导教师:职称:讲师完成时间:2012年5月-2012年6月课程设计的任务和具体要求1、课程设计的任务:利用所学知识模拟并实现生产者消费者问题;2、课程设计的具体要求:(1)为每个生产者/消费者产生一个线程,设计正确的同步算法。(2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符(3)生产者和消费者各有两个以上。(4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。(5)要求所撰写的课程设计任务书的

2、内容和格式符合要求。指导教师签字:日期:指导教师评语成绩:指导教师签字:日期:课程设计所需软件、硬件等Windowsxp系统VM虚拟机并安装redhatlinux系统软件:Vi编辑器GCC4.41设计语百:C语后课程设计进度计划起至日期工作内容备注2012.5.15.152012.5.166.102012.6.116.152012.6.166.20确定课题并收集资料整体规划并进行初步定位编写程序代码并进行试验撰写课程设计任务书参考文献、资料索引厅P义献、资料名称编者者出版单位1操作系统概念(第六版),(美)AbrahamSilberschatz,PeterBaerGalvin,GregGagn

3、e者,郑扣根译,局等教育出版社2深入理解LINUX内核(第三版)(美)博韦,西斯特著,陈莉君,张琼声,张宏伟译,中国电力出版社第1章引言11.1 设计背景11.2 问题分类11.3 解决方案1第2章设计思路及原理2第3章程序详细设计33.1 程序模块设计33.2 程序代码结构5第4章实验结果7第5章实验总结8附录:实验代码9第1章引言1.1 设计背景生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释

4、放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。1.2 问题分类根据缓冲区的个数、大小以及生产者消费者的个数可以分为以下几类:1 .单缓冲区(适合单或多生产消费者);2 .环行多缓冲区(或无穷缓冲区)单生产消费者;3 .环行多缓冲区多生产消费者;1.3解决方案1 .用进程通信(信箱通信)的方法解决;2 .进程消息缓冲通信;3 .进程信箱通信;第2章设计思路及原理设计了两个主要函数:生产者函数、消费者函数;设计了三个信号量:full信号量,判断缓

5、冲区是否有值,初值为0;empty信号量,判断缓冲区是否有空缓冲区,初值为缓冲区数;mutex信号量作为互斥信号量,用于互斥的访问缓冲区。生产者函数通过执行P操作信号量empty减1,判断缓冲区是否有空。有空则互斥的访问缓冲区并放入数据,然后释放缓冲区,执行V操作,彳S号量full加1。消费者函数执行P操作,信号量full减1,判断是否有数据,有则互斥的访问缓冲区并取走数据,然后释放缓冲区,执行V操作,empty信号量加1。第3章程序详细设计3.1 程序模块设计该实验主要分为三大模块:1 .主程序,创建并控制程序的流程,其中控制线程的活动以及信号量的操作,如图3-1-1所示;2 .生产者模块:

6、生产者对缓冲区的操作,如图3-1-2所示;3 .消费者模块:消费者对缓冲区的操作,如图3-1-3所示。程序相关模块的流程图图3-1-1主程序Can(um*MWr|r«丫Mxk加水川%BUFFER.51ZEiigul(tmpty)图3-1-2生产者图3-1-3消费者3.2程序代码结构通过分析,我们已经了解到了可以采用信号量来解决n个进程的临界区问题,这n个进程共享一个信号量mutex(mutualexclusion),并初始化为1。每个进程P的组织结构如下图。dowait(mutex);临界区Isignal(mutex);I剩余区while(l);图:使用信当量的互舞实现由于本系统我们

7、研究的是有限缓冲区(Bounded-Buffer)的生产者消费者问题。而且根据初始条件可知,该缓冲区内有20个缓冲项,每个缓冲项存储一个整形数。信号量mutex提供了对缓冲池访问的互斥要求,并初始化为1。信号量empty和full分别用来表示空缓冲项和满缓冲项的数量。信号量empty初始化为20,而信号量full初始化为0;生产者进程和消费者进程的代码如图。注意生产者和消费者之间的对称性可以这样来理解代码:生产者为消费者生产满缓冲项,或消费者为生产者生产空缓冲项。dowait(full);Iwait(mutex);removeanitemfrombuffertonextc事signal(mut

8、ex);signaltempty);Iconsumetheiteminnextc)while(l);茎:湾君君近程君do( ,produceaniteminnextp wait(empty);wait(mutex);addnextptobuffer -Hsignal(mutex);signal(full);Iwhile(l);I斐:生产要些程绪伤实验结果如截图所示:低000000000000缶:2:2:1:3:3:1:2:2:1:3:3编。口、90nA99口八口口八g口、B只。口八。口八1口八1hjr*"-4-*-4:»4«但区者区者区者区者区者区者区看区者区次区

9、者区者区济冲费冲产冲费冲产冲费冲产冲舞冲产冲费冲产冲黄冲歹嫌消缓生媛消毁生缓消媛生媛消级生媛消媛生消媛第4章实验结果nhenxhenubuntu:、,桌面信作系统洋程设计/fin君I查看但J终端帮助出)eoebq指针位置:1200Q0指针位置:16000QQ指针位置:1360630指针位置:17&609Q指针位置:1400000指针位置:18eeaaa指针位置:15eee3q指针位置:1900000指针位置:16066S0指针位置;00eg9o指针位置:17Q00SQoee00B141516151613141516图4-1实验结果截图15161616161717171717171718

10、IB181818181819191919192020第5章实验总结进程的同步与互斥是操作系统课程中非常重要的一部分内容。通过本次课程设计,我和我的组员不仅学会了使用信号量机制解决有限缓冲区的生产者消费者问题,而且对Linux系统下多线程编程有了更深入的了解。虽然实验以前我已经对信号量机制解决进程问同步问题的原理有了很清楚的认识,但是此次课程设计中仍然遇到了很多问题,如Linux系统下各种系统调用以及函数的各种参数,都花费了我很多时间去网上看各种资料一一虽然Linux系统中可以很方便的阅读源代码以及使用man命令进行相应指令的查看,但是全英文的资料让人看了不免有些发怵,看来还要多多加强计算机专业

11、英语的学习,以后便可以在Linux系统中查看各种帮助文件。另一个问题就是在编译的时候遇到的,刚开始用gcc-omainmain.c进行编译的时候总是提示出错,后来查了相关资料才知道pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在使用pthread_create()等函数时,需要链接该库才能编译通过。以前再用WindowsIDE进行编程的时候基本上不会遇到这样的问题,看来的确IDE为我们做了很多工作,隐藏了一些技术细节,有时候隐藏这些细节虽然可以方便我们,却让我们离真相越来越远。最近使用Linux进行相关的编程操作,感悟还是挺多的。Windows下

12、的层层封装的确让我们感到很方便,但同时也让我们编程变得越来越不灵活。因为我们不用再去了解底层的东西因此一遇到问题就会束手无策。这段时间一直用Linux进行编程,感觉很方便,跟我以前想象地完全不一样,而且我掌握了不少命令,比我以前用鼠标操作的时候快多了,而且在Bash下可以用Ctrl+Z随时中止正在运行的进程或命令,再用fg%id重新运行。Linux下的编程也很方便,我还了解了Makefile的编写方法,在多文件编程的时候可以极高地提高效率。总之,我之后会加强专业英语的学习,以便更好的利用Linux操作系统进行编程之路的学习。附录:实验代码#include<stdio.h>#incl

13、ude<stdlib.h>#include<string.h>#include<pthread.h>#include<semaphore.h>#include<signal.h>#definenum_producer3#definenum_consumer3由于题目要求生产者和消费者各有两个以上,故此处均定为3个#defineBUFFER_SIZE20定义缓冲区的大小,按题目要求为20intNUM=1;/题目要求放入/取出的数据项按增序设定为1-20,因此定义此全局变量intbufferBUFFER_SIZE;intnextp=0,n

14、extc=0;sem_tempty,full,mutex;/主函数intmain()inti;signal(SIGALRM,handler);sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);sem_init(&mutex,0,1);for(i=0;i<BUFFER_SIZE;i+)bufferi=0;for(i=0;i<num_producer;i+)pthread_create(&threads_pi,NULL,(void*)producer_thread,(void*)(i+1);for(i=

15、0;i<num_consumer;i+)pthread_create(&threads_ci,NULL,(void*)consumer_thread,(void*)(i+1);for(i=0;i<num_producer;i+)pthread_join(threads_pi,NULL);for(i=0;i<num_consumer;i+)pthread_join(threads_ci,NULL);sem_destroy(&empty);sem_destroy(&full);sem_destroy(&mutex);return0;/消费者代码vo

16、id*consumer_thread(void*tid)inti;pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);while(1)sem_wait(&full);srand(int)time(NULL)*(int)tid);sem_wait(&mutex);printf("消费者标识:dt指针位置:dtn",(int)tid,nextc);buffernextc=0;nextc=(nextc+1)%20;printf("缓冲区:");for(i=0;i<BUFFER_SIZE;i

17、+)printf("%3d",bufferi);printf("n");sem_post(&mutex);sem_post(&empty);10srand(int)time(NULL)*(int)tid);sleep(1);)return(void*)0);)/生产者代码void*producer_thread(void*tid)inti;pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);while(1)sem_wait(&empty);srand(int)time(NULL)*(int)tid);sleep(1);while(nextp+1)%20=nextc);sem_wait(&mutex);if(NUM>20)NUM=1;/如果大于20,NUM重新为1buffernextp=(NUM+);nextp=(nextp+1)%20;if(nextp=0)printf("生产者标识:dt指针位置:19tn&qu

温馨提示

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

评论

0/150

提交评论