国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

操作系統(tǒng)課程設計進程調(diào)度模擬

這篇具有很好參考價值的文章主要介紹了操作系統(tǒng)課程設計進程調(diào)度模擬。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

程序下載鏈接:https://download.csdn.net/download/m0_56241309/86945709

進程調(diào)度模擬

摘要:進程調(diào)度是操作系統(tǒng)中必不可少的一種調(diào)度,在3中OS中都無一例外地配置了進程調(diào)度。此外,它也是對系統(tǒng)性能影響最大的一種處理機調(diào)度,在操作系統(tǒng)中具有十分重要的地位。本次模擬,旨在全方位地了解、掌握、運用各種調(diào)度算法,包括從本質(zhì)上理解各種調(diào)度方法的實現(xiàn)方式、各種調(diào)度算法使用的數(shù)據(jù)結(jié)構(gòu)、各種調(diào)度方法使用的函數(shù)模塊、各種調(diào)度算法的函數(shù)調(diào)用情況等等。針對本次模擬,任務中包括了四種在操作系統(tǒng)中較為重要的調(diào)度方法,因此最先考慮的是如何依次實現(xiàn)各種調(diào)度方法,包括對各種算法的系統(tǒng)功能設計、模塊、流程設計、數(shù)據(jù)結(jié)構(gòu)設計等等。之后再依調(diào)整各種算法內(nèi)部的數(shù)據(jù)結(jié)構(gòu)以及符號名,消除各個算法之間的沖突,主要是命名沖突引起的函數(shù)調(diào)用沖突、變量使用沖突。在對各種算法進行調(diào)整后,將其整合到一個主體呈現(xiàn)出switch結(jié)構(gòu)的MAIN()函數(shù)中。經(jīng)過本次模擬,總體上較為完整地實現(xiàn)了對N個進程采用4個進程調(diào)度算法的目的(四選一),但在各種算法的內(nèi)部仍然存在許多值得優(yōu)化的地方,例如在MAIN()函數(shù)中涉及一個整體的數(shù)據(jù)結(jié)構(gòu)即可避免在每一個算法中都對數(shù)據(jù)結(jié)構(gòu)進行大體上重復的定義,諸如此類的可以優(yōu)化的地方依然存在,因此本次模擬并不是最終目的,后繼學習過程中對操作系統(tǒng)調(diào)度算法的更加熟練的掌握將更加有助于我們對于計算機操作系統(tǒng)的理解與掌握。

關(guān)鍵詞:操作系統(tǒng);進程調(diào)度;課程設計

1 設計任務

1.1 設計目的

在多道程序環(huán)境下,內(nèi)存中存在許多進程,其數(shù)目往往多余處理及的數(shù)量。這就要求操作系統(tǒng)能夠按照某種算法動態(tài)地將處理機分配給處于就緒狀態(tài)的進程。對于一個大型的操作系統(tǒng)而言,其運行是的性能,諸如系統(tǒng)吞吐量、資源利用率、作業(yè)周轉(zhuǎn)時間、響應的及時性等,在很大程度上都取決于處理機調(diào)度性能的好壞。如若處理機調(diào)度存在問題,則會非常容易導致系統(tǒng)出現(xiàn)死鎖,進程將無法向前推進。次模擬選題為進程調(diào)度模擬,旨在了解、認識、掌握調(diào)度算法這一處理機調(diào)度最為核心的部分,實現(xiàn)對多個進程實現(xiàn)不同的調(diào)度方法,加深對操作系統(tǒng)調(diào)度方法的掌握,進而更加深層次地認識操作系統(tǒng)。

1.2 設計內(nèi)容

1.2.1設計要求

(1)對N個進程分別采用四種進程調(diào)度算法(輪轉(zhuǎn)調(diào)度、靜態(tài)優(yōu)先級調(diào)度、動態(tài)優(yōu)先級調(diào)度、最短進程優(yōu)先調(diào)度)執(zhí)行調(diào)度模擬。

(2)每個用來標識進程的進程表項(進程控制塊 PCB)可用結(jié)構(gòu)體來描述,包括以下字段(具體字段及數(shù)量可根據(jù)需要自行定義,此處僅供參考):

(a)進程標識數(shù) ID。

(b) 進程優(yōu)先數(shù) PRIORITY,并規(guī)定優(yōu)先數(shù)越大的進程,其優(yōu)先權(quán)越高。

(c) 進程運行所需CPU總時間片數(shù)ALLTIME,已占用 CPU 時間片數(shù) CPUTIME。當進程運行完畢時,ALLTIME 變?yōu)?0。

(d) 進程的待阻塞時間片數(shù) STARTBLOCK,表示當進程再運行 STARTBLOCK個時間片后,進程將進入阻塞狀態(tài)。

(e) 進程被阻塞的時間片數(shù) BLOCKTIME ,表示已阻塞的進程再等待 BLOCKTIME 個時間片后,將轉(zhuǎn)換成就緒狀態(tài)。

(f) 進程狀態(tài) STATE。

(g) 隊列指針 NEXT,用來將 PCB 排成隊列。

(3)進程數(shù)量要求可以指定任意數(shù)量,每個進程運行所需的CPU時間數(shù)要求可以指定任意數(shù)量或隨機生成。

(4)靜態(tài)優(yōu)先級調(diào)度,每個進程的優(yōu)先級要求可以任意指定或隨機生成。

(5)動態(tài)優(yōu)先級調(diào)度原則:進程在就緒隊列中呆一個時間片,優(yōu)先數(shù)增加 1;進程每運行一個時間片,優(yōu)先數(shù)減 3(這一規(guī)則主要用于動態(tài)優(yōu)先級調(diào)度算法)。

(6)最短進程優(yōu)先中的進程長度根據(jù)剩余所需CPU時間片數(shù)動態(tài)計算。

(7)為了觀察每個進程的調(diào)度過程,程序應將每個時間片內(nèi)的進程的情況顯示出來,包括正在運行的進程,處于就緒隊列中的進程和處于阻塞隊列中的進程。

(8)要求在linux ubuntu環(huán)境下使用c/c++編寫。

1.2.2部分調(diào)整

(1)本次模擬首先對四種調(diào)度方法分別進行了實現(xiàn),因此各種調(diào)度算法內(nèi)部的PCB數(shù)據(jù)結(jié)構(gòu)存在著一定程度上的差別,但對于每種調(diào)度算法均采用了設計要求中規(guī)定的變量名程。

(2)后期對各種調(diào)度算法進行整合時,出現(xiàn)了變量命名之間的沖突,因此部分算法內(nèi)部的變量命名出現(xiàn)了諸如RR(輪轉(zhuǎn)調(diào)度)、DP(動態(tài)優(yōu)先級)、SP(靜態(tài)優(yōu)先級)、SJF(最短進程優(yōu)先)字樣的前綴。

(3)在本次模擬中,提供了四種調(diào)度方法供用戶選擇,以此實現(xiàn)對N種進程采用4種不同的調(diào)度方法。

2 總體設計

2.1 總體結(jié)構(gòu)

操作系統(tǒng)課程設計進程調(diào)度模擬

圖2-1 模擬進程調(diào)度演示系統(tǒng)功能模塊圖

2.2 開發(fā)環(huán)境

Linux操作系統(tǒng)、VMware虛擬機、開發(fā)語言c/c++、HUAWEI MATEBOOK XPRO筆記本

3 算法設計

3.1輪轉(zhuǎn)調(diào)度算法

