OS 使用動態優先權的程序排程

2021-08-11 16:23:41 字數 4272 閱讀 2050

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...