进程同步模拟设计生产者和消费者.docx

上传人:b****4 文档编号:12034594 上传时间:2023-04-16 格式:DOCX 页数:21 大小:231.11KB
下载 相关 举报
进程同步模拟设计生产者和消费者.docx_第1页
第1页 / 共21页
进程同步模拟设计生产者和消费者.docx_第2页
第2页 / 共21页
进程同步模拟设计生产者和消费者.docx_第3页
第3页 / 共21页
进程同步模拟设计生产者和消费者.docx_第4页
第4页 / 共21页
进程同步模拟设计生产者和消费者.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

进程同步模拟设计生产者和消费者.docx

《进程同步模拟设计生产者和消费者.docx》由会员分享,可在线阅读,更多相关《进程同步模拟设计生产者和消费者.docx(21页珍藏版)》请在冰豆网上搜索。

进程同步模拟设计生产者和消费者.docx

进程同步模拟设计生产者和消费者

学号:

0121010340621

课程设计

 

题目

进程同步模拟设计

——生产者和消费者问题

学院

计算机科学与技术学院

专业

计算机科学与技术专业

班级

1006班

姓名

丁探

指导教师

刘洪星

 

2013

1

17

 

课程设计任务书

学生姓名:

丁探专业班级:

计算机1006

指导教师:

刘洪星工作单位:

计算机科学与技术学院

题目:

进程同步模拟设计——生产者和消费者问题

初始条件:

1.预备内容:

阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:

掌握一种计算机高级语言的使用。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1.模拟用信号量机制实现生产者和消费者问题。

2.设计报告内容应说明:

⑴课程设计目的与功能;

⑵需求分析,数据结构或模块说明(功能与框图);

⑶源程序的主要部分;

⑷运行结果与运行情况分析;

⑸自我评价与总结:

)你认为你完成的设计哪些地方做得比较好或比较出色;

)什么地方做得不太好,以后如何改正;

)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);

)完成本题是否有其他的其他方法(如果有,简要说明该方法);

)对实验题的评价和改进意见,请你推荐设计题目。

时间安排:

设计安排一周:

周1、周2:

完成程序分析及设计。

周2、周3:

完成程序调试及测试。

周4、周5:

验收、撰写课程设计报告。

(注意事项:

严禁抄袭,一旦发现,抄与被抄的一律按0分记)

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

 

1、需求分析.......................4

2、功能设计.......................5

3、源程序..........................8

4、运行结果.......................13

5、总结.......................16

6、参考文献.......................16

 

生产者-消费者问题

1.需求分析

1.1问题描述:

一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。

1.2规则:

⏹对于生产者进程:

产生一个数据,当要送入缓冲区时,要检查缓冲区是否已满,若未满,则可将数据送入缓冲区,并通知消费者进程;否则,等待;

⏹对于消费者进程:

当它去取数据时,要看缓冲区中是否有数据可取,若有则取走一个数据,并通知生产者进程,否则,等待。

⏹缓冲区是个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,所以,还有个互斥的问题。

1.3信号灯设置:

两个同步信号灯--

  empty:

表示空缓冲区的数目,初值为有界缓冲区的大小n;

  full:

表示满缓冲区(即信息)的数目,其初值为0;

一个互斥信号灯--

  mutex:

互斥信号灯,初值为1。

1.4同步描述:

1.5程序描述:

main()

  {

  intfull=0;/*满缓冲区的数目*/

  intempty=n;/*空缓冲区的数目*/

  intmutex=1;/*对有界缓冲区进行操作的互斥信号灯*/

  cobegin

  p1();p2();

  coend

  }

p1()

{

while(生产未完成)

{

···

生产一个产品;

p(empty);

p(mutex);

送一个产品到有界缓冲区;

v(mutex);

v(full);

}

}

p2()

{

while(还要继续消费)

{

p(full);

p(mutex);

从有界缓冲区中取产品;

v(mutex);

v(empty);

···

消费一个产品;

}

}

1.6C++语言程序模拟用信号量机制实现生产者和消费者问题:

本次课程设计主要通过C++模拟信号量制中各个进程,及各进程之间的互斥、同步关系,来实现生产者和消费者问题。

 

2.功能设计

2.1设计目的:

通过实验模拟生产者和消费者之间的关系,了解并掌握他们之间的关系及其原理。

由此增加对进程同步的问题的了解。

具体如下:

1)掌握基本的同步互斥算法,理解生产者和消费者模型;

2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;

3)学习使用windows中基本的同步对象,掌握相应的API。

2.2设计功能:

利用模拟用信号量机制实现生产者和消费者问题:

通过用户控制取进程和放进程,反应生产者和消费者问题中所涉及的进程的同步与互斥。

2.3数据流程图:

1、生产者

 

2、消费者

 

2.4模块说明:

constunsignedshortSIZE_OF_BUFFER=10;//缓冲区长度

unsignedshortProductID=0;//产品号

unsignedshortConsumeID=0;//将被消耗的产品号

unsignedshortin=0;//产品进缓冲区时的缓冲区下标

unsignedshortout=0;//产品出缓冲区时的缓冲区下标

intg_buffer[SIZE_OF_BUFFER];//缓冲区是个循环队列

boolg_continue=true;//控制程序结束