?? 在早期的時間片輪轉(zhuǎn)法中,系統(tǒng)將所有的就緒進程按先來先服務的原則,排成一個隊列,每次調(diào)度時,把CPU分配給隊首進程,并令其執(zhí)行一個時間片。如果就緒隊列上存在N個進程,那么每個進程每次大約可獲得1/N的處理機時間。

?? 如圖2-1功能模塊圖所示,在輪轉(zhuǎn)調(diào)度方法種,需要對PCB塊進行數(shù)據(jù)結(jié)構(gòu)設計,并且完成對隊列結(jié)點定義模塊、隊列初始化模塊、進程隊列創(chuàng)建模塊、進程插入模塊、進程輸出模塊、RR算法模塊的實現(xiàn)。

??????? 具體流程如下:(虛線僅代表在程序編寫時邏輯上的先后順序,實現(xiàn)代表模塊之間存在調(diào)用關(guān)系)

操作系統(tǒng)課程設計進程調(diào)度模擬

??????? 其中,RR輪轉(zhuǎn)調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:

操作系統(tǒng)課程設計進程調(diào)度模擬

3.2靜態(tài)優(yōu)先級調(diào)度算法

??????? 優(yōu)先級調(diào)度算法中的靜態(tài)優(yōu)先級調(diào)度在一開始便根據(jù)各個進程的PRIORITY確定下來進程的順序,優(yōu)先級在整個運行期間保持不變。一般而言,確定進程優(yōu)先級大小的依據(jù)主要有進程類型、進程對資源的需求、用戶要求。靜態(tài)優(yōu)先級的調(diào)度方法簡單易行,但不夠精確,會出現(xiàn)進程長時間無法被調(diào)度的現(xiàn)象。

?? 如圖2-1功能模塊圖所示,在靜態(tài)優(yōu)先級調(diào)度算法種,除了對PCB數(shù)據(jù)塊進行設計,還需要完成對進程隊列創(chuàng)建模塊、SP算法等模塊的實現(xiàn)。

??????? 具體流程如下:

操作系統(tǒng)課程設計進程調(diào)度模擬

??????? 其中,SP靜態(tài)優(yōu)先級調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:

操作系統(tǒng)課程設計進程調(diào)度模擬

3.3動態(tài)優(yōu)先級調(diào)度算法

????? 動態(tài)優(yōu)先級調(diào)度算法是指在進程創(chuàng)建之初,賦予進程一個暫時的優(yōu)先級別,隨著進程的推進,進程的優(yōu)先級別會隨之改變,本次模擬中采用的規(guī)則為: 進程在就緒隊列中呆一個時間片,優(yōu)先數(shù)增加 1;進程每運行一個時間片,優(yōu)先數(shù)減 3。這樣的調(diào)度方法可以較為公平地實現(xiàn)進程間處理機的分配,避免了一個長期進程長期壟斷處理機的現(xiàn)象。

?? 如圖2-1功能模塊圖所示,在動態(tài)優(yōu)先級調(diào)度算法中,需對PCB數(shù)據(jù)塊進行設計,此外還需完成對進程隊列創(chuàng)建模塊、DP算法等模塊的實現(xiàn)。

??????? 具體流程如下:

???????操作系統(tǒng)課程設計進程調(diào)度模擬

其中,DP動態(tài)優(yōu)先級調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:

操作系統(tǒng)課程設計進程調(diào)度模擬

3.4最短進程優(yōu)先調(diào)度算法

????? 最短進程優(yōu)先調(diào)度方法以進程的長短來計算優(yōu)先級,本次模擬中采用進程所需的CPU時間片數(shù)來作為優(yōu)先級的判定依據(jù),即每個進程的剩余ALLTIME時間數(shù)。最短進程優(yōu)先調(diào)度每次從隊列中取出時間最短的進程運行。最短進程優(yōu)先調(diào)度算法的缺點在于,必須預先知道進程運行所需時間、對ALLTIME較長的進程并不友好、當采用FCFS調(diào)度方法時,無法實現(xiàn)人機交互。此外,最短進程優(yōu)先調(diào)度方法無法考慮到進程的緊急程度,因此無法保證緊急的作業(yè)得到及時處理。

??? 如圖2-1功能模塊圖所示,最短進程優(yōu)先調(diào)度算法中,除對PCB數(shù)據(jù)塊進行設計以外,還需實現(xiàn)進程隊列創(chuàng)建模塊、調(diào)度結(jié)果輸出模塊、SJF算法等模塊。

??????? 具體流程如下:

依舊使用數(shù)組的形式來存放進程,便于實現(xiàn)依據(jù)次序標號對進程的直接查找以及調(diào)度

操作系統(tǒng)課程設計進程調(diào)度模擬

??????? 其中,SJF最短進程優(yōu)先調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:

操作系統(tǒng)課程設計進程調(diào)度模擬

4 系統(tǒng)實現(xiàn)

4.1 用戶輸入模塊實現(xiàn)(部分主函數(shù)的實現(xiàn))

#include"SJF.h"

#include"SP.h"

#include"RR.h"

#include"DP.h"



int main()

{ ?

? ? printf("【本次模擬除進程名以外的所有輸入均為整數(shù)】\n\n\n");

? ? int B;

? ? printf("請選擇PRIORITY、ALLTIME的生成方式:\n【1】手動輸入\n【2】隨機生成\n");

? ? scanf("%d",&B);

? ? int A;

? ? printf("\n");

? ? printf("請選擇調(diào)度方法(輸入對應序號即可)\n");

? ? Q:printf("【1】輪轉(zhuǎn)調(diào)度\n【2】最短進程優(yōu)先調(diào)度\n【3】靜態(tài)優(yōu)先級調(diào)度\n【4】動態(tài)優(yōu)先級調(diào)度\n");

? ? scanf("%d",&A);

? ? if (A>4)

? ? {

? ? ? ? printf("輸入有誤,請重新輸入\n");

? ? ? ? goto Q;

}

}

4.2 輪轉(zhuǎn)調(diào)度模塊實現(xiàn)

4.2.1 PCB數(shù)據(jù)結(jié)構(gòu)設計

typedef struct pcb ? ? ? ? ?//定義進程控制塊

{

? ? char ID[MaxNum]; ? ? ? ?//進程號

? ? int Arrive_Time; ? ? ? ?//進程到達時間,用以排序

? ? int ALLTIME; ? ? ? ? ? ?//進程運行所需總時間

? ? int WHLOLETIME; ? ? ? ? //固定運行時間

? ? int FinishTime; ? ? ? ? //完成時間

? ? double RUN_AROUND_TIME; //周轉(zhuǎn)時間

? ? double WeightWholeTime; //帶權(quán)周轉(zhuǎn)時間

? ? char STATE; ? ? ? ? ? ? //進程狀態(tài)

? ? struct pcb *NEXT;

}RRPCB;

4.2.2隊列結(jié)點定義模塊

typedef struct ? //定義隊列以及頭結(jié)點尾結(jié)點

{

? ? RRPCB *front,*rear;

}queue;

4.2.3隊列初始化模塊

queue *Init() ?//初始化隊列

{

? ? queue *HEAD;

? ? HEAD=(queue*)malloc(sizeof(queue));

? ? HEAD->front=NULL;

? ? HEAD->rear=NULL;

? ? return HEAD;

}

4.2.4進程隊列創(chuàng)建模塊

queue *CreatQueue(queue *head,int M,int B) ? //創(chuàng)建進程隊列

