实现生产者消费者问题课程设计.doc_第1页
实现生产者消费者问题课程设计.doc_第2页
实现生产者消费者问题课程设计.doc_第3页
实现生产者消费者问题课程设计.doc_第4页
实现生产者消费者问题课程设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学操作系统课程设计说明书课程设计题 目实现生产者消费者问题 学 院计算机科学与技术学院专 业软件工程班 级软件0904 2011年12月25日课程设计任务书学生姓名: 朱鹏 专业班级: 软件工程0904 指导教师: 刘军 工作单位:计算机科学与技术学院 题 目: 实现生产者消费者问题初始条件:学习了高级语言程序设计、汇编语言、数据结构、计算机组成原理课程,掌握了一种计算机高级语言。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1. 通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。2.实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。3.编程及上机实现;4.撰写课程设计报告,包括:1) 设计题目与要求2) 总的设计思想及系统平台、语言、工具等。3) 数据结构与模块说明(功能与流程图)4) 源程序5) 运行结果与运行情况6) 调试记录7) 自我评析和总结时间安排: 序号阶段内容所需时间1消化资料、系统设计1天2编程、调试天3撰写报告1天合计天指导教师签名: 2011年12月26日系主任(或责任教师)签名: 年 月 日目录1设计题目与要求- 3 -1.1设计题目- 3 -1.2设计要求- 3 -2 设计思想及系统平台、语言、工具- 3 -2.1 设计思想- 3 -2.2 系统平台及语言、工具- 4 -3 数据结构与模块说明- 4 -4 源程序- 7 -5 运行结果与运行情况- 12 -6 调试记录- 12 -7 自我评析和总结- 13 -1设计题目与要求1.1设计题目 实现生产者消费者问题1.2设计要求(1) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者消费者线程的标识符。(2) 生产者和消费者各有两个以上。(3) 多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。2 设计思想及系统平台、语言、工具2.1 设计思想生产者消费者问题是一种同步问题的抽象描述。 计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。 而当某个进程释放资源时,则它就相当一个生产者。 在同一时刻只能有一个生产者或一个消费者使用缓冲区,有互斥信号量可以控制各个生产者和消费者之间互斥,使得生产和消费的工作能够有序的进行,而不至于发生死锁。 通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。 在本问题中,共需要一个Mutex和两个Semaphore.其中,Mutex是用来锁定临界区的,以解决对共享数据buffer的互斥访问问题(无论是对生成者还是对消费者);共需要两个Semaphore,这是因为在本问题中共有两个稀缺资源.第一种是非空这种资源,是在消费者之间进行竞争的.第二种是非满这种资源,是在生产者之间进行竞争的.所以,一般来说,需要锁定临界区,就需要Mutex;有几种稀缺资源就需要几个Semaphore.对稀缺资源的分析不能想当然.稀缺资源不一定是指被共享的资源,很多时候是指线程会被阻塞的条件(除了要进临界区被阻塞外).在生产者消费者问题中,消费者会在缓冲区为空时被阻塞,所以非空是一种稀缺资源;需要设置一个信号量consumer_semaphore,初值设为0;生产者会在缓冲区为满时被阻塞,所以非满也是一种稀缺资源.需要设置一个信号量producer_semaphore,初值设为buffer的大小MAX_BUFFER2.2 系统平台及语言、工具(1) 操作系统:Linux(2) 程序设计语言:C语言(3) 编译器:GCC3 数据结构与模块说明共享数据:#define NUM 20int queueNUM;int p = 0,c = 0;/记录动态数组下标位置sem_t blank_number, product_number;pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;生产者线程入口函数:void *producer_thread_fun( unsigned int *arg)int realarg= (int)arg;/强制类型转换参数producer(realarg);return NULL;生产者线程处理函数:void *producer(const int i)while(1)sem_wait(&blank_number);pthread_mutex_lock(&counter_mutex);sleep(2); queuep=p+1;pthread_mutex_unlock(&counter_mutex);sem_post(&product_number);sleep(rand() % 5);/Random block 0-4 secondsreturn NULL;生产者线程的函数流程图如下:消费者线程入口函数:void *consumer_thread_fun(void *arg)int realarg = (int)arg;consumer(realarg);return NULL;消费者线程的处理函数:void *consumer(const int i)while(1)sem_wait(&product_number);pthread_mutex_lock(&counter_mutex);sleep(2);sleep(rand() % 5);消费者线程的处理函数流程图如下:4 源程序#include #include #include #include #include#define NUM 20int queueNUM;int p = 0,c = 0;/ Record location of the dynamic array subscriptsem_t blank_number, product_number;pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;/Producer Functionvoid *producer(const int i)int j;time_t t;srand(unsigned) time(&t);/Initialize the random number seedwhile(1)sem_wait(&blank_number);pthread_mutex_lock(&counter_mutex);sleep(2); queuep=p+1;pthread_mutex_unlock(&counter_mutex);sem_post(&product_number);printf(Producer Number %d thread identifier: %u ,i+1,(unsigned int)pthread_self();printf(Produce %dn,queuep);printf(The current state of the buffe:*n);printf( Number:);for(j = 0;j NUM;j +)printf(%4d,j+1);printf(n Value:);for(j = 0;j NUM;j +)printf(%4d,queuej);printf(nPointer:);for(j = 0;j NUM;j+)if(j != p)printf( );elseprintf( +);printf(n);p=(p + 1)%NUM;/pbackward onesleep(rand() % 5);/Random block 0-4 secondsreturn NULL;/Production of the thread entry functionvoid *producer_thread_fun( unsigned int *arg)int realarg= (int)arg;/Force type conversion parametersproducer(realarg);return NULL;/Consumer functionvoid *consumer(const int i)int j;time_t t;srand(unsigned) time(&t);while(1)sem_wait(&product_number);pthread_mutex_lock(&counter_mutex);sleep(2);printf(Consumer Number %d thread identifier: %u ,i+1,(unsigned int)pthread_self();printf(Consumed %dn,queuec);queuec = 0;/Fill empty position 0pthread_mutex_unlock(&counter_mutex);sem_post(&blank_number);printf(The current state of the buffer:*n);printf(Number:);for(j = 0;j NUM;j +)printf(%4d,j+1);printf(n Value:);for(j = 0;j NUM;j +)printf(%4d,queuej);printf(n Pointer:);for(j = 0;j NUM;j+)if(j != c)printf( );elseprintf( -);printf(n);c = (c + 1)%NUM;sleep(rand() % 5);/consumer thread entry functionvoid *consumer_thread_fun(void *arg)int realarg = (int)arg;consumer(realarg);return NULL;/MAINint main(int argc, char *argv) int i;pthread_t pid100,cid100;int producer_num,consumer_num;sleep(1);for(i = 0;i NUM;i +)/Initialize bufferqueuei = 0;printf(Please enter the number of producers:);scanf(%d,&producer_num);printf(Please enter the number of consumers:);scanf(%d,&consumer_num);for(i = 0;i producer_num;i +)pthread_t pidi;for(i = 0;i consumer_num;i +)pthread_t cidi;/Initialization semaphore; pshared parameter 0 for the same process semaphore synchronization between threadssem_init(&blank_number, 0, NUM);sem_init(&product_number, 0, 0);for(i = 0;i producer_num;i +)/Create threadpthread_create(&pid0+i, NULL, producer_thread_fun, (void *)i);/i forced to convert the void * type, easy to pass parametersfor(i = 0;i consumer_num;i +)pthread_create(&cid0+i, NULL, consumer_thread_fun, (void *)i);for(i = 0;i producer_num;i +)/Revocation of the main thread wait for all threadspthread_join(pidi, NULL);for(i = 0;i consumer_num;i +)pthread_join(cidi, NULL);sem_destroy(&blank_number);/ Release semaphore resourcesem_destroy(&product_number);return 0;5 运行结果与运行情况6 调试记录7 自我评析和总结本次课程设是关于生产者与消费者之间互斥和同步的问题。问题的实质是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。生产者与消费者是一个与现实有关的经典问题,与课堂上“理发师”问题的原理相同,通过此原理举一反三可以解决其他类似的问题。 通过本课程设计,我们对操作系统的p、v进一步的认识,深入的了解p、v操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题,让我深入的了解了多线程的知识,并通过用多线程的方法进行编程,按照课程设计任务书实现了生产者-消费者问题。以前上课的时候理解多线程只是它的基本概念,这次通过用多线程的方法编程实现了实际问题才真真的了解到使用多线程的好处以及是如何实现的。虽然在编程过程中遇到了一些麻烦,比如不能输出想要的结果等等,但是最后通过查阅资料找到了问题所在。整个过程让我受益匪浅,不但提高了编程的能力,还通过运用所学的知识解决了实际问题,巩固了课本知识。参考文献:1 Operating System Concepts(Sixth Edition)(操作系统概念)影印版 编著:Abraham Silberschatz 出版社:高等教育出版社2 计算机操作系统教程(第三版) 编著:张尧学 出版社:清华大学出版社3 操作系统原理(第三版) 编著:庞丽萍 出版社:华中科技大学出版社本科生课程设计成绩评定表班级:姓名:学号:序号评分项目满分实得分1学习态度认真、遵守纪律102设计分析合理性103设计方案正确性、可行性、创造性204设计结果正确性405设计报告的规范性106设计验收10总得分/等级评语:注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格指导教师签名:201 年 月 日袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螈

温馨提示

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

评论

0/150

提交评论