操作系统课程设计用多进程同步方法解决生产者 消费者问题1word文档良心出品.docx
《操作系统课程设计用多进程同步方法解决生产者 消费者问题1word文档良心出品.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计用多进程同步方法解决生产者 消费者问题1word文档良心出品.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统课程设计用多进程同步方法解决生产者消费者问题1word文档良心出品
操作系统课程设计
用多进程同步方法解决生产者-消费者问题
别:
计算机科学与技术
级:
04级4班
口
号:
名:
间:
2006-7-7—2006-7-14
一、题目:
二、设计目的:
三、总体设计思想概述:
四、说明:
五、设计要求:
六、设计方案:
七、流程图:
八、运行结果
九、源程序
十、总结
一、参考文献
.错.误!
.错.误!
.错.误!
未定义书签。
未定义书签。
未定义书签。
未定义书签。
未定义书签。
.错.误!
未定义书签。
.错.误!
未定义书签。
.3...
.5...
.2..0.
、题目:
用多进程同步方法解决生产者-消费者问题。
掌握信号量机制的过程。
掌握c语言编程。
通过研究Linux的进程机制和信号量实现生产者消费者问题的并发控制。
三、总体设计思想概述:
资源时,可以看作是消耗,且该进程称为消费者。
四、说明:
有界缓冲区用数组表示。
五、设计要求:
1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前
指针位置和生产者/消费者线程的标识符。
2、生产者和消费者各有两个以上。
3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。
通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。
假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。
类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。
应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。
为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,
用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0。
另外,由于有
g_hMutex,
界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量起初值为1。
在生产者/消费者问题中,信号量实现两种功能。
首先,它是生产产品和消费产品的计
数器,计数器的初始值是可利用的资源数目(有界缓冲区的长度)。
其次,它是确保产品的生
产者和消费者之间动作同步的同步器。
g_hMutex进行P操作,申请资源。
如果可以通过的话,就生产一个产品,并把产品送入缓冲区。
然后对互斥信号量g_hMutex和资源信号量g_hEmptySemaphore进行V操作,释
放资源。
g_hMutex进行P操作,申请资源。
如果可以通过的话,就从缓冲区取出一个产品并消费掉。
如果有
然后对互斥信号量g_hMutex和资源信号量g_hFullSemaphore进行V操作,释放资源。
如果缓冲区中已经没有可用资源,就把申请资源的进程添加到等待队列的队尾。
一个资源被释放,在等待队列中的第一个进程被唤醒并取得这个资源的使用权。
七、流程图:
1、生产者
2、消费者
八、运行结果
1、截图一:
2、截图
€r;产打口世幵曲
1JMizt~
-|I~生严一T■产砒~
jr
-|I州严MiS入M冲[X
fi'in«4^
3、截图三:
4
*1fitr»n-
11
1生产一十严册1
1*^T'pfu^piiatJ
ftf
1Khflii的"It列1
[IE产环iSAOi汁wJ
[血加|列"?
^潮砂列J-
.住迴过
吋斥彳阿些早尸**作
渔匹
Fi*■列■汕TTfflVTTJJiE
fhfffli™VBttVHP*1'
咬叭叭企的tn州荷岂tJ==*-
■jftWlFEA■企㈤旳I
九、源程序
#inelude#inelude#inelude#ineludeinto=0;
有界缓冲区长度
constunsignedshortSIZE_OF_BUFFER=20;//
intg_buffer[SIZE_OF_BUFFER];//
开辟缓冲区,用数组表示,可以看成是一个循环队列
unsignedshortProductID=0;//
新生产出来的产品的产品号
unsignedshortConsumeID=0;//
被消耗的产品的产品号
unsignedshortin=0;//
产品进缓冲区时的缓冲区下标,用于记录生产者的指针位置
unsignedshortout=0;//
产品出缓冲区时的缓冲区下标,用于记录消费者的指针位置
boolg_continue=1;//控制程序运行:
1表示继续运行,0表示停止运行
HANDLEg_hMutex;//线程间的互斥信号量
HANDLEg_hFullSemaphore;//资源信号量:
缓冲区满
HANDLEg_hEmptySemaphore;//资源信号量:
缓冲区空
DWORDWINAPIProducer(LPVOID);//生产者线程
DWORDWINAPIConsumer(LPVOID);//消费者线程constunsignedshortPRODUCERS_COUNT=3;//生产者的个数constunsignedshortCONSUMERS_COUNT=5;//消费者的个数
constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COl总线程数
HANDLEhThreads[PRODUCERS_COUNT]各线程的handle
DWORDproducerlD[CONSUMERS_COUNT]生产者线程的标识符
DWORDconsumerlD[THREADS_COUNT]消费者线程的标识符
std:
:
cout<<"";
std:
:
cout<<"生产者-->";//输出生产者的指针位置
}
}
/*
//std:
:
cout<<"";
}
//输出缓冲区下标
if(i<10&&i!
=in)
std:
:
cout<<"
elseif(i<10&&i==in)std:
:
cout<<""<
elseif(i>=10&&i!
=in)std:
:
cout<<"
elseif(i>=10&&i==in)std:
:
cout<<""<
if(i==out)
{
"<
"<"<
"<if(g_buffer[i]<10)
std:
:
cout<<"
else
std:
:
cout<<"std:
:
cout<<"<--}std:
:
cout<:
endl;
H.
H.
消费者";//输出消费者的指针位置
把新生产的产品放入缓冲区结束
*/
/*消费一个产品开始
voidConsume()//消费一个产品
{
*/
system("color3a");
std:
:
cout<:
endl;
std:
:
cerr<<"
std:
:
cout<:
endl;
"<<"消费一个产品:
"<}
/*
消费一个产品结束
*/
/*
//从缓冲区中取出一个产品
voidTake()
{
std:
:
cout<:
endl;
std:
:
cerr<<"
从缓冲区中取出一个产品开始
"<<"从缓冲区取出一个产品
H.
*/
ConsumeID=g_buffer[out];g_buffer[out]=0;
out=(out+1)%SIZE_OF_BUFFER;
std:
:
cerr<:
endl;std:
:
cout<:
endl;std:
:
cout<<"缓冲区产品"<:
endl;
//
取出一个产品后,输出缓冲区当前的状态
for(inti=0;iif(i==in)
{
H.
if(g_buffer[i]<10)std:
:
cout<<"else
std:
:
cout<<"";
std:
:
cout<<"生产者-->";//输出生产者的指针位置//std:
:
cout<<"";
WaitForSingleObject(g_hFullSemaphore,INFINITE);
//互斥信号量的P操作
WaitForSingleObject(g_hMutex,INFINITE);
//生产一个产品
Produce();
//把新生产的产品放入缓冲区
Append();
Sleep(2000);
//互斥信号量的V操作
ReleaseMutex(g_hMutex);
//资源信号量的V操作
ReleaseSemaphore(g_hEmptySemaphore,1,NULL);}return0;
}
/*
/*
//消费者线程DWORDWINAPIConsumer(LPVOIDlpPara){
while(g_continue)
{
//资源信号量的P操作
WaitForSingleObject(g_hEmptySemaphore,INFINITE);
//互斥信号量的P操作
WaitForSingleObject(g_hMutex,INFINITE);
//从缓冲区中取出一个产品
Take();
//消费一个产品
Consume();
Sleep(2000);
//互斥信号量的V操作
ReleaseMutex(g_hMutex);
//资源信号量的V操作
ReleaseSemaphore(g_hFullSemaphore,1,NULL);
}
return0;
}
/*
消费者线程结束
*/
*/
/*创建生产者线程开始
voidcreatePT()//创建生产者线程
{
for(inti=0;i{
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if(hThreads[i]==NULL)
g_continue=0;
}
}
voidcreateCT()//创建消费者线程
{
线程栈大小
for(intj=0;j返回的ID
hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]);
if(hThreads[j]==NULL)g_continue=0;
voidmain()
{
//显示程序提示信息
//info();//menu();
//创建互斥信号量g_hMutex=CreateMutex(NULL,FALSE,NULL);
//创建资源信号量g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NUL
L);//空g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);//满//创建生产者线程createPT();
//创建消费者线程createCT();
inti=0;
//不按回车键的话程序会一直运行下去while(g_continue)
//按回车键终止程序
if(getchar())g_continue=0;
、总结
是对我们已经学习的东西一种检验和体现。
这次课程设计进行的一次全面的综合训练,不仅要熟知书上的内容,还要掌握大一所学
加深对操作系
习的C语言,通过课程设计,让我们更好地掌握操作系统的原理及实现方法,统基础理论和重要算法的理解,加强我们的动手能力。
同时还增加了我对学习兴趣,也知道了以后该怎样的去学习。
、参考文献
1】汤子瀛等.计算机操作系统.西安电子科技大学出版社.2004年5月
2】付国瑜杨武周敏.计算机操作系统原理及应用上机实验指导.重庆工学院计算机
学院.2005年1月.
3】c程序设计(第三版)谭浩强版