{

? ? char c[MaxNum];

? ? char s='R';

? ? int a,r,i;

? ? if (B==1)

? ? {

? ? ? ? for(i=1;i<=M;i++)

? ? ? ? {

? ? ? ? printf("請輸入第%d個進程的進程名:\n",i);

? ? ? ? getchar();

? ? ? ? cin.get(c,MaxNum);

? ? ? ? printf("請輸入第%d個進程的到達時間:\n",i);

? ? ? ? scanf("%d",&a);

? ? ? ? printf("請輸入第%d個進程的服務時間:\n",i);

? ? ? ? scanf("%d",&r);

? ? ? ? head=Insert(head,c,a,r,s);

? ? ? ? printf("\n");

? ? ? ? }

? ? }

? ? else

? ? {

? ? ? ? for(i=1;i<=M;i++)

? ? ? ? {

? ? ? ? printf("請輸入第%d個進程的進程名:\n",i);

? ? ? ? getchar();

? ? ? ? cin.get(c,MaxNum);

? ? ? ? printf("請輸入第%d個進程的到達時間:\n",i);

? ? ? ? scanf("%d",&a);

? ? ? ? r=(int)(rand()%12);//r即進程所需總時長

? ? ? ? head=Insert(head,c,a,r,s);

? ? ? ? printf("\n");

? ? ? ? }

? ? }

? ? return head;

}

4.2.5進程插入模塊

queue *Insert(queue *head,char c[MaxNum],int a,int r,char s) ?//將進程插入隊列,每次取出隊首的進程運行

{

? ? RRPCB *p;

? ? p=(RRPCB *)malloc(sizeof(RRPCB));

? ? strcpy(p->ID,c);

? ? p->Arrive_Time=a;

? ? p->ALLTIME=r;

? ? p->WHLOLETIME=r;

? ? p->STATE=s;

? ? p->NEXT=NULL;

? ? if(Empty(head))

? ? ? ? head->front=head->rear=p;

? ? else

? ? {

? ? ? ? head->rear->NEXT=p;

? ? ? ? head->rear=p;

? ? }

? ? return head;

}

4.2.6進程輸出模塊

void print(queue *head) ?//輸出進程

{

? ? RRPCB *p;

? ? p=head->front;

? ? if(!p)

? ? ? ? printf("時間片輪轉(zhuǎn)調(diào)度隊列為空!\n");

? ? while(p)

? ? {

? ? ? ? printf("ID=%s ? Arrvie_Time=%d ? ALLTIME=%d ? STATE=%c",p->ID,p->Arrive_Time,p->ALLTIME,p->STATE);

? ? ? ? printf("\n");

? ? ? ? p=p->NEXT;

? ? }

}

4.2.7RR(輪轉(zhuǎn)調(diào)度)算法模塊

void RR(queue *head,int Time_Slice)

{

? ? int t=head->front->Arrive_Time, lt=head->rear->Arrive_Time;

? ? if(head->front->ALLTIME<Time_Slice)

? ? ? ? t=t+head->front->ALLTIME;

? ? else

? ? ? ? t=t+Time_Slice;

? ? //隊列為空則無法調(diào)度

? ? while(!Empty(head))

? ? {

? ? ? ? RRPCB *p1,*p2;

? ? ? ? printf("\n時刻 ? 進程 ? 狀態(tài)\n");

? ? ? ? //當前運行的時間小于最后一個進程到達時間

? ? ? ? while(t<lt)

? ? ? ? {

? ? ? ? ? ? p1=head->front;

? ? ? ? ? ? printf("%2d ? ? ?%s",t,p1->ID);

? ? ? ? ? ? p1->ALLTIME=p1->ALLTIME-Time_Slice;//判斷在進程所需要的ALLTIME內(nèi)是否可以完成,用ALLTIME-CPUTIME判斷

? ? ? ? ? ? //1.運行時間小于0,刪除隊首進程

? ? ? ? ? ? if(p1->ALLTIME<=0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? p1->STATE='C';

? ? ? ? ? ? ? ? printf(" ? ? ? %c\n",p1->STATE);

? ? ? ? ? ? ? ? p1->FinishTime=t;

? ? ? ? ? ? ? ? p1->RUN_AROUND_TIME=p1->FinishTime-p1->Arrive_Time;

? ? ? ? ? ? ? ? p1->WeightWholeTime=p1->RUN_AROUND_TIME/p1->WHLOLETIME;

? ? ? ? ? ? ? ? SumWT+=p1->RUN_AROUND_TIME;

? ? ? ? ? ? ? ? SumWWT+=p1->WeightWholeTime;

? ? ? ? ? ? ? ? printf("=========================================================\n");

? ? ? ? ? ? ? ? printf("時刻%2d進程%s運行結(jié)束,進程%s周轉(zhuǎn)時間=%5.2f,帶權(quán)周轉(zhuǎn)時間=%5.2f\n",t,p1->ID,p1->ID,p1->RUN_AROUND_TIME,p1->WeightWholeTime);

? ? ? ? ? ? ? ? printf("=========================================================\n");

? ? ? ? ? ? ? ? head->front=p1->NEXT;

? ? ? ? ? ? ? ? free(p1);

? ? ? ? ? ? }

? ? ? ? ? ? //2.運行時間大于0,繼續(xù)排隊

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? printf(" ? ? ? ?%c\n",p1->STATE);

? ? ? ? ? ? ? ? p2=p1->NEXT;

? ? ? ? ? ? ? ? while(p2->NEXT && p2->Arrive_Time != t)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? p2=p2->NEXT;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //沒有新的進程到達時

? ? ? ? ? ? ? ? //1.保持隊首進程

? ? ? ? ? ? ? ? //2.隊首進程后移

? ? ? ? ? ? ? ? if(p2->Arrive_Time != t)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? RRPCB *p3=p1,*p4=NULL;

? ? ? ? ? ? ? ? ? ? while(p3->NEXT && p3->Arrive_Time<t)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? p4=p3;

? ? ? ? ? ? ? ? ? ? ? ? p3=p3->NEXT;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if(p3->Arrive_Time>t)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? if(p4!=p1) ? //p1插在p4后,頭節(jié)點p1->NEXT

? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? head->front=p1->NEXT;

? ? ? ? ? ? ? ? ? ? ? ? ? ? p1->NEXT=p4->NEXT;

? ? ? ? ? ? ? ? ? ? ? ? ? ? p4->NEXT=p1;

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? ? ? p4=p3=p2=NULL;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? p4=p3=p2=NULL;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //新的進程到達

? ? ? ? ? ? ? ? //隊首進程插入在新進程之后,指針更新

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? head->front=p1->NEXT;

? ? ? ? ? ? ? ? ? ? p1->NEXT=p2->NEXT;

? ? ? ? ? ? ? ? ? ? p2->NEXT=p1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? //更新時間

? ? ? ? ? ? if(head->front->ALLTIME<Time_Slice)

? ? ? ? ? ? ? ? t=t+head->front->ALLTIME;

? ? ? ? ? ? else

? ? ? ? ? ? ? ? t=t+Time_Slice;

? ? ? ? }

? ? ? ?



? ? ? ? //ALLTIME大于最后一個進程到達的時間

? ? ? ? while(t>=lt)

? ? ? ? {

? ? ? ? ? ? p1=head->front;

? ? ? ? ? ? printf("%2d ? ? ?%s",t,p1->ID);

? ? ? ? ? ? p1->ALLTIME=p1->ALLTIME-Time_Slice;

? ? ? ? ? ? //1.運行時間小于0,刪除隊首進程

? ? ? ? ? ? if(p1->ALLTIME<=0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? p1->STATE='C';

? ? ? ? ? ? ? ? printf(" ? ? ? %c\n",p1->STATE);

? ? ? ? ? ? ? ? p1->FinishTime=t;

? ? ? ? ? ? ? ? p1->RUN_AROUND_TIME=p1->FinishTime-p1->Arrive_Time;

? ? ? ? ? ? ? ? p1->WeightWholeTime=p1->RUN_AROUND_TIME/p1->WHLOLETIME;

? ? ? ? ? ? ? ? SumWT+=p1->RUN_AROUND_TIME;

? ? ? ? ? ? ? ? SumWWT+=p1->WeightWholeTime;

? ? ? ? ? ? ? ? printf("=========================================================\n");

? ? ? ? ? ? ? ? printf("時刻%2d進程%s運行結(jié)束,進程%s周轉(zhuǎn)時間=%5.2f,帶權(quán)周轉(zhuǎn)時間=%5.2f\n",t,p1->ID,p1->ID,p1->RUN_AROUND_TIME,p1->WeightWholeTime);

? ? ? ? ? ? ? ? printf("=========================================================\n");

? ? ? ? ? ? ? ? //printf("時刻%2d進程%s運行結(jié)束",t,p1->pname);

? ? ? ? ? ? ? ? head->front=p1->NEXT;

? ? ? ? ? ? ? ? free(p1);

? ? ? ? ? ? ? ?

? ? ? ? ? ? }

? ? ? ? ? ? //2.運行時間大于0,進程插入隊列末

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? printf(" ? ? ? %c\n",p1->STATE);

? ? ? ? ? ? ? ? //隊列中只有一個進程無需更改

? ? ? ? ? ? ? ? if(!p1->NEXT)

? ? ? ? ? ? ? ? ? ? head->front=p1;

? ? ? ? ? ? ? ? ?//隊列中的進程數(shù)大于1時

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? head->front=p1->NEXT;

? ? ? ? ? ? ? ? ? ? head->rear->NEXT=p1;

? ? ? ? ? ? ? ? ? ? head->rear=p1;

? ? ? ? ? ? ? ? ? ? p1->NEXT=NULL;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? //更新時間

? ? ? ? ? ? if(Empty(head))

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? if(head->front->ALLTIME<Time_Slice)

? ? ? ? ? ? ? ? ? ? t=t+head->front->ALLTIME;

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? t=t+Time_Slice;

? ? ? ? ? ? }

? ? ? ? }



? ? ? ? }

