1實驗目的
通過動態優先權演算法的模擬加深對程序概念和程序排程過程的理解。
2實驗內容
(1)實現對n個程序採用動態優先權優先演算法的程序排程。
(2)每個用來標識程序的程序控制塊pcb用結構來描述,包括以下字段:
程序標識數 id。
程序優先數 priority,並規定優先數越大的程序,其優先權越高。
程序已占用的cpu時間cputime。
程序還需占用的cpu時間alltime。當程序執行完畢時,alltime變為0。
程序的阻塞時間startblock,表示當程序再執行startblock個時間片後,將進入阻塞狀態。
程序被阻塞的時間blocktime,表示已阻塞的程序再等待blocktime個時間片後,將轉換成就緒狀態。
程序狀態state。
佇列指標next,用來將pcb排成佇列。
(3)優先數改變的原則:
程序在就緒佇列中停留乙個時間片,優先數加1。
程序每執行乙個時間片,優先數減3。
(4)假設在排程前,系統中有5個程序,它們的初始狀態如下:id0
1234
priority938
3029
0cputime00
000alltime33
634startblock2-1
-1-1
-1blocktime2-1
-1-1
-1state
ready
ready
ready
ready
ready
id 0 1 2 3 4
priority 9 38 30 29 0
cputime 0 0 0 0 0
alltime 3 3 6 3 4
startblock 2 -1 -1 -1 -1
blocktime 3 0 0 0 0
state ready ready ready ready ready
(5)為了清楚的觀察各程序的排程過程,程式應將每個時間片內的情況顯示出來,參照的具體格式如下:
running prog:i
ready-queue:->id1->id2
block-queue:->id3->id4
id 0 1 2 3 4
priority p0 p1 p2 p3 p4
cuptime c0 c1 c2 c3 c4
alltime a0 a1 a2 a3 a4
startblock t0 t1 t2 t3 t4
blocktime b0 b1 b2 b3 b4
state s0 s1 s2 s3 s4
code
#include #include #define n 5
enum state;
struct pcb //資料結構
*ready_pro,*block_pro,*ready_tail,*block_tail;//就緒,阻塞佇列,記錄其頭指標,
int ready_num,block_num;//就緒,執行,阻塞佇列中程序的數量。
struct pcb record[n];
//原始資料
int id = ;
int priority = ;
int cputime = ;
int alltime = ;
int startblock = ;
int blocktime = ;
enum state state =;
//將新的程序插入到就緒佇列中
//用插入排序的方法,保證了就緒佇列的值是按照大小排序的,
void ready_push(struct pcb* pro)
else
else//如果不是頭指標則,插入佇列中
break;//插入後退出迴圈}}
if(this_pro== null)//如果pro的優先順序最小則插到隊伍的最後
}ready_num++;
}struct pcb* ready_pop()//就緒程序出隊,將優先順序最高的程序pop出去
ready_num--;
return max_pro;}
void ready_updata()//每個時刻就緒佇列中程序優先順序的更新
}void ready_work()
printf("\n");}
void block_push(pcb* pro)//進入阻塞佇列
else//如果非空,插入排序,則按照所需要的時間長短放在阻塞佇列中,時間越短越靠前,
else//如果不是頭指標則,插入佇列中
break;//插入後退出迴圈
}if(this_pro== null)//如果在最後則修改尾指標}}
}pcb* block_pop()//取阻塞佇列的隊首
else//不止乙個值
pro->next= null;
return pro;}
void block_updata()
else if(process == block_tail)//如果在隊尾
else//如果在隊伍中間
ready_push(process);
}else
pro= pro->next;
}}void block_work()//列印阻塞佇列的資訊
printf("\n");
}void cpu_work(pcb *cpu_pro)
if(!cpu_pro->alltime)
return;
cpu_pro->priority-= 3;
cpu_pro->alltime--;
cpu_pro->cputime++;
printf("runningprog:%d\n",cpu_pro->id);
record[cpu_pro->id].id= cpu_pro->id;
record[cpu_pro->id].priority= cpu_pro->priority;
record[cpu_pro->id].cputime= cpu_pro->cputime;
record[cpu_pro->id].alltime= cpu_pro->alltime;
record[cpu_pro->id].startblock= cpu_pro->startblock;
record[cpu_pro->id].blocktime= cpu_pro->blocktime;
record[cpu_pro->id].state= cpu_pro->state;}
void init()//初始化}
void print_table()
printf("\n");
}int main()
else//如果就緒隊列為空,則調出阻塞佇列的第乙個值
cpu_num= 1;
cpu_pro->state= run;
cpu_pro->cputime= 0;//開始執行的時間為0;
}times++;
printf("\n第%d個時間片後:\n",times);
cpu_work(cpu_pro);
//如果alltime == 0,程序結束,釋放記憶體
if(!cpu_pro->alltime)
//更新阻塞和就緒佇列中的資訊
block_updata();
ready_updata();
//顯示就緒、阻塞佇列的資訊
ready_work();
block_work();
print_table();
//如果在cpu上執行時間達到了startblock並且alltime還不為0,則放到阻塞佇列中,
if(cpu_pro->cputime== cpu_pro->startblock&&cpu_pro->alltime > 0)
}printf("\n模擬程序排程演算法結束!\n");
return 0;
}
動態優先權程序排程演算法
include include define ready 1 define block 2 struct pcb pcb ready queue head null pcb block queue head null 建立了就緒佇列和阻塞佇列,均包含頭結點,以後的節點插入均採取插入排序 void i...
程序排程 高優先權優先
include stdio.h include include define getpch type type malloc sizeof type define null 0 struct pcb ready null,p ready p 為全域性變數 typedef struct pcb pcb...
優先權排程演算法
include include include include includeusing namespace std define maxn 100 int time 0 定義時間,為全域性變數,第乙個程序到達時為0 typedef structproducer 程序結構體 float rep pr...