1、有限缓冲区问题的实现说明书*实践教学* 兰州理工大学计算机与通信学院2010年秋季学期操作系统原理课程设计题 目:有限缓冲区问题的实现 专业班级:计算机科学与技术 姓 名: * 学 号: 012345678 指导教师: 王旭阳 成 绩: _目 录摘 要 2正文 31 设计思路 32 各模块的伪码算法 33 函数调用关系图 94 测试结果 10设计总结 11参考文献 12致 谢 13附录:部分源程序代码 14摘 要关键词: 有限缓冲区问题;进程同步;生产者消费者本程序实现有限缓冲区问题。设计了两个进程,在一个地址空间运行,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供
2、消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。程序使用共享内存的方法实现缓冲区,利用PV操作与信号量的方法实现生产者与消费者的同步。程序利用了三个信号量,mutexid用于互斥地访问缓冲区,fullid用于判断缓冲区是否满,用于指示消费者线程能否从缓冲区中取出产品,而emptyid则是用于判断缓冲区是否空,用于指示生产者线程能否进行生产。正文1 设计思路有限缓冲区问题实现1 设计目的通过实现经典的生产者消费者问题,巩固
3、对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。2 设计要求在Linux环境下,使用多线程和信号量机制实现经典的生产者消费者问题,用信号量机制分别实现生产者线程与消费者线程的同步。本程序设计了两个进程,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。通过本次课程设计掌握Dijkstra提出的有限缓冲
4、区(生产者-消费者)问题的原理、软件开发方法并提高解决实际问题的能力。2 各模块的伪码算法void proceduce() Sleep (10000); cout缓冲区已空 !endl; /生产者生产产品函数,用时10秒 void getconsum() Sleep (10001); /产品被生产的函数,为了合理区分生产产品 cout第finish个产品被消费,取出 endl; int main(int argc, char* argv) hThread2=:CreateThread (NULL,0,proceducers,NULL,0,NULL); /产生一个生产者进程 3 函数调用关系图4
5、 测试结果登陆界面:设计总结本次操作系统课程设计完成的是有限缓冲区问题的实现,通过该题目的设计过程,初步掌握了进程同步与互斥的原理,并提高解决实际问题的能力。更了解了UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令。 是计算机类各专业的核心课程,也是其他诸多类专业的重要选修课。开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础。同时对于学生逻辑思维培养和程序设计思想体系的建立有着重要的影响。在这两周的课程设计中,我进一步理解和掌握了课本中所学的各种知识。学会了如何把学得到的知识用于解决实际问题,培养了我的动手能力,使我对数据结构课程所
6、学的知识有了更深入的理解和掌握,巩固了理论教学所学到的知识,扩展了我的编程思想。参考文献1.汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社.2.王清,李光明.计算机操作系统.冶金工业出版社.3.孙钟秀等. 操作系统教程. 高等教育出版社4.曾明. Linux操作系统应用教程. 陕西科学技术出版社. 5.张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.6.孟静,操作系统教程原理和实例分析. 高等教育出版社7.周长林,计算机操作系统教程. 高等教育出版社8.张尧学,计算机操作系统教程. 清华大学出版社9.任满杰,操作系统原理实用教程. 电子工业出版社致 谢能够完成这次操作系统课程设计
7、,我要感谢我的指导老师任学惠,她在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,我的能力得到了提高,养成了科学、严谨学习习惯。在本次课程设计当中,有很多同学帮助我完成对程序的测试,对我的课程设计的完成起了不小的作用,在他们的帮助下,我才能够比较好的完成着次课程设计,在此一并表示感谢。附录:部分源程序代码#include windows.h #include iostream.h #include math.h #define random (rand()*10000)/RAND_MAX /定义一个随机函数来生产产品,并且使两个顾产品间的时间少于10秒 int lon
8、g waiting(0); /正在等待的产品的数目 int buffer; /空位的总数目 char empty; /缓冲区空 char full; /缓冲区满 int count(0); /产品的号码数 int finish(0); /生产完毕的产品数目 DWORD a; void proceduce() Sleep (10000); cout缓冲区已空 !endl; /生产者生产产品函数,用时10秒 void getconsum() Sleep (10001); /产品被生产的函数,为了合理区分生产产品 cout第finish个产品被消费,取出 endl; HANDLE Mutex=Cre
9、ateMutex(NULL, FALSE, Mutex); /用来实现进程的互斥 HANDLE proceducer=CreateSemaphore(NULL, 1,1, proceducer);/定义信号量来进行线程间的同步 HANDLE consumer=CreateSemaphore(NULL,0,3,consum); DWORD WINAPI consum(LPVOID pParm2) /消费的线程 WaitForSingleObject(Mutex ,INFINITE); /p(mutex)来进行互斥操作 count+; /生产的是第几个产品 cout第 count 个产品生产了 e
10、ndl; if (waitingbuffer) /如果缓冲池还有空位 if (waiting!=0) cout此时有waiting+1 个产品等待消费endl; else cout没有产品在等待endl; /输出有多少人在等待 waiting+; cout还有buffer-waiting个空位endl; cout有空区,产品已经进入endl; ReleaseSemaphore(consum,1,NULL);/v(consumer) ResumeThread(consum);/唤醒生产者进程 ReleaseMutex(Mutex);/释放互斥量,以便其他线程使用 WaitForSingleObj
11、ect(proceducer,INFINITE);/等待生产 getconsum(); /消费并取走 else cout缓冲区已满,第count个产品暂停生产endl; /没有空位,生产者不再生产 ReleaseMutex(Mutex); return 0; DWORD WINAPI proceducers(LPVOID pParm1) /生产者的线程 while(true) /一直执行 WaitForSingleObject(consum,INFINITE);/p(customers),等待产品 WaitForSingleObject(Mutex,INFINITE); /等待互斥量 wait
12、ing-; /等待的产品数减一 ReleaseSemaphore(proceducer,1,NULL); /释放信号量 ResumeThread(proceducer); /唤醒消费进程 ReleaseMutex(Mutex); /v(mutex); proceduce(); /生产 finish+; /消费的产品数加1 return 0; int main(int argc, char* argv) coutbuffer; cout缓冲区共有buffer个空位endl; /设置缓冲区空位数目 cout缓冲区空生产产品吗?Y/Nempty; while (empty!=y) coutendl*
13、对不起,缓冲区满!*endl; cout缓冲区已空,生产产品?Y/Nempty; HANDLE hThread1; HANDLE hThread2; hThread2=:CreateThread (NULL,0,proceducers,NULL,0,NULL); /产生一个生产者进程 while(full!=y) Sleep(random); /产品随机进入 hThread1=:CreateThread(NULL,0,consum,NULL,a,NULL); coutendl*缓冲区已空,请继续生产*=10&waiting=0) /如果完成数超过10并且没有人等待 cout已经为finish个产品了,要停止生产吗?full; return full; else ; if (full=Y) cout*对不起,缓冲区已满*endl; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1