? ? }

4.3 靜態(tài)優(yōu)先級調(diào)度模塊實現(xiàn)

4.3.1PCB數(shù)據(jù)結(jié)構(gòu)設計模塊

struct PCB

{

? ? char PNAME[20];

? ? int PRIORITY;

? ? int ALLTIME;

? ? int CPUTIME;

? ? char STATE;

? ? struct PCB* NEXT;

? ? int num;

};

4.3.2進程隊列創(chuàng)建模塊

struct PCB *processes, *Temp_Node;

? ? //Temp_Node作為臨時節(jié)點來創(chuàng)建鏈表

? ? processes = Temp_Node = (struct PCB*)malloc(sizeof(struct PCB));

? ? if (B==1)

? ? {

? ? ? ?for (int i = 1; i <= N; ++i)

? ? ? ? {

? ? ? ? struct PCB *p = (struct PCB*)malloc(sizeof(struct PCB));

? ? ? ? printf("進程號No.%d:\n", i);

? ? ? ? printf("輸入進程名:");

? ? ? ? scanf("%s", p->PNAME);

? ? ? ? printf("輸入進程優(yōu)先數(shù):");

? ? ? ? scanf("%d", &p->PRIORITY);

? ? ? ? printf("輸入進程所需總時間:");

? ? ? ? scanf("%d", &p->ALLTIME);

? ? ? ? p->CPUTIME = 0;

? ? ? ? p->STATE = 'W';

? ? ? ? p->NEXT = NULL;

? ? ? ? Temp_Node->NEXT = p;

? ? ? ? Temp_Node = p;

? ? ? ? p->num=p->ALLTIME;

? ? ? ? printf("\n\n");

? ? ? ? }

? ? }

? ? else

? ? {

? ? ? ? for (int i = 1; i <= N; ++i)

? ? ? ? {

? ? ? ? struct PCB *p = (struct PCB*)malloc(sizeof(struct PCB));

? ? ? ? printf("進程號No.%d:\n", i);

? ? ? ? printf("輸入進程名:");

? ? ? ? scanf("%s", p->PNAME);

? ? ? ? p->PRIORITY=(int)(rand()%12);

? ? ? ? p->ALLTIME=(int)(rand()%12);

? ? ? ? p->num=p->ALLTIME;

? ? ? ? p->CPUTIME = 0;

? ? ? ? p->STATE = 'W';

? ? ? ? p->NEXT = NULL;

? ? ? ? Temp_Node->NEXT = p;

? ? ? ? Temp_Node = p;

? ? ? ? printf("\n\n");

? ? ? ? }

? ? }

4.3.3SP(靜態(tài)優(yōu)先級調(diào)度)算法模塊

//processes作為頭結(jié)點來存儲鏈表

? ? processes = processes->NEXT;

? ? int Present_Time = 0;

? ? struct PCB *P_INORDER = processes;

? ? while (1)

? ? { ?

? ? ? ? ++Present_Time;

? ? ? ? Temp_Node = processes;

? ? ? ? //對鏈表按照優(yōu)先數(shù)排序

? ? ? ? //P_INORDER用來存放排序后的鏈表

? ? ? ? P_INORDER = SortList(P_INORDER);

? ? ? ? printf("===============================================\n");

? ? ? ? printf("當前時刻為: %d\n", Present_Time-1);

? ? ? ? printf("===============================================\n");

? ? ? ? printf("當前正在運行的進程是:%s\n", P_INORDER->PNAME);

? ? ? ? P_INORDER->STATE = 'R';

? ? ? ? P_INORDER->num--;

? ? ? ? P_INORDER->CPUTIME++;

? ? ? ? printf("PNAME ? ?STATE ? ?PRIORITY ? ?ALLTIME ? ?CPUTIME\n");

? ? ? ? printf(" ?%s ? ? ? ?%c ? ? ? ? ?%d ? ? ? ? ?%d ? ? ? ? ?%d\n", P_INORDER->PNAME, P_INORDER->STATE, P_INORDER->PRIORITY, P_INORDER->num, P_INORDER->CPUTIME);

? ? ? ? Temp_Node->STATE = 'W';

? ? ? ?

? ? ? ? printf("當前就緒狀態(tài)的隊列為:\n\n");

? ? ? ? //Temp_Node指向已經(jīng)排序的隊列

? ? ? ? Temp_Node = P_INORDER->NEXT;

? ? ? ? while (Temp_Node != NULL)

? ? ? ? { ?

? ? ? ? ? ? printf("PNAME ? ?STATE ? ?PRIORITY ? ?ALLTIME ? ?CPUTIME\n");

? ? ? ? ? ? printf(" ?%s ? ? ? ?%c ? ? ? ? ?%d ? ? ? ? ?%d ? ? ? ? ?%d\n", Temp_Node->PNAME, Temp_Node->STATE, Temp_Node->PRIORITY, Temp_Node->ALLTIME, Temp_Node->CPUTIME);

? ? ? ? ? ? Temp_Node = Temp_Node->NEXT;

? ? ? ? }

? ? ? ? //Temp_Node指向已經(jīng)排序的鏈表

? ? ? ? Temp_Node = P_INORDER;

? ? ? ? struct PCB *PRE_TEMPNODE;

? ? ? ? PRE_TEMPNODE = NULL; //PRE_TEMPNODE指向Temp_Node的前一個節(jié)點

? ? ? ? while (Temp_Node != NULL)

? ? ? ? {

? ? ? ? ? ? if (Temp_Node->ALLTIME == Temp_Node->CPUTIME)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? if (PRE_TEMPNODE == NULL)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? Temp_Node = P_INORDER->NEXT;

? ? ? ? ? ? ? ? ? ? P_INORDER = Temp_Node;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? PRE_TEMPNODE->NEXT = Temp_Node->NEXT;

? ? ? ? ? ? }

? ? ? ? ? ? PRE_TEMPNODE = Temp_Node;

? ? ? ? ? ? Temp_Node = Temp_Node->NEXT;

? ? ? ? }

