有限缓冲区问题的实现说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2010年秋季学期
操作系统原理课程设计
题目:有限缓冲区问题的实现
专业班级:计算机科学与技术姓名:**
学号:012345678
指导教师:王旭阳
成绩:_______________
目录
摘要 (3)
正文 (4)
1.设计思路 (4)
2.各模块的伪码算法 (5)
3.函数调用关系图 (6)
4.测试结果 (7)
设计总结 (8)
参考文献 (9)
致谢 (10)
附录:部分源程序代码 (11)
摘要
关键词:有限缓冲区问题;进程同步;生产者消费者
本程序实现有限缓冲区问题。
设计了两个进程,在一个地址空间运行,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。
如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。
如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。
程序使用共享内存的方法实现缓冲区,利用PV操作与信号量的方法实现生产者与消费者的同步。
程序利用了三个信号量,mutexid用于互斥地访问缓冲区,fullid 用于判断缓冲区是否满,用于指示消费者线程能否从缓冲区中取出产品,而emptyid则是用于判断缓冲区是否空,用于指示生产者线程能否进行生产。
正文
1.设计思路
有限缓冲区问题实现
1设计目的
通过实现经典的生产者消费者问题,巩固对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。
2 设计要求
在Linux环境下,使用多线程和信号量机制实现经典的生产者消费者问题,用信号量机制分别实现生产者线程与消费者线程的同步。
本程序设计了两个进程,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。
如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。
如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。
通过本次课程设计掌握Dijkstra提出的有限缓冲区(生产者-消费者)问题的原理、软件开发方法并提高解决实际问题的能力。
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.测试结果登陆界面:
设计总结
本次操作系统课程设计完成的是有限缓冲区问题的实现,通过该题目的设计过程,初步掌握了进程同步与互斥的原理,并提高解决实际问题的能力。
更了解了UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令。
<<操作系统>>是计算机类各专业的核心课程,也是其他诸多类专业的重要选修课。
开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础。
同时对于学生逻辑思维培养和程序设计思想体系的建立有着重要的影响。
在这两周的课程设计中,我进一步理解和掌握了课本中所学的各种知识。
学会了如何把学得到的知识用于解决实际问题,培养了我的动手能力,使我对数据结构课程所学的知识有了更深入的理解和掌握,巩固了理论教学所学到的知识,扩展了我的编程思想。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等. 操作系统教程. 高等教育出版社
4.曾明. Linux操作系统应用教程. 陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》. 清华大学出版社.
6.孟静,操作系统教程--原理和实例分析. 高等教育出版社
7.周长林,计算机操作系统教程. 高等教育出版社
8.张尧学,计算机操作系统教程. 清华大学出版社
9.任满杰,操作系统原理实用教程. 电子工业出版社
致谢
能够完成这次操作系统课程设计,我要感谢我的指导老师任学惠,她在我的课程设计过程中提出了指导性的方案和架构,并指引我阅读相关的资料和书籍,我的能力得到了提高,养成了科学、严谨学习习惯。
在本次课程设计当中,有很多同学帮助我完成对程序的测试,对我的课程设计的完成起了不小的作用,在他们的帮助下,我才能够比较好的完成着次课程设计,在此一并表示感谢。
附录:部分源程序代码
#include "windows.h"
#include "iostream.h"
#include "math.h"
#define random (rand()*10000)/RAND_MAX //定义一个随机函数来生产产品,并且使两个顾产品间的时间少于10秒
int long 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=CreateMutex(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<<" 个产品生产了 "<<endl;
if (waiting<buffer) //如果缓冲池还有空位
{
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);//释放互斥量,以便其他线程使用
WaitForSingleObject(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); //等待互斥量
waiting--; //等待的产品数减一
ReleaseSemaphore(proceducer,1,NULL); //释放信号量
ResumeThread(proceducer); //唤醒消费进程
ReleaseMutex(Mutex); //v(mutex);
proceduce(); //生产
finish++; //消费的产品数加1
}
return 0;
}
int main(int argc, char* argv[])
{
cout<<"请输入缓冲区空位的总数目:";
cin>>buffer;
cout<<"缓冲区共有"<<buffer<<"个空位"<<endl; //设置缓冲区空位数目 cout<<"缓冲区空生产产品吗?Y/N"<<endl; //缓冲区是否空
cin>>empty;
while (empty!='y')
{
cout<<endl<<"********对不起,缓冲区满!********"<<endl;
cout<<"缓冲区已空,生产产品?Y/N"<<endl;
cin>>empty;
}
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);
cout<<endl<<"********缓冲区已空,请继续生产********"<<endl;
if (finish>=10&&waiting==0) //如果完成数超过10并且没有人等待
{
cout<<"已经为"<<finish<<"个产品了,要停止生产吗?"<<endl; //提示是否关门
cin>>full;
return full;
}
else ;
}
if (full=='Y')
{
cout<<"********对不起,缓冲区已满********"<<endl;
return 0;
}
}。