HANDLEg_hMutex;//用于线程间的互斥

HANDLEg_hFullSemaphore;//当缓冲区满时迫使生产者等待

HANDLEg_hEmptySemaphore;//当缓冲区空时迫使消费者等待

DWORDWINAPIProducer(LPVOID);//生产者线程

DWORDWINAPIConsumer(LPVOID);//消费者线程

3、源程序

#include

#include

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=4;//生产者的个数

constunsignedshortCONSUMERS_COUNT=3;//消费者的个数

constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总线程数

HANDLEhThreads[PRODUCERS_COUNT];//各线程的handle

DWORDproducerID[CONSUMERS_COUNT];//生产者线程的标识符

DWORDconsumerID[THREADS_COUNT];//消费者线程的标识符

/*----------------------------生产一个产品开始------------------------------*/

//生产一个产品,输出其ID号

voidProduce()

{

std:

:

cout<

:

endl;

std:

:

cerr<<"生产一个产品:

"<<++ProductID;

std:

:

cout<

:

endl;

}

/*----------------------------生产一个产品结束------------------------------*/

/*----------------------把新生产的产品放入缓冲区开始------------------------*/

//把新生产的产品放入缓冲区

voidAppend()

{

std:

:

cerr<<"把生产的产品送入缓冲区";

g_buffer[in]=ProductID;

in=(in+1)%SIZE_OF_BUFFER;

std:

:

cerr<

:

endl;

std:

:

cout<<"缓冲区产品生产者/消费者"<

:

endl;

//新产品放入缓冲区后,输出缓冲区当前的状态

for(inti=0;i

{

//输出缓冲区下标

if(i<10)

std:

:

cout<

else

std:

:

cout<

if(i==in)

{

if(g_buffer[i]<10)

std:

:

cout<<"";

else

std:

:

cout<<"";

std:

:

cout<<"<--生产者";//输出生产者的指针位置

}

if(i==out)

{

if(g_buffer[i]<10)

std:

:

cout<<"";

else

std:

:

cout<<"";

std:

:

cout<<"<--消费者";//输出消费者的指针位置

}

std:

:

cout<

:

endl;

}

}

/*----------------------把新生产的产品放入缓冲区结束------------------------*/

/*----------------------------消费一个产品开始------------------------------*/

voidConsume()//消费一个产品

{

std:

:

cout<

:

endl;

std:

:

cerr<<"消费一个产品:

"<

std:

:

cout<

:

endl;

}

/*----------------------------消费一个产品结束------------------------------*/

/*-----------------------从缓冲区中取出一个产品开始-------------------------*/

//从缓冲区中取出一个产品

voidTake()

{

std:

:

cout<

:

endl;

std:

:

cerr<<"从缓冲区取出一个产品";

ConsumeID=g_buffer[out];

out=(out+1)%SIZE_OF_BUFFER;

std:

:

cerr<

:

endl;

std:

:

cout<

:

endl;

std:

:

cout<<"缓冲区产品生产者/消费者"<

:

endl;

//取出一个产品后,输出缓冲区当前的状态

for(inti=0;i

{

//输出缓冲区下标

if(i<10)

std:

:

cout<

else

std:

:

cout<

if(i==in)

{

if(g_buffer[i]<10)

std:

:

cout<<"";

else

std:

:

cout<<"";

std:

:

cout<<"<--生产者";//输出生产者的指针位置

}

if(i==out)

{

if(g_buffer[i]<10)

std:

:

cout<<"";

else

std:

:

cout<<"";

std:

:

cout<<"<--消费者";//输出消费者的指针位置

}

std:

:

cout<

:

endl;

}

}

/*-----------------------从缓冲区中取出一个产品结束-------------------------*/

/*-----------------------------生产者线程开始-------------------------------*/

//生产者线程

DWORDWINAPIProducer(LPVOIDlpPara)

{

while(g_continue)

{

//资源信号量的P操作

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

{

hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]);

if(hThreads[j]==NULL)

g_continue=0;

}

}

/*---------------------------创建消费者线程结束-----------------------------*/

/*-------------------------------主函数开始---------------------------------*/

voidmain()

{

//创建互斥信号量

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();

//不按回车键的话程序会一直运行下去

while(g_continue)

//按回车键终止程序

if(getchar())

g_continue=0;

}

/*-------------------------------主函数结束---------------------------------*/

4、运行结果:

 

 

5、总结:

本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。

在同一个进程地址空间内执行的两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

 

6、参考文献

1、汤子瀛等.计算机操作系统.西安电子科技大学出版社.2004年5月

2、付国瑜杨武周敏.计算机操作系统原理及应用上机实验指导.重庆工学院计算机学院.2005年1月.

 

本科生课程设计成绩评定表

班级:

1006班  姓名:

丁探  学号:

0121010340621

序号

评分项目

满分

实得分

1

学习态度认真、遵守纪律

10

2

设计分析合理性

10

3

设计方案正确性、可行性、创造性

20

4

设计结果正确性

40

5

设计报告的规范性

10

6

设计验收

10

总得分/等级

评语:

注:

最终成绩以五级分制记。

优(90-100分)、良(80-89分)、中(70-79分)、

及格(60-69分)、60分以下为不及格

 

                     指导教师签名:

                 20年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1