完整版操作系统毕业课程设计用多进程同步方法解决生产者消费者问.docx
《完整版操作系统毕业课程设计用多进程同步方法解决生产者消费者问.docx》由会员分享,可在线阅读,更多相关《完整版操作系统毕业课程设计用多进程同步方法解决生产者消费者问.docx(8页珍藏版)》请在冰豆网上搜索。
完整版操作系统毕业课程设计用多进程同步方法解决生产者消费者问
操作系统课程设计
用多进程同步方法解决生产者-消费者问题
系
别:
计科系
专
业:
计算机科学与技术
班
级:
.
04级4班
姓
名:
.
苏德洪
一、题目:
3...
二、设计目的:
3...
三、总体设计思想概述:
3..
四、说明:
3...
五、设计要求:
3...
六、设计方案:
3...
七、流程图:
5...
八、运行结果7...
九、源程序11
十、总结1..9..
十一、参考文献2..0.
一、题目:
用多进程同步方法解决生产者-消费者问题。
二、设计目的:
掌握信号量机制的过程。
掌握c语言编程。
通过研究Linux的进程机制和信号量实现生产者消费者问题的并发控制。
三、总体设计思想概述:
1、生产者—消费者问题是一种同步问题的抽象描述。
2、计算机系统中的每个进程都可以消费或生产某类资源。
当系统中某一进程使
用某一资源时,可以看作是消耗,且该进程称为消费者。
3、而当某个进程释放资源时,则它就相当一个生产者。
四、说明:
有界缓冲区用数组表示。
五、设计要求:
1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,
当前指针位置和生产者消费者线程的标识符。
2、生产者和消费者各有两个以上。
3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。
六、设计方案:
通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。
假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。
类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。
应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。
为解决生产者消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_=0;产品进缓冲区时的缓冲区下标,用于记录生产者的指针位置unsignedshortout=0;产品出缓冲区时的缓冲区下标,用于记录消费者的指针位
置
boolg_continue=1;控制程序运行:
1表示继续运行,0表示停止运行
HANDLEg_]=ProductID;
in=(in+1)%SIZE_OF_BUFFER;std:
:
cerr<:
endl;
std:
:
cout<<"缓冲区"<<"产品"<:
endl;新产品放入缓冲区后,输出缓冲区当前的状态
for(inti=0;i{
if(i==in)
{
if(g_buffer[i]<10)std:
:
cout<<"";
else
std:
:
cout<<"";
std:
:
cout<<"生产者-->";输出生产者的指针位置
std:
:
cout<<"";
}
输出缓冲区下标
if(i<10&&i!
=in)
std:
:
cout<<""<
std:
:
cout<<""<
elseif(i>=10&&i!
=in)
std:
:
cout<<"
elseif(i>=10&&i==in)
std:
:
cout<<""<
if(g_buffer[i]<10)
std:
:
cout<<"
else
std:
:
cout<<"
std:
:
cout<<"<--
}
std:
:
cout<:
endl;
}
}
voidConsume()消费一个产品
{
system("color3a");
std:
:
cout<:
endl;
"<"<
"<消费者";输出消费者的指针位置
std:
:
cerr<<""<<"消费一个产品std:
:
cout<:
endl;
:
"<}
从缓冲区中取出一个产品
voidTake()
std:
:
cout<:
endl;
std:
:
cerr<<""<<"从缓冲区取出一个产品";
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;i{
if(i==in)
{
if(g_buffer[i]<10)
std:
:
cout<<"";
else
std:
:
cout<<"";
std:
:
cout<<"生产者-->";输出生产者的指针位置
std:
:
cout<<"";
}
输出缓冲区下标
if(i<10&&i!
=in)
std:
:
cout<<""<
std:
:
cout<<""<
elseif(i>=10&&i!
=in)std:
:
cout<<"
elseif(i>=10&&i==in)std:
:
cout<<""<
if(g_buffer[i]<10)std:
:
cout<<"else
std:
:
cout<<"std:
:
cout<<"<--
}
std:
:
cout<:
endl;
"<"<
"<消费者";输出消费者的指针位置
}
}生产者线程
DWORDWINAPIProducer(LPVOIDlpPara)
{
while(g_continue)
{
资源信号量的P操作
WaitForSingleObject(g_0;
}
消费者线程
DWORDWINAPIConsumer(LPVOIDlpPara){
while(g_continue)
{
资源信号量的P操作
WaitForSingleObject(g_0;
}
voidcreatePT()创建生产者线程
{
for(inti=0;i{
");
printf("\t\t\t
printf("\t\t\t1.printf("\t\t\t2.printf("\t\t\tprintf("\t\t\t
生产一
消费一
个产品
个产品
\n");
\n");
请选择:
");
\n");
\n");
}
voidmain()
{
显示程序提示信息
info();
menu();
创建互斥信号量
g_hMutex=CreateMutex(NULL,FALSE,NULL);
创建资源信号量
g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);空
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程序设计(第三版)谭浩强版