程序下載鏈接: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)
圖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)系)
??????? 其中,RR輪轉(zhuǎn)調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:
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)。
??????? 具體流程如下:
??????? 其中,SP靜態(tài)優(yōu)先級調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:
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)。
??????? 具體流程如下:
???????
其中,DP動態(tài)優(yōu)先級調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:
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)度 |
??????? 其中,SJF最短進程優(yōu)先調(diào)度算法中設計的PCB數(shù)據(jù)結(jié)構(gòu)如下:
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文件
5.2運行a.out文件 ?(運行時可選擇PRIORITY以及ALLTIME的生成方式)
5.2.1輪轉(zhuǎn)調(diào)度算法的實現(xiàn)演示
5.2.2靜態(tài)優(yōu)先級調(diào)度算法的實現(xiàn)演示
5.2.3動態(tài)優(yōu)先級調(diào)度算法的實現(xiàn)演示
5.2.4最短進程優(yōu)先調(diào)度算法的實現(xiàn)演示 ?(為體現(xiàn)各進程的作業(yè)時長選擇手動輸入)
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)了許多問題,最值得注意的問題如下,:文章來源:http://www.zghlxwxcb.cn/news/detail-480923.html
- 代碼編寫過程中的問題
- 四種調(diào)度算法中,動態(tài)優(yōu)先級調(diào)度算法較為復雜,在實現(xiàn)進程的優(yōu)先級更新時出現(xiàn)了較大的困難
- 在對靜態(tài)優(yōu)先級進行模擬時,由于對ALLTIME的使用限制,造成對ALLTIME的更新操作正常,最終通過添加num計數(shù)器,解決了ALLTIME在進程執(zhí)行結(jié)束后歸零的問題
- 由于各種調(diào)度方法的要求不一,因此對PCB結(jié)構(gòu)的定義也出現(xiàn)了一定的選擇問題
- 代碼合并中的問題
- 對每種調(diào)度算法采用了不同的PCB結(jié)構(gòu),因此各PCB中的屬性不一
- 每種調(diào)度算法中對某些屬性的命名產(chǎn)生了沖突
- 在對程序進行合并時,最初使用了GOTO語句,但在考慮后,將程序更改為了SWITCH分支結(jié)構(gòu)
- 程序運行中的問題
- 使用了部分Linux操作系統(tǒng)不支持的庫函數(shù),在Linux環(huán)境下運行時出現(xiàn)了部分編譯錯誤。如gets()函數(shù)的使用,最終將其更改為了cin.get()函數(shù)。
- 在對庫函數(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)!