欢迎来到天天文库
浏览记录
ID:856157
大小:479.53 KB
页数:16页
时间:2017-09-20
《实现生产者消费者问题--课程设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、武汉理工大学《操作系统》课程设计说明书课程设计题目实现生产者消费者问题学院计算机科学与技术学院专业软件工程班级软件09042011年12月25日课程设计任务书学生姓名:朱鹏专业班级:软件工程0904指导教师:刘军工作单位:计算机科学与技术学院-15-武汉理工大学《操作系统》课程设计说明书题目:实现生产者消费者问题初始条件:学习了高级语言程序设计、汇编语言、数据结构、计算机组成原理课程,掌握了一种计算机高级语言。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.通过研究Linux的线程机制和信号量实现生产者消费者(BoundedBuffer)问题的并发控制。2.
2、实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。3.编程及上机实现;4.撰写课程设计报告,包括:1)设计题目与要求2)总的设计思想及系统平台、语言、工具等。3)数据结构与模块说明(功能与流程图)4)源程序5)运行结果与运行情况6)调试记录7)自我评析和总结时间安排:序号阶段内容所需时间1消化资料、系统设计1天2编程、调试3天 3撰写报告1天合计5天指导教师签名:2011年12月26日系主任(或责任教师)签名:年月日目录1设计题目与要求-3-1.1设计题目-3-1.2设计要求-3--15-武汉理工大学《操作系统》课程设计说明书2设计思想及系统平台、语言、工具-3-2
3、.1设计思想-3-2.2系统平台及语言、工具-4-3数据结构与模块说明-4-4源程序-7-5运行结果与运行情况-12-6调试记录-12-7自我评析和总结-13-1设计题目与要求1.1设计题目实现生产者消费者问题1.2设计要求(1)-15-武汉理工大学《操作系统》课程设计说明书每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。(1)生产者和消费者各有两个以上。(2)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。2设计思想及系统平台、语言、工具2.1设计思想生产者—消费者问题是一种同步问题的抽象描述。计算机系统中的每个进
4、程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。在同一时刻只能有一个生产者或一个消费者使用缓冲区,有互斥信号量可以控制各个生产者和消费者之间互斥,使得生产和消费的工作能够有序的进行,而不至于发生死锁。通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产
5、品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。在本问题中,共需要一个Mutex和两个Semaphore.其中,Mutex是用来锁定临界区的,以解决对共享数据buffer的互斥访问问题(无论是对生成者还是对消费者);共需要两个Semaphore,这是因为在本问题中共有两个稀缺资源.第一种是"非空"这种资源,是在消费者之间进行竞争的.第二种是"非满"这种资源,是在生产者之间进行竞争的.所以,一般来说,需要锁定临界区,就需要Mutex;有几种稀缺资源就需要几个Semaphore.对稀缺资源的分析不能想当然.稀缺资源不一定是指被共享的资源,很多时候是指线程会被阻塞的条件(除了要进临界区被阻
6、塞外).在生产者消费者问题中,消费者会在缓冲区为空时被阻塞,所以"非空"是一种稀缺资源;需要设置一个信号量consumer_semaphore,初值设为0;生产者会在缓冲区为满时被阻塞,所以"非满"也是一种稀缺资源.需要设置一个信号量producer_semaphore,初值设为buffer的大小MAX_BUFFER2.2系统平台及语言、工具(1)操作系统:Linux(2)程序设计语言:C语言-15-武汉理工大学《操作系统》课程设计说明书(1)编译器:GCC3数据结构与模块说明共享数据:#defineNUM20intqueue[NUM];intp=0,c=0;//记录动态数组下标位置sem_t
7、blank_number,product_number;pthread_mutex_tcounter_mutex=PTHREAD_MUTEX_INITIALIZER;生产者线程入口函数:void*producer_thread_fun(unsignedint*arg){intrealarg=(int)arg;//强制类型转换参数producer(realarg);returnNULL;}生产者线程
此文档下载收益归作者所有