資源簡介
實驗內容:
① 由用戶指定要產生的進程及其類別,存入進入就緒隊列。
② 調度程序從就緒隊列中提取一個就緒進程運行。如果申請的資源被阻塞則進入相應的等待隊列,調度程序調度就緒隊列中的下一個進程。進程運行結束時,會檢查對應的等待隊列,激活隊列中的進程進入就緒隊列。運行結束的進程進入over鏈表。重復這一過程直至就緒隊列為空。
③ 程序詢問是否要繼續?如果要轉直①開始執行,否則退出程序。
實驗目的:
通過實驗模擬生產者與消費者之間的關系,了解并掌握他們之間的關系及其原理。由此增加對進程同步的問題的了解。
實驗要求:
每個進程有一個進程控制塊(PCB)表示。進程控制塊可以包含如下信息:進程類型標號、進程系統號、進程狀態、進程產品(字符)、進程鏈指針等等。
系統開辟了一個緩沖區,大小由buffersize指定。
程序中有三個鏈隊列,一個鏈表。一個就緒隊列(ready),兩個等待隊列:生產者等待隊列(producer);消費者等待隊列(consumer)。一個鏈表(over),用于收集已經運行結束的進程
本程序通過函數模擬信號量的原子操作。
代碼片段和文件信息
/*#include
#include
#include
#include
using?namespace?std;
#define?buffersize??10//緩沖區的長度
struct?PCB{
string?cls;//producer?and?consumer
int?number;
string?zhuangtai;
PCB?*next;
};
int?buffersum;//記錄緩沖區有多少已經填充
PCB?*ready?*prowait?*conwait?*over;
PCB?*P[20];
void?Init(){//初始化,將20個進程分為生產者與消費者
int?clas?i;
PCB?*p;
ready?=?new?PCB;
ready->next?=?NULL;
over?=?new?PCB;
over->next?=?NULL;
prowait?=?new?PCB;
prowait->next?=?NULL;
conwait?=?new?PCB;
conwait->next?=?NULL;//完成頭指針的初始化
p?=?ready;
srand((int)time(0));
clas=rand()?%?20+1;
for?(i?=?1;?i?<=?clas;?i++){
P[i?-?1]?=?new?PCB;
P[i?-?1]->next?=?NULL;
P[i?-?1]->cls?=?“producer“;
P[i?-?1]->number?=?i;
P[i?-?1]->zhuangtai?=?“ready“;
p->next?=?P[i?-?1];
p?=?p->next;
}
for?(i?=?clas?+?1;?i?<=?20;?i++){
P[i?-?1]?=?new?PCB;
P[i?-?1]->next?=?NULL;
P[i?-?1]->cls?=?“consumer“;
P[i?-?1]->number?=?i;
P[i?-?1]->zhuangtai?=?“ready“;
p->next?=?P[i?-?1];
p?=?p->next;
}
}
void?print(){
PCB?*p;
p?=?over->next;
cout?<“##運行結束進程:“?< while?(1){
if?(p?==?NULL)
break;
cout?<“進程系統號:“?<number?<“\t進程類型:“?<cls?< p?=?p->next;
}
p?=?ready->next;
cout?<“##就緒隊列:“?< while?(1){
if?(p?==?NULL)
break;
cout?<“進程系統號:“?<number?<“\t進程類型:“?<cls?< p?=?p->next;
}
p?=?prowait->next;
cout?<“##生產者等待隊列:“< while?(1){
if?(p?==?NULL)
break;
cout?<“進程系統號:“?<number?<“\t進程類型:“?<cls?< p?=?p->next;
}
p?=?conwait->next;
cout?<“##消費者等待隊列:“?< while?(1){
if?(p?==?NULL)
break;
cout?<“進程系統號:“?<number?<“\t進程類型:“?<cls?< p?=?p->next;
}
}
void?jud
評論
共有 條評論