? ? ? ?

? ? }

}



struct PCB* SortList(PCB* HL)

{

? ? struct PCB* SL;

? ? SL = (struct PCB*)malloc(sizeof(struct PCB));

? ? SL = NULL;



? ? struct PCB* r = HL;

? ? while (r != NULL)

? ? {

? ? ? ? struct PCB* t = r->NEXT;

? ? ? ? struct PCB* cp = SL;

? ? ? ? struct PCB* PRE_TEMPNODE = NULL;

? ? ? ? while (cp != NULL)

? ? ? ? {

? ? ? ? ? ? if (r->PRIORITY > cp->PRIORITY)

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? PRE_TEMPNODE = cp;

? ? ? ? ? ? ? ? cp = cp->NEXT;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if (PRE_TEMPNODE == NULL)

? ? ? ? {

? ? ? ? ? ? r->NEXT = SL;

? ? ? ? ? ? SL = r;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? r->NEXT = cp;

? ? ? ? ? ? PRE_TEMPNODE->NEXT = r;

? ? ? ? }

? ? ? ? r = t;

? ? }

? ? return SL;

4.4 動態(tài)優(yōu)先級調(diào)度模塊實現(xiàn)

4.4.1PCB數(shù)據(jù)結(jié)構(gòu)設計模塊

typedef struct{

? ? char ID;

? ? int PRIORITY;

? ? int CPUTIME;

? ? int ALLTIME;

? ? int STARTBLOCK;

? ? int BLOCKTIME;

? ? int STATE;//0-運行 1-阻塞 2-就緒 3-結(jié)束 4-未到達

? ? int Arrive_Time;

? ? int TIME;

}PROCESS;

4.4.2進程隊列創(chuàng)建模塊

IntDI=0,DPTime_Slice,max,l,l1,time1,flag=0,total=0,server[10],sum=0,DPN=0;

? ? ? ? PROCESS pro[10];

? ? ? ? cout<<"本程序中狀態(tài)代表如下"<<endl<<"【0】-運行 ?【1】-阻塞 ?【2】-就緒 ?【3】-結(jié)束 ?【4】-未到達"<<endl<<endl;

? ? ? ? if (B==1)

? ? ? ? {

? ? ? ? ? ? cout<<"請輸入進程數(shù):";

? ? ? ? ? ? cin>>DPN;

? ? ? ? ? ? cout<<"請設置時間片長度:";

? ? ? ? ? ? cin>>DPTime_Slice;

? ? ? ? ? ? cout<<"請輸入各進程初始狀態(tài):"<<endl;

? ? ? ? ? ? cout<<"ID ?PRIORITY ?Arrive_Time ?ALLTIME ?STARTBLOCK ?BLOCKTIME"<<endl;

? ? ? ? ? ? for(DI=0;DI<DPN;DI++)

? ? ? ? ? ? {//進程初始化

? ? ? ? ? ? pro[DI].CPUTIME=0;

? ? ? ? ? ? pro[DI].TIME=0;

? ? ? ? ? ? cin>>pro[DI].ID>>pro[DI].PRIORITY>>pro[DI].Arrive_Time;

? ? ? ? ? ? cin>>pro[DI].ALLTIME>>pro[DI].STARTBLOCK>>pro[DI].BLOCKTIME;

? ? ? ? ? ? server[DI]=pro[DI].ALLTIME;

? ? ? ? ? ? if(pro[DI].Arrive_Time==0) pro[DI].STATE=0;

? ? ? ? ? ? else pro[DI].STATE=4;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? cout<<"請輸入進程數(shù):";

? ? ? ? ? ? cin>>DPN;

? ? ? ? ? ? cout<<"請設置時間片長度:";

? ? ? ? ? ? cin>>DPTime_Slice;

? ? ? ? ? ? cout<<"請輸入各進程初始狀態(tài):"<<endl;

? ? ? ? ? ? cout<<"ID ? Arrive_Time ? STARTBLOCK ?BLOCKTIME"<<endl;

? ? ? ? ? ? for (int DI = 0; DI < DPN; DI++)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? pro[DI].CPUTIME=0;

? ? ? ? ? ? ? ? pro[DI].TIME=0;

? ? ? ? ? ? ? ? cin>>pro[DI].ID>>pro[DI].Arrive_Time;

? ? ? ? ? ? ? ? cin>>pro[DI].STARTBLOCK>>pro[DI].BLOCKTIME;

? ? ? ? ? ? ? ? pro[DI].PRIORITY=(int)(rand()%10);

? ? ? ? ? ? ? ? pro[DI].ALLTIME=(int)(rand()%10);

? ? ? ? ? ? ? ? server[DI]=pro[DI].ALLTIME;

? ? ? ? ? ? ? ? if(pro[DI].Arrive_Time==0) pro[DI].STATE=0;

? ? ? ? ? ? ? ? else pro[DI].STATE=4;

? ? ? ? ? ? }

? ? ? ? }

4.4.3DP(動態(tài)優(yōu)先級調(diào)度)算法模塊

do{

? ? ? ? cout<<endl<<"當前時刻為:"<<total;

? ? ? ? cout<<endl<<"========================各進程狀態(tài)為======================"<<endl;

? ? ? ? cout<<"ID ?PRIORITY ?CPUTIME ?ALLTIME ?STARTBLOCK ?BLOCKTIME ?STATE"<<endl;

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? ? ? cout<<pro[DI].ID<<" ? ? ?"<<pro[DI].PRIORITY<<" ? ? ? ?"<<pro[DI].CPUTIME<<" ? ? ? ?";

? ? ? ? ? ? cout<<pro[DI].ALLTIME<<" ? ? ? ? "<<pro[DI].STARTBLOCK<<" ? ? ? ? ? "<<pro[DI].BLOCKTIME<<" ? ? ? ? "<<pro[DI].STATE;

? ? ? ? ? ? cout<<endl;

? ? ? ? }

? ? ? ?

? ? ? ? total+=DPTime_Slice;

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? ? ? if(pro[DI].STATE==4&&pro[DI].Arrive_Time<total){

? ? ? ? ? ? ? ? pro[DI].STATE=1;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? ? ? time1=pro[DI].ALLTIME;

? ? ? ? ? ? if(pro[DI].STATE==0){

? ? ? ? ? ? ? ? if(pro[DI].ALLTIME<=DPTime_Slice){

? ? ? ? ? ? ? ? ? ? pro[DI].ALLTIME=0;

? ? ? ? ? ? ? ? ? ? pro[DI].STATE=3;

? ? ? ? ? ? ? ? ? ? pro[DI].TIME=total-DPTime_Slice+time1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else{

? ? ? ? ? ? ? ? ? ? pro[DI].ALLTIME-=DPTime_Slice;

? ? ? ? ? ? ? ? ? ? pro[DI].STARTBLOCK--;

? ? ? ? ? ? ? ? ? ? if(pro[DI].STARTBLOCK==0){

? ? ? ? ? ? ? ? ? ? ? ? pro[DI].STATE=1;

? ? ? ? ? ? ? ? ? ? ? ? pro[DI].BLOCKTIME=time1;

? ? ? ? ? ? ? ? ? ? ? ? pro[DI].STARTBLOCK=time1;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? pro[DI].PRIORITY-=3;

? ? ? ? ? ? ? ? ? ? pro[DI].TIME=total;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? if(pro[DI].STATE==1){

? ? ? ? ? ? ? ? pro[DI].BLOCKTIME--;

? ? ? ? ? ? ? ? if(pro[DI].BLOCKTIME==0) pro[DI].STATE=2;

? ? ? ? ? ? ? ? pro[DI].TIME=total;

? ? ? ? ? ? }

? ? ? ? ? ? if(pro[DI].STATE==2){

? ? ? ? ? ? ? ? pro[DI].PRIORITY++;

? ? ? ? ? ? ? ? pro[DI].TIME=total;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? max=-100;

? ? ? ? l1=-1;

? ? ? ? l=-1;

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? ? ? if(pro[DI].PRIORITY>max&&(pro[DI].STATE==0||pro[DI].STATE==2)){

? ? ? ? ? ? ? ? l=DI;

? ? ? ? ? ? ? ? max=pro[DI].PRIORITY;

? ? ? ? ? ? }

? ? ? ? ? ? if(pro[DI].STATE==0) l1=DI;

? ? ? ? }

? ? ? ? if(l!=-1&&l!=l1) pro[l].STATE=0;

? ? ? ? if(l1!=-1) pro[l1].STATE=2;

? ? ? ? flag=0;

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? ? ? if(pro[DI].STATE!=3){

? ? ? ? ? ? ? ? flag=1;

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if(flag==0) break;

? ? ? ? }while(1);

? ? ? ? cout<<endl<<"當前時刻:"<<total;

? ? ? ? cout<<endl<<"========================各進程狀態(tài)為======================"<<endl;

? ? ? ? cout<<"ID ?PRIORITY ?CPUTIME ?ALLTIME ?STARTBLOCK ?BLOCKTIME ?STATE"<<endl;

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? cout<<pro[DI].ID<<" ? ? ?"<<pro[DI].PRIORITY<<" ? ? ? ?"<<pro[DI].CPUTIME<<" ? ? ? ?";

? ? ? ? cout<<pro[DI].ALLTIME<<" ? ? ? ? "<<pro[DI].STARTBLOCK<<" ? ? ? ? ? "<<pro[DI].BLOCKTIME<<" ? ? ? ? "<<pro[DI].STATE;

? ? ? ? cout<<endl;

? ? ? ? }

? ? ? ? cout<<endl<<"各進程運行結(jié)束!"<<endl;

? ? ? ? cout<<"進程號 ?到達時間 ?結(jié)束時間 ?周轉(zhuǎn)時間 ?帶權(quán)周轉(zhuǎn)時間"<<endl;

? ? ? ? for(DI=0;DI<DPN;DI++){

? ? ? ? cout<<" ?"<<pro[DI].ID<<" ? ? ? ?"<<pro[DI].Arrive_Time<<" ? ? ? ? "<<pro[DI].TIME<<" ? ? ? "<<pro[DI].TIME-pro[DI].Arrive_Time<<" ? ? ? ?"<<(float)(pro[DI].TIME-pro[DI].Arrive_Time)/server[DI]<<endl;

? ? ? ? sum+=pro[DI].TIME-pro[DI].Arrive_Time;

? ? ? ? }

? ? ? ? cout<<"平均周轉(zhuǎn)時間為:"<<(float)sum/DPN<<endl;

4.5 最短進程優(yōu)先調(diào)度模塊實現(xiàn)

4.5.1PCB數(shù)據(jù)結(jié)構(gòu)設計模塊

?struct Process_struct{

? ? int ?Number; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//進程編號

? ? char Name[MaxNum]; ? ? ? ? ? ? ? ? ? ? ?//進程名稱

? ? int ?ArrivalTime; ? ? ? ? ? ? ? ? ? ? ? //到達時間

? ? int ?ServiceTime; ? ? ? ? ? ? ? ? ? ? ? //開始運行時間

? ? int ?FinishTime; ? ? ? ? ? ? ? ? ? ? ? ?//運行結(jié)束時間

? ? int ?SJF_ALLTIME; ? ? ? ? ? ? ? ? ? ? ? //運行時間

? ? int STATE; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//調(diào)度標志

? ? int order; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//運行次序

? ? double ?WeightWholeTime; ? ? ? ? ? ? ? ?//周轉(zhuǎn)時間

? ? double AverageWT_SJF; ? ? ? ? ? ? ? ? ? //平均周轉(zhuǎn)時間

? ? double AverageWWT_SJF; ? ? ? ? ? ? ? ? ?//平均帶權(quán)周轉(zhuǎn)時間

}Process[MaxNum];

4.5.2進程隊列創(chuàng)建模塊

int PROCESSinput(int B) ? ? ? ? //進程參數(shù)輸入

{

? ? int i;

? ? printf("請輸入進程個數(shù):\n");

? ? scanf("%d",&SJFPN);

? ? if (B==1)

? ? {

? ? ? ? for(i=0;i<SJFPN;i++)

? ? ? ? {

? ? ? ? printf("請輸入第%d個進程名稱:",i+1);

? ? ? ? scanf("%s",Process[i].Name);

? ? ? ? printf("請輸入第%d個進程的到達時間:",i+1);

? ? ? ? scanf("%d",&Process[i].ArrivalTime);

? ? ? ? printf("請輸入第%d個進程的ALLTIME:",i+1);

? ? ? ? scanf("%d",&Process[i].SJF_ALLTIME);

? ? ? ? Process[i].ServiceTime=0;

? ? ? ? Process[i].FinishTime=0;

? ? ? ? Process[i].WeightWholeTime=0;

? ? ? ? Process[i].order=0;

? ? ? ? Process[i].STATE=0;

? ? ? ? printf("\n");

? ? ? ? }

? ? }

? ? else

? ? {

? ? ? ? for(i=0;i<SJFPN;i++)

? ? ? ? {

? ? ? ? printf("請輸入第%d個進程名稱:",i+1);

? ? ? ? scanf("%s",Process[i].Name);

? ? ? ? printf("請輸入第%d個進程的到達時間:",i+1);

? ? ? ? scanf("%d",&Process[i].ArrivalTime);

? ? ? ? Process[i].SJF_ALLTIME=(int)(rand()%11);

? ? ? ? Process[i].ServiceTime=0;

? ? ? ? Process[i].FinishTime=0;

? ? ? ? Process[i].WeightWholeTime=0;

? ? ? ? Process[i].order=0;

? ? ? ? Process[i].STATE=0;

? ? ? ? printf("\n");

? ? ? ? }

? ? }

? ? return 0;

}

4.5.3調(diào)度結(jié)果輸出模塊

int OUTCOME() ? //調(diào)度結(jié)果輸出

{

? ? int i;

? ? float turn_round_time=0,f1,w=0;

? ? printf(" ? ? ?進程名稱 到達時間 運行時間 開始時間 結(jié)束時間 執(zhí)行順序 ?周轉(zhuǎn)時間 ?帶權(quán)周轉(zhuǎn)時間\n");

? ? for(i=0;i<SJFPN;i++)

? ? {

? ? ? ? Process[i].WeightWholeTime=Process[i].FinishTime-Process[i].ArrivalTime;

? ? ? ? f1=Process[i].WeightWholeTime/Process[i].SJF_ALLTIME;

? ? ? ? turn_round_time+=Process[i].WeightWholeTime;

? ? ? ? w+=f1;

? ? ? ? printf("時刻%d :",Process[i].ServiceTime,Process[i].Name);

? ? ? ? printf(" ? %s ? ? ? %d ? ? ? %d ? ? ? ? %d ? ? ? ? %d ? ? ? ? %d ? ? ? ?%.2f ? ? ? ?%.2f\n",Process[i].Name,Process[i].ArrivalTime,Process[i].SJF_ALLTIME,Process[i].ServiceTime,Process[i].FinishTime,Process[i].order,Process[i].WeightWholeTime,f1);

? ? }

? ? printf("平均周轉(zhuǎn)時間=%.2f\n",turn_round_time/SJFPN);

? ? printf("帶權(quán)平均周轉(zhuǎn)時間=%.2f\n",w/SJFPN);

? ? return 0;

}

4.5.4 SJF(最短進程優(yōu)先調(diào)度)算法模塊

int SJF(){ ? ? ? ? ? ? ?//短作業(yè)優(yōu)先算法

? ? int temp_time=0; ? ?//當期那時間

? ? int i=0,j;

? ? int PID_ORDERED,PRESENT_PNUMBER; ? ? ?//進程編號,當前已執(zhí)行進程個數(shù)

? ? float run_time;

? ? run_time=Process[i].SJF_ALLTIME;

? ? j=1;

? ? while((j<SJFPN)&&(Process[i].ArrivalTime==Process[j].ArrivalTime)) ? ?//判斷是否有兩個進程同時到達

? ? {

? ? ? ? if(Process[j].SJF_ALLTIME<Process[i].SJF_ALLTIME)

? ? ? ? {

? ? ? ? ? ? run_time=Process[i].SJF_ALLTIME;

? ? ? ? ? ? i=j;

? ? ? ? }

? ? ? ? j++;

? ? }

? ? //查找下一個被調(diào)度的進程

? ? //對找到的下一個被調(diào)度的進程求相應的參數(shù)

? ? PID_ORDERED=i;

? ? Process[PID_ORDERED].ServiceTime=Process[PID_ORDERED].ArrivalTime;

? ? Process[PID_ORDERED].FinishTime=Process[PID_ORDERED].ServiceTime+Process[PID_ORDERED].SJF_ALLTIME;

? ? Process[PID_ORDERED].STATE=1;

? ? temp_time=Process[PID_ORDERED].FinishTime;

? ? Process[PID_ORDERED].order=1;

? ? PRESENT_PNUMBER=1;

? ? while(PRESENT_PNUMBER<SJFPN)

? ? {

? ? ? ? for(j=0;j<SJFPN;j++)

? ? ? ? {

? ? ? ? ? ? if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].STATE))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? run_time=Process[j].SJF_ALLTIME;

? ? ? ? ? ? ? ? PID_ORDERED=j;

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? for(j=0;j<SJFPN;j++)

? ? ? ? {

? ? ? ? ? ? if((Process[j].ArrivalTime<=temp_time)&&(!Process[j].STATE))

? ? ? ? ? ? ? ? if(Process[j].SJF_ALLTIME<run_time)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? run_time=Process[j].SJF_ALLTIME;

? ? ? ? ? ? ? ? ? ? PID_ORDERED=j;

? ? ? ? ? ? ? ? }

? ? ? ? }

? ? ? ? //查找下一個被調(diào)度的進程

? ? ? ? //對找到的下一個被調(diào)度的進程求相應的參數(shù)

? ? ? ? Process[PID_ORDERED].ServiceTime=temp_time;

? ? ? ? Process[PID_ORDERED].FinishTime=Process[PID_ORDERED].ServiceTime+Process[PID_ORDERED].SJF_ALLTIME;

? ? ? ? Process[PID_ORDERED].STATE=1;

? ? ? ? temp_time=Process[PID_ORDERED].FinishTime;

? ? ? ? PRESENT_PNUMBER++;

? ? ? ? Process[PID_ORDERED].order=PRESENT_PNUMBER;

? ? }return 0;

}

5 系統(tǒng)測試 (UTF-8編碼? 可在 WINDOWS &LINUX環(huán)境下運行)

5.1Linux環(huán)境下編譯主程序生成a.out文件

操作系統(tǒng)課程設計進程調(diào)度模擬

5.2運行a.out文件 ?(運行時可選擇PRIORITY以及ALLTIME的生成方式)

操作系統(tǒng)課程設計進程調(diào)度模擬

5.2.1輪轉(zhuǎn)調(diào)度算法的實現(xiàn)演示

操作系統(tǒng)課程設計進程調(diào)度模擬

5.2.2靜態(tài)優(yōu)先級調(diào)度算法的實現(xiàn)演示

操作系統(tǒng)課程設計進程調(diào)度模擬

5.2.3動態(tài)優(yōu)先級調(diào)度算法的實現(xiàn)演示

操作系統(tǒng)課程設計進程調(diào)度模擬

5.2.4最短進程優(yōu)先調(diào)度算法的實現(xiàn)演示 ?(為體現(xiàn)各進程的作業(yè)時長選擇手動輸入)

操作系統(tǒng)課程設計進程調(diào)度模擬

6 設計小結(jié)

本次模擬,實現(xiàn)了進程的輪轉(zhuǎn)調(diào)度、靜態(tài)優(yōu)先級調(diào)度、動態(tài)優(yōu)先級調(diào)度、最短進程優(yōu)先調(diào)度。在整個實現(xiàn)過程中,出現(xiàn)了許多問題,最值得注意的問題如下,:

  1. 代碼編寫過程中的問題
    1. 四種調(diào)度算法中,動態(tài)優(yōu)先級調(diào)度算法較為復雜,在實現(xiàn)進程的優(yōu)先級更新時出現(xiàn)了較大的困難
    2. 在對靜態(tài)優(yōu)先級進行模擬時,由于對ALLTIME的使用限制,造成對ALLTIME的更新操作正常,最終通過添加num計數(shù)器,解決了ALLTIME在進程執(zhí)行結(jié)束后歸零的問題
    3. 由于各種調(diào)度方法的要求不一,因此對PCB結(jié)構(gòu)的定義也出現(xiàn)了一定的選擇問題
  1. 代碼合并中的問題
    1. 對每種調(diào)度算法采用了不同的PCB結(jié)構(gòu),因此各PCB中的屬性不一
    2. 每種調(diào)度算法中對某些屬性的命名產(chǎn)生了沖突
    3. 在對程序進行合并時,最初使用了GOTO語句,但在考慮后,將程序更改為了SWITCH分支結(jié)構(gòu)
  2. 程序運行中的問題
    1. 使用了部分Linux操作系統(tǒng)不支持的庫函數(shù),在Linux環(huán)境下運行時出現(xiàn)了部分編譯錯誤。如gets()函數(shù)的使用,最終將其更改為了cin.get()函數(shù)。
    2. 在對庫函數(shù)做修改后,Linux環(huán)境下運行程序時,四種調(diào)度均可正常實現(xiàn),但對SP算法的調(diào)試并未徹底完成。當在Windows環(huán)境下使用原庫函數(shù)時,程序可以正常無誤地運行;在虛擬機中運行時,目前還未完成:由于庫函數(shù)的使用導致“未知原因造成SP算法中,對4個及以上進程調(diào)度出現(xiàn)無限循環(huán)”的BUG。

本次模擬,到此并沒有真正結(jié)束,對于程序的調(diào)試并沒有真正達到我們滿意的效果,但在Windows系統(tǒng)上已然完善,后續(xù)會繼續(xù)對Linux操作系統(tǒng)下因為庫函數(shù)的問題導致的程序細微異常進行處理,直至完善。文章來源地址http://www.zghlxwxcb.cn/news/detail-480923.html

到了這里,關(guān)于操作系統(tǒng)課程設計進程調(diào)度模擬的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 操作系統(tǒng)進程調(diào)度算法的模擬實現(xiàn)(c語言版本)

    操作系統(tǒng)進程調(diào)度算法的模擬實現(xiàn)(c語言版本)

    ????????前言: 本文旨在分享如何使用c語言對操作系統(tǒng)中的部分進程調(diào)度算法進行模擬實現(xiàn),以及算法描述的講解, 完整代碼放在文章末尾,歡迎大家自行拷貝調(diào)用 目錄 常見的調(diào)度算法 數(shù)據(jù)結(jié)構(gòu) 先來先服務調(diào)度算法 算法模擬思路: 算法模擬:? 最短作業(yè)優(yōu)先調(diào)度算法

    2024年02月06日
    瀏覽(16)
  • 實現(xiàn)時間片輪轉(zhuǎn)算法(模擬)計算機操作系統(tǒng)實驗5:進程調(diào)度算法模擬-RR

    實現(xiàn)時間片輪轉(zhuǎn)算法(模擬)計算機操作系統(tǒng)實驗5:進程調(diào)度算法模擬-RR

    實驗內(nèi)容: 實現(xiàn)時間片輪轉(zhuǎn)算法(模擬),要求如下: 1、用到的數(shù)據(jù)結(jié)構(gòu) /* PCB / struct PCB { pid_t pid;//進程 PID int state; //狀態(tài)信息,1 表示正在運行,0 表示暫停,-1 表示結(jié)束 unsigned long runned_time;//已運行時間 unsigned long need_running_time;//剩余運行時間 }; / PCB集合 */ struct PCB pcb[TOT

    2024年02月04日
    瀏覽(21)
  • 操作系統(tǒng)課程設計-Linux 進程控制

    操作系統(tǒng)課程設計-Linux 進程控制

    目錄 前言 1 實驗題目 2 實驗目的 3 實驗內(nèi)容 3.1 進程的創(chuàng)建 3.1.1 步驟 3.1.2 關(guān)鍵代碼 3.2 子進程執(zhí)行新任務 3.2.1 步驟 3.2.2?關(guān)鍵代碼 4 實驗結(jié)果與分析 4.1 進程的創(chuàng)建 4.2 子進程執(zhí)行新任務 5 代碼 5.1 進程的創(chuàng)建 5.2 子進程執(zhí)行新任務 ?????????本實驗為課設內(nèi)容,博客內(nèi)容為

    2024年01月18日
    瀏覽(27)
  • 操作系統(tǒng)課程設計----模擬文件管理系統(tǒng)(c語言)

    操作系統(tǒng)課程設計----模擬文件管理系統(tǒng)(c語言)

    1.采用高級語言編寫程序模擬文件系統(tǒng),文件系統(tǒng)采用多級目錄結(jié)構(gòu),實現(xiàn)對文件和目錄的創(chuàng)建、刪除、重命名、變更權(quán)限、顯示文件內(nèi)容、修改文件內(nèi)容等操作。 2.撰寫課程設計報告。 編寫程序模擬一個簡單的文件系統(tǒng),具體實驗內(nèi)容如下: (1)實現(xiàn)多級目錄結(jié)構(gòu),而

    2024年01月21日
    瀏覽(24)
  • 頁面置換算法模擬實現(xiàn)-操作系統(tǒng)課程設計基于Java

    頁面置換算法模擬實現(xiàn)-操作系統(tǒng)課程設計基于Java

    存儲管理的主要功能之一是合理的分配空間,請求頁式存儲管理是一種常用的虛擬存儲管理技術(shù)。在地址映射過程中,若在頁表中發(fā)現(xiàn)所要訪問的頁面不在內(nèi)存,則產(chǎn)生中斷,當發(fā)生中斷時,系統(tǒng)必須在內(nèi)存選擇一個頁面移出內(nèi)存,調(diào)用頁面置換算法,以便為調(diào)入新的頁面讓

    2024年02月07日
    瀏覽(29)
  • 操作系統(tǒng)(一):進程狀態(tài)與進程調(diào)度

    操作系統(tǒng)(一):進程狀態(tài)與進程調(diào)度

    ????????操作系統(tǒng)作為計算機基礎的四大件,系統(tǒng)學習無疑是十分重要的。在這個系列的文章中,荔枝會結(jié)合操作系統(tǒng)的知識進行歸納梳理,總結(jié)輸出博文!下面這篇文章主要介紹的是進程狀態(tài)和調(diào)度,重點是幾種調(diào)度算法的理解和掌握,希望對正在學習的小伙伴有幫助

    2024年02月05日
    瀏覽(20)
  • 操作系統(tǒng)實驗(進程調(diào)度)

    操作系統(tǒng)實驗(進程調(diào)度)

    ??1.1理解有關(guān)進程控制塊、進程隊列的概念。 ??1.2掌握進程優(yōu)先權(quán)調(diào)度算法和時間片輪轉(zhuǎn)調(diào)度算法的處理邏輯。 ??2.1設計進程控制塊PCB的結(jié)構(gòu),分別適用于優(yōu)先權(quán)調(diào)度算法和時間片輪轉(zhuǎn)調(diào)度算法。 ??2.2建立進程就緒隊列。 ??2.3編制兩種進程調(diào)度算法:優(yōu)先權(quán)調(diào)度

    2024年02月06日
    瀏覽(18)
  • 【操作系統(tǒng)】進程調(diào)度

    【操作系統(tǒng)】進程調(diào)度

    目錄 調(diào)度的概念 調(diào)度目標 ? ? 所有系統(tǒng) ? ? 批處理系統(tǒng) ? ? 交互式系統(tǒng) ? ? 實時系統(tǒng) 調(diào)度算法 ? ? 非搶占式調(diào)度算法 ????????先來先服務 ????????最短作業(yè)優(yōu)先 ????????非搶占式優(yōu)先級調(diào)度 ? ? 搶占式調(diào)度算法 ????????最短剩余時間優(yōu)先 ????????輪轉(zhuǎn)

    2024年02月04日
    瀏覽(28)
  • 操作系統(tǒng)與進程調(diào)度

    操作系統(tǒng)與進程調(diào)度

    操作系統(tǒng)是一組做計算機資源管理的軟件的統(tǒng)稱,我們在日常生活常接觸到的操作系統(tǒng)有: windows、IOS、Android、鴻蒙,以及Linux系統(tǒng) 等等,那么 操作系統(tǒng)是什么?計算機是如何運行的? 計算機是由軟件、硬件相互配合工作;事實上,操作系統(tǒng)可以看做是介于軟硬件之間的一組軟

    2024年02月05日
    瀏覽(22)
  • 【操作系統(tǒng)核心概念】進程管理和進程調(diào)度

    【操作系統(tǒng)核心概念】進程管理和進程調(diào)度

    本文主要講的是操作系統(tǒng)的一些核心概念, 主要講解 進程管理和進程調(diào)度 的問題, 當然學習完本篇并不會讓你能從零打造一個操作系統(tǒng), 而只是讓讀者有了對操作系統(tǒng)核心概念的基本認識. 關(guān)注收藏, 開始學習吧?? 操作系統(tǒng)是一組做計算機資源管理的軟件的統(tǒng)稱 , 其本質(zhì)上也

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包