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