-
大小: 7KB文件類型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-06-14
- 語(yǔ)言: C/C++
- 標(biāo)簽: 操作系統(tǒng)??生產(chǎn)者??消費(fèi)者??
資源簡(jiǎn)介
熟練應(yīng)用生產(chǎn)者消費(fèi)者PV操作的實(shí)驗(yàn),
實(shí)驗(yàn)內(nèi)容
1. 由用戶指定要產(chǎn)生的進(jìn)程及其類別,存入進(jìn)入就緒隊(duì)列。
2. 調(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ì)列為空。
3. 程序詢問(wèn)是否要繼續(xù)?如果要轉(zhuǎn)直①開(kāi)始執(zhí)行,否則退出程序。
代碼片段和文件信息
#include?“stdio.h“
#include??
#include??
#include?“iostream.h“
#define?NULL?0?
#define?OK?1
#define?ERROR?0
#define?buffersize?3
#define?getpch(type)?(type*)malloc(sizeof(type))?
int?productnum=0;??//產(chǎn)品數(shù)量
int?processnum=0;//進(jìn)程計(jì)數(shù)器
int?full=0;?
int?empty=buffersize;?//?semaphore
char?buffer[buffersize];??//?緩沖區(qū)
int?bufferpoint=0;??//?緩沖區(qū)指針
struct?pcb?
{??/*?定義進(jìn)程控制塊PCB?*/
int?flag;??//?flag=1?表示生產(chǎn)者;?flag=2?表示消費(fèi)者
int?numlabel;//進(jìn)程編號(hào)
char?product;//產(chǎn)品
char?state;//進(jìn)程狀態(tài)
struct?pcb?*?processlink;
}*exe=NULL*over=NULL;??//?over鏈表
typedef?struct?pcb?PCB;
PCB*?readyhead=NULL?*?readytail=NULL;???//?就緒隊(duì)列
PCB*?consumerhead=NULL?*?consumertail=NULL;??//?消費(fèi)者隊(duì)列
PCB*?producerhead=NULL?*?producertail=NULL;???//?生產(chǎn)者隊(duì)列
int?InitQueue?(PCB*?headPCB*?tail)
{//初始化隊(duì)列
????if(!head)?
exit(0);
????head->processlink=NULL;
????return?OK;
}
bool?hasElement(PCB*pro)
{//判斷隊(duì)列是否為空
if(pro->processlink==NULL)
return?false;
else?
return?true;
}
void?linkqueue(PCB*?processPCB**?tail)
{???//?把就緒隊(duì)列里的進(jìn)程放入生產(chǎn)者隊(duì)列的尾
(*tail)->processlink=process;
(*tail)=process;?
return?;
}
void?freelink(PCB*?linkhead)
{//清除隊(duì)列
PCB*?p;
while(linkhead!=NULL)
{
p=linkhead;
linkhead=linkhead->processlink;
free(p);
}
return?;
}
PCB*?getq(PCB*?headPCB**?tail)
{//出隊(duì)
PCB*?p;
p=head->processlink;
if(p!=NULL)
{
head->processlink=p->processlink;
p->processlink=NULL;?
if(?head->processlink?==NULL?)
(*tail)=head;
}
else
return?NULL;
return?p;
}
void?linklist(PCB*?pPCB*?listhead)
{
PCB*?cursor=listhead;
while(cursor->processlink!=NULL)
{
cursor=cursor->processlink;
}
cursor->processlink=p;
}
int?processproc()
{//給PCB分配內(nèi)存。
int?ifnum;
char?ch;
PCB*p=NULL;
cout< printf(“:)??請(qǐng)輸入進(jìn)程個(gè)數(shù):“);
cin>>num;
for(i=0;i {//產(chǎn)生相應(yīng)的的進(jìn)程:
cout<<“:)??輸入1生產(chǎn)者進(jìn)程“< cout<<“:)??輸入2消費(fèi)者進(jìn)程“< scanf(“%d“&f);????????????????????????????
getchar();
p=(PCB*)malloc(sizeof(PCB));
if(!p)
{
cout<<“:)??內(nèi)存分配失敗“< return?false;
}
p->flag=f;//進(jìn)程標(biāo)志,1為生產(chǎn)者,2為消費(fèi)者
processnum++;//進(jìn)程計(jì)數(shù)器加1
p->numlabel=processnum;//進(jìn)程編號(hào)記為進(jìn)程計(jì)數(shù)器
p->state=‘w‘;//置為等待
p->processlink=NULL;
if(p->flag==1)
{//輸入1為生產(chǎn)者進(jìn)程;
cout<<“:)??您要產(chǎn)生的進(jìn)程是生產(chǎn)者,它是第“< cout<<“:)??請(qǐng)輸入您要該進(jìn)程產(chǎn)生的字符“< scanf(“%c“&ch);
getchar();
p->product=ch;
productnum++;
cout<<“:)??該進(jìn)程產(chǎn)生的內(nèi)容是“<product< }
else
{?//輸入2為消費(fèi)者進(jìn)程;
cout<<“:)??產(chǎn)生的進(jìn)程是消費(fèi)者,它是第“<numlabel<<“個(gè)進(jìn)程“< }
linkqueue(p&readytail);??//并把這些進(jìn)程放入就緒隊(duì)列中。
}
return?true;
}
bool?waitempty()
{//?如果緩沖區(qū)滿,該進(jìn)程進(jìn)入生產(chǎn)者等待隊(duì)列;
if(empty<=0)
{
cout<<“:)??進(jìn)程“<numlabel<<“緩沖區(qū)存數(shù),該進(jìn)程進(jìn)入生產(chǎn)者等待隊(duì)列“< linkqueue(exe&producertail);//緩沖區(qū)滿,進(jìn)程壓入生產(chǎn)者等待隊(duì)列隊(duì)尾
return?false;
}
else
{
empty--;//緩沖區(qū)未滿,則進(jìn)行生產(chǎn)操作
return?true;
}
}
void?signalempty()
{//將等待中的生產(chǎn)者進(jìn)程進(jìn)入就緒隊(duì)列
PCB*?p;
評(píng)論
共有 條評(píng)論