-
大小: 12KB文件類型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-05-13
- 語言: C/C++
- 標(biāo)簽: 進程調(diào)度??
資源簡介
編寫一個單處理機下的進程調(diào)度程序,模擬操作系統(tǒng)對進程的調(diào)度。
要求:
1.能夠創(chuàng)建指定數(shù)量的進程,每個進程由一個進程控制塊表示。
2.實現(xiàn)先來先服務(wù)調(diào)度算法:進程到達(dá)時間可由進程創(chuàng)建時間表示。
3.實現(xiàn)短作業(yè)優(yōu)先調(diào)度算法:可指定進程要求的運行時間。(說明:對不可剝奪的短作業(yè)優(yōu)先算法,當(dāng)作業(yè)運行時間相等時,優(yōu)先調(diào)度進程號小的進程執(zhí)行;對可剝奪式的短作業(yè)優(yōu)先算法,即選最短剩余時間的進程進行運行,在剩余時間相同的情況下,選擇到達(dá)時間早的進程進行運行)
4. 實現(xiàn)時間片輪轉(zhuǎn)調(diào)度算法:可指定生成時間片大小。(說明:新進程到來時插入到就緒隊列的隊尾,當(dāng)進程P運行完一個時間片時,若同時有進程Q到達(dá),則先在就緒隊列隊尾插入新到達(dá)的進程Q,之后再插入進程P)
5.實現(xiàn)動態(tài)優(yōu)先級調(diào)度算法:可指定進程的初始優(yōu)先級(優(yōu)先級與優(yōu)先數(shù)成反比,優(yōu)先級最高為0),優(yōu)先級改變遵循下列原則:進程在就緒隊列中每停留一個時間片,優(yōu)先級加1,進程每運行一個時間片,優(yōu)先級減3。(說明:本算法在優(yōu)先級相同的情況下,選擇到達(dá)時間早的進程進行運行)
測試用例格式如下:
輸入:調(diào)度算法
進程號/到達(dá)時間/運行時間/優(yōu)先級/時間片
輸出:調(diào)度順序/進程號/開始運行時間/結(jié)束運行時間/優(yōu)先級
其中調(diào)度算法選項為:1----先來先服務(wù),2----短作業(yè)優(yōu)先,3----最短剩余時間優(yōu)先,4----時間片輪轉(zhuǎn),5----動態(tài)優(yōu)先級
代碼片段和文件信息
#include
#include
#include
#include?
#include
#include
using?namespace?std;
void?FIFO(void);??//先到先服務(wù)?
void?SJF();??//短作業(yè)優(yōu)先
void?RR();???//時間片輪轉(zhuǎn)?
void?SRT();??//最短剩余時間??
void?DP(); ?//動態(tài)優(yōu)先級?
void?print(void);
void?sort(void);//到達(dá)時間升序排序(冒泡法)?
typedef?struct?node
{?
int?id;??//進程號?
int?arrivaltime;??//到達(dá)時間?
int?runtime;??//?運行時間
int?prio;??//優(yōu)先級
int?round;??//時間片
int?flag=1;???//進程是否執(zhí)行標(biāo)記?
bool?pushed=false; //是否推進隊列?
bool?done=false;//?是否執(zhí)行完?
int?order; //順序
int?startruntime; //進程開始運行時間?
int?endruntime; //進程結(jié)束運行時間?
}PCB;//輸入進程?
PCB?p[50]; //輸入進程塊?
int?p_ptr=0; //輸入進程個數(shù)
PCB?po[100]; //存放輸出的進程塊?
int?po_ptr; //輸出進程個數(shù)?
PCB?tab;?
PCB?temp;? ?//取隊列頭,存放于temp中?
int?compareArrivaltime(PCB?aPCB?b)?;
//按進程到達(dá)時間升序排序函數(shù)
int?compareRuntime(PCB?aPCB?b);
int?comparePriority(PCB?a?PCB?b)?;
int?systemtime=0; //系統(tǒng)時間
queue?que; //定義一個隊列存放就緒進程?
int?main()?
{
int?j?=?0?k?=?0;
int?n?;??//調(diào)度算法?
scanf(“%d“&n);??//輸入是第幾個調(diào)度算法
while(scanf(“%d/%d/%d/%d/%d“&p[p_ptr].id&p[p_ptr].arrivaltime
&p[p_ptr].runtime&p[p_ptr].prio&p[p_ptr].round)?==?5)
{
p_ptr++;??//每次進程個數(shù)加一?
}
switch(n)
{
case?1:
FIFO();??//先到先服務(wù)?
break;
case?2:??//短作業(yè)優(yōu)先?
????SJF();
break;
case?3:
SRT();
break;
case?4:
????RR();
break;?
case?5:
DP();
break;
}?
}
void?FIFO()?//先到先服務(wù)算法?
{
sort();??//按到達(dá)時間從小到大冒泡排序
//stable_sort(pp+p_ptrcompareArrival)?;
int?i?j?k;
po_ptr=p_ptr;//輸出數(shù)組和輸入數(shù)組一樣大?
for(j?=?0;?j? {
po[j].order?=?j?+?1;??//調(diào)度順序?
po[j].id?=?p[j].id;??//進程號?
po[j].prio=p[j].prio;??//優(yōu)先級?
if(j?==?0)???//最先達(dá)到的進程?
{
po[j].startruntime?=?p[j].arrivaltime;
po[j].endruntime?=?p[j].runtime+p[j].arrivaltime;
}
else?
{
if(p[j].arrivaltime //到了到達(dá)時間,此時上一個進程還在執(zhí)行?
{
po[j].startruntime?=?po[j-1].endruntime;
po[j].endruntime=po[j-1].endruntime+p[j].runtime;??
}
else//到了到達(dá)時間,此時上一個進程已結(jié)束?
{
po[j].startruntime?=p[j].arrivaltime;
po[j].endruntime=p[j].runtime+p[j].arrivaltime;
}
}
}
print();
}
void?SJF()//短作業(yè)優(yōu)先?
{
int?jik;
int?flag1=0;//記錄開始時間最小的進程號?
int?minarrivaltime=100;
for(j=0;j {
????int?minruntime=100;
????for(i=0;i ????{
????????if(p[i].flag==1&&p[i].arrivaltime //找出進程最小開始時間?
{
minarrivaltime=p[i].arrivaltime;
}
}
while(systemtime //把系統(tǒng)時間設(shè)為進程最小開始時間?
{
systemtime++;
}
for(i=0;i {
if(p[i].flag==1&&p[i].arrivaltime<=systemtime
????&&p[i].runtime //選出未執(zhí)行、當(dāng)前系統(tǒng)可執(zhí)行的進程中最短的進程?
{
minruntime=p[i].runtime;
flag1=i; //?標(biāo)記最短進程序號?
}
}
p[flag1].flag=0;?//進程執(zhí)行了,flag置為0?
po[j].order?=?j?+?1;??//調(diào)度順序?
po[j].id?=?p[flag1].id;??//進程號?
po[j].prio=p[flag1].prio;??//優(yōu)先級?
????po[j].startruntime=systemtime;//進程開始
評論
共有 條評論