-
大小: 46KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-05-16
- 語(yǔ)言: C/C++
- 標(biāo)簽:
資源簡(jiǎn)介
這個(gè)是很經(jīng)典的問(wèn)題
實(shí)驗(yàn)題目: 生產(chǎn)者與消費(fèi)者(綜合性實(shí)驗(yàn))
實(shí)驗(yàn)環(huán)境: C語(yǔ)言編譯器
實(shí)驗(yàn)內(nèi)容:
① 由用戶指定要產(chǎn)生的進(jìn)程及其類別,存入進(jìn)入就緒隊(duì)列。
② 調(diào)度程序從就緒隊(duì)列中提取一個(gè)就緒進(jìn)程運(yùn)行。如果申請(qǐng)的資源被阻塞則進(jìn)入相應(yīng)的等待隊(duì)列,調(diào)度程序調(diào)度就緒隊(duì)列中的下一個(gè)進(jìn)程。進(jìn)程運(yùn)行結(jié)束時(shí),會(huì)檢查對(duì)應(yīng)的等待隊(duì)列,激活隊(duì)列中的進(jìn)程進(jìn)入就緒隊(duì)列。運(yùn)行結(jié)束的進(jìn)程進(jìn)入over鏈表。重復(fù)這一過(guò)程直至就緒隊(duì)列為空。
③ 程序詢問(wèn)是否要繼續(xù)?如果要轉(zhuǎn)直①開(kāi)始執(zhí)行,否則退出程序。
實(shí)驗(yàn)?zāi)康模?通過(guò)實(shí)驗(yàn)?zāi)M生產(chǎn)者與消費(fèi)者之間的關(guān)系,了解并掌握他們之間的關(guān)系及其原理。由此增加對(duì)進(jìn)程同步的問(wèn)題的了解。
實(shí)驗(yàn)要求:
每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程類型標(biāo)號(hào)、進(jìn)程系統(tǒng)號(hào)、進(jìn)程狀態(tài)、進(jìn)程產(chǎn)品(字符)、進(jìn)程鏈指針等等。
系統(tǒng)開(kāi)辟了一個(gè)緩沖區(qū),大小由buffersize指定。
程序中有三個(gè)鏈隊(duì)列,一個(gè)鏈表。一個(gè)就緒隊(duì)列(ready),兩個(gè)等待隊(duì)列:生產(chǎn)者等待隊(duì)列(producer);消費(fèi)者隊(duì)列(consumer)。一個(gè)鏈表(over),用于收集已經(jīng)運(yùn)行結(jié)束的進(jìn)程
本程序通過(guò)函數(shù)模擬信號(hào)量的操作。
參考書(shū)目:
1)徐甲同等編,計(jì)算機(jī)操作系統(tǒng)教程,西安電子科技大學(xué)出版社
2)Andrew S. Tanenbaum著,陳向群,馬紅兵譯. 現(xiàn)代操作系統(tǒng)(第2版). 機(jī)械工業(yè)出版社
3)Abranham Silberschatz, Peter Baer Galvin, Greg Gagne著. 鄭扣根譯. 操作系統(tǒng)概念(第2版). 高等教育出版社
4)張堯?qū)W編著. 計(jì)算機(jī)操作系統(tǒng)教程(第2版)習(xí)題解答與實(shí)驗(yàn)指導(dǎo). 清華大學(xué)出版社
實(shí)驗(yàn)報(bào)告要求:
(1) 每位同學(xué)交一份電子版本的實(shí)驗(yàn)報(bào)告,上傳到202.204.125.21服務(wù)器中。
(2) 文件名格式為班級(jí)、學(xué)號(hào)加上個(gè)人姓名,例如:
電子04-1-040824101**.doc
表示電子04-1班學(xué)號(hào)為040824101號(hào)的**同學(xué)的實(shí)驗(yàn)報(bào)告。
(3) 實(shí)驗(yàn)報(bào)告內(nèi)容的開(kāi)始處要列出實(shí)驗(yàn)的目的,實(shí)驗(yàn)環(huán)境、實(shí)驗(yàn)內(nèi)容等的說(shuō)明,報(bào)告中要附上程序代碼,并對(duì)實(shí)驗(yàn)過(guò)程進(jìn)行說(shuō)明。
基本數(shù)據(jù)結(jié)構(gòu):
PCB* readyhead=NULL, * readytail=NULL; // 就緒隊(duì)列
PCB* consumerhead=NULL, * consumertail=NULL; // 消費(fèi)者隊(duì)列
PCB* producerhead=NULL, * producertail=NULL; // 生產(chǎn)者隊(duì)列
over=(PCB*)malloc(sizeof(PCB)); // over鏈表
int productnum=0; //產(chǎn)品數(shù)量
int full=0, empty=buffersize; // semaphore
char buffer[buffersize]; // 緩沖區(qū)
int bufferpoint=0; // 緩沖區(qū)指針
struct pcb { /* 定義進(jìn)程控制塊PCB */
int flag; // flag=1 denote producer; flag=2 denote consumer;
int numlabel;
char product;
char state;
struct pcb * processlink;
……
};
processproc( )--- 給PCB分配內(nèi)存。產(chǎn)生相應(yīng)的的進(jìn)程:輸入1為生產(chǎn)者進(jìn)程;輸入2為消費(fèi)者進(jìn)程,并把這些進(jìn)程放入就緒隊(duì)列中。
waitempty( )--- 如果緩沖區(qū)滿,該進(jìn)程進(jìn)入生產(chǎn)者等待隊(duì)列;linkqueue(exe,&producertail); // 把就緒隊(duì)列里的進(jìn)程放入生產(chǎn)者隊(duì)列的尾部
void signalempty()
bool waitfull()
void signalfull()
void producerrun()
void comsuerrun()
void main()
{ processproc();
element=hasElement(readyhead);
while(element){
exe=getq(readyhead,&readytail);
printf("進(jìn)程%d申請(qǐng)運(yùn)行,它是一個(gè)",exe->numlabel);
exe->flag==1? printf("生產(chǎn)者\(yùn)n"):printf("消費(fèi)者\(yùn)n");
if(exe->flag==1)
producerrun();
else
comsuerrun();
element=hasElement(readyhead);
}
printf("就緒隊(duì)列沒(méi)有進(jìn)程\n");
if(ha

代碼片段和文件信息
/*
*/
#include
#include
#include
struct?PCB
{???
int?flag; //1為生產(chǎn)者2為消費(fèi)者
int?numLabel;
};
typedef?struct?QNode
{
PCB?data;//數(shù)據(jù)域
struct?QNode*?next;//指針域
}QNode?*QueuePtr;
typedef?struct
{
QueuePtr?front;//隊(duì)頭指針
QueuePtr?rear;//隊(duì)尾指針
}linkQueue;
typedef?struct?LNode
{
QueuePtr?data;
struct?LNode?*next;
}LNode?*linkList;
void?QueueInit(linkQueue&?Q)//初始化隊(duì)列
{
Q.front?=?Q.rear?=?(QueuePtr)malloc(sizeof(QNode));
Q.front->next?=?NULL;
}
void?linkListInit(linkList&?L)//初始化鏈表
{
L?=?(linkList)malloc(sizeof(LNode));
}
void?EnQueue(linkQueue&?Q?QueuePtr?p)//入隊(duì)
{
p->next?=?NULL;
Q.rear->next?=?p;
Q.rear?=?p;
}
QueuePtr?DeQueue(linkQueue&?Q)//出隊(duì)
{
QueuePtr?p?=?Q.front->next;
Q.front->next?=?p->next;
if(Q.rear?==?p)Q.rear?=Q.front;
return?p;
}
void?linkListInsert(linkList&?L?QueuePtr?e)//進(jìn)入鏈表
{
linkList?p?=?L;
linkList?q?=?(linkList)malloc(sizeof(LNode));
while(p->next)p++;
q->data?=?e;
q->next?=?NULL;
p->next?=?q;
}
void?processproc(linkQueue&?Q)//創(chuàng)建進(jìn)程進(jìn)入初始隊(duì)列
{
int?processNum?=?0;
cout<<“請(qǐng)輸入進(jìn)程的個(gè)數(shù):“;//確定進(jìn)程個(gè)數(shù),默認(rèn)為0
cin>>processNum;
for(int?i?=?0;?i? {
cout<<“輸入第“< struct?PCB?pcb;
cin>>pcb.flag;//輸入進(jìn)程的種類
pcb.numLabel?=?i+1;//進(jìn)程序號(hào)賦值
QueuePtr?p?=?(QueuePtr)malloc(sizeof(QNode));
p->data?=?pcb;
EnQueue(Q?p);
}
}
bool?HasElement(linkQueue?Q)//判斷隊(duì)列是否為空
{
if(Q.front?==?Q.rear)return?false;
else?return?true;
}
int?ProduceRun(int&?full?int?BufferSize)//運(yùn)行生產(chǎn)者進(jìn)程
{
if(full? {
full++;
return?1;
}
return?0;
}
int?ConsumeRun(int&?full?int?BufferSize)//運(yùn)行消費(fèi)者進(jìn)程
{
if(full?>?0)
{
full--;
return?1;
}
return?0;
}
void?DisPlay(linkQueue?Q)//打印隊(duì)列
{
QueuePtr?p?=?Q.front;
while(p->next){
cout<<“進(jìn)程“<next->data.numLabel< p?=?p->next;
}
}
void?main()
{
int?BufferSize;//設(shè)置緩沖區(qū)大小
cout<<“請(qǐng)?jiān)O(shè)置緩沖區(qū)的大小:?“;
cin>>BufferSize;
????int?full?=?0;//當(dāng)前緩沖區(qū)中的進(jìn)程數(shù)目
int?temp?=?1;
linkList?over;//用于收集已經(jīng)運(yùn)行結(jié)束的進(jìn)程
linkListInit(over);
linkQueue?ReadyQueue;//就緒隊(duì)列
linkQueue?ProducerWaitQueue;//生產(chǎn)者等待隊(duì)列
linkQueue?ConsumerWaitQueue;//消費(fèi)者等待隊(duì)列
//初始化
QueueInit(ReadyQueue);
QueueInit(ProducerWaitQueue);
QueueInit(ConsumerWaitQueue);
while(temp)//死循環(huán)
{
processproc(ReadyQueue);//創(chuàng)建進(jìn)程進(jìn)入就緒隊(duì)列
bool?element=HasElement(ReadyQueue);//判斷隊(duì)列是否為空
while(element)//當(dāng)它不是空的
{
cout<<“進(jìn)程“<next->data.numLabel<<“申請(qǐng)運(yùn)行他是一個(gè)“;
/********************************************************************/
if(ReadyQueue.front->next->data.flag?==?1)//如果它是一個(gè)生產(chǎn)者
{
cout<<“生產(chǎn)者“<
if(ProduceRun(full?BufferSize)?==?1)//判斷緩存區(qū)是否還有空間
{
cout<<“進(jìn)程“<next->data.numLabel<<“執(zhí)行完畢“< linkListInsert(over?DeQueue(ReadyQueue));//運(yùn)行結(jié)束,進(jìn)入over鏈表
if(HasElement(ProducerWaitQueue))//檢查生產(chǎn)者等待隊(duì)列,激活隊(duì)列中的進(jìn)程進(jìn)入就緒隊(duì)列
EnQueu
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????5023??2009-01-07?20:35??sys2\sy2\sy2.cpp
?????文件??????94208??2009-01-07?20:35??sys2\實(shí)驗(yàn)報(bào)告2.doc
?????目錄??????????0??2011-06-12?08:54??sys2\sy2
?????目錄??????????0??2011-06-12?08:52??sys2
-----------?---------??----------?-----??----
????????????????99231????????????????????4
評(píng)論
共有 條評(píng)論