資源簡介
實驗內容:
進程調度模擬程序:假設有10個進程需要在CPU上執行,分別用:
? 先進先出調度算法;
? 基于優先數的調度算法;
? 最短執行時間調度算法
確定這10個進程在CPU上的執行過程。要求每次進程調度時在屏幕上顯示:
? 當前執行進程;
? 就緒隊列;
? 等待隊列
實驗目的:
1)掌握處理機調度及其實現;
2)掌握進程狀態及其狀態轉換;
3)掌握進程控制塊PCB及其作用。
實驗要求:
1) 創建10個進程的PCB,每個PCB包括:進程名、進程狀態、優先級(1~10)、需要在處理機上執行的時間(ms)、隊列指針等;
2) 初始化10個PCB(產生隨機數0或1,分別表示進程處于就緒態或等待態);
3) 根據調度算法選擇一個就緒進程在CPU上執行;
4) 在進程執行過程中,產生隨機數0或1,該隨機數為1時,將等待隊列中的第一個PCB加入就緒隊列的對尾;
5) 在進程執行過程中,產生一個隨機數,表示執行進程能在處理機上執行的時間,如果隨機時間大于總需要的時間,則執行完成。如果小于,則從總時間中減去執行時間。
6) 如果執行進程沒有執行完成。則產生隨機數0或1,當該隨機數為0時,將執行進程加入就緒隊列對尾;否則,將執行進程加入等待隊列對尾;
7) 一直到就緒隊列為空,程序執行結束。
代碼片段和文件信息
#include
#define?OK?1
#define?ERROR?0
#include?
#include?
using?namespace?std;
struct?PCB//進程控制塊的結構定義?
{
int?name;//用數字對數據塊標號?1-10?
int?state;//其狀態為0或1?其中0表示?等待狀態?1表示就緒狀態?
int?prior;//優先級??隨機數1-10?
int?time;?//執行進程所需時間?隨機產生??
};
//////////////////////////////////////////////////隊列的鏈式存儲結構?
typedef?struct?QNode//定義結點
{
???PCB???data;
???struct?QNode??*next;
}?QNode?*QueuePtr;
typedef?struct?
{
???QueuePtr??front;????????????//隊頭指針???
???QueuePtr??rear;?????????????//隊尾指針
}linkQueue;?
/////////////////////////////////////////////////以下是處理鏈隊的基本函數
?int?InitQueue?(linkQueue?&Q)//初始化隊列
{
???Q.front=Q.rear=new?QNode;
????Q.front->next=NULL;
????return?OK;
}
int?EnQueue(linkQueue?&QPCB?e)//將一個結點插入到隊列當中?
{?
QueuePtr?p=new?QNode;
????if(!p)?
exit(0);
????p->data=e;
p->next=NULL;
????Q.rear->next=p;
????Q.rear=p;
????return?OK;
}
int?PrintQueue(linkQueue?&Q)//打印整個隊列
{
QueuePtr?p=new?QNode;
if(Q.front==Q.rear)?
return?ERROR;
p=Q.front->next;
do
{
cout<<“?????????“<data.name<<“?????????“<data.state<<“?????????“<data.prior<<“?????????“<data.time< p=p->next;
}while(p!=NULL);
cout< delete?p;
return?OK;
}
int?DeQueue?(linkQueue?&QPCB?&e)//刪除一個結點?
{
QueuePtr?p=new?QNode;
???if(Q.front==Q.rear)?return?ERROR;
???p=Q.front->next;
???e=p->data;
???Q.front->next=p->next;
???if(Q.rear==p)?Q.rear=Q.front;
???delete?p;
???return?OK;
}
int?GetHead?(linkQueue?&QPCB?&e)//讀取對列頭元素
{
e=Q.front->next->data;
return?OK;
}
int?QueueEmpty?(linkQueue?Q)//判斷隊列是否為空,為空則返回0
{
if(Q.front==Q.rear)
return?0;????
else
return?1;
?}
?void?fifo(linkQueue?&waitlinkQueue?&oklinkQueue?&run)//先進先出調度算法,wait為等待對列,ok為就緒隊列run為運行隊列?
{
srand((unsigned)time(NULL));//讓隨機數不重復
PCB?temp1;?
int?t;
while(QueueEmpty(wait)==1||QueueEmpty(ok)==1)//當等待或者就緒隊列其中一個不為空時執行?
{
int?cpu=rand()%50+1;?
///////////////////////////////////////////////就緒隊列放一個元素到運行隊列中
if(1==QueueEmpty(ok))//ok隊列非空
{
DeQueue?(oktemp1);//就緒隊列中出一個元素
if(temp1.time<=cpu)?
{
temp1.state=2; //2表示運行狀態?
EnQueue(runtemp1);//就緒隊列頭進入運行隊列
cout< cout<<“當前執行進程為:“< cout<<“執行完成!!!!\n該進程所需時間為“< }
else
{
cout<<“當前執行進程為:“< cout<<“執行一部分,該進程所需時間為“< temp1.time=temp1.time-cpu;
int?j=rand()%2;
if(j==1)
{
EnQueue(oktemp1);
}
else
{
EnQueue(waittemp1);?
?}?
}
}
else
{
cout<<“就緒隊列為空“< }
//////////////////////////////////////////////////////////產生一個隨機數0或者1,1的話等待隊列的第一個進程插入到就緒隊列
if(1==QueueEmpty(wait))//等待隊列非空
{
int?j=rand()%2;
if(j==1)
{
DeQueue?(waittemp1);
temp1.state?=?1;
EnQueue(oktemp1);
}
}
////////////////////////////////////////////////////////////輸
- 上一篇:控制臺五子棋程序c語言
- 下一篇:VC++簡單多人聊天室源碼
評論
共有 條評論