




已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄目錄課題1: 進程調(diào)度算法的模擬51設(shè)計目的52任務(wù)及要求52.1設(shè)計任務(wù)及要求53算法及數(shù)據(jù)結(jié)構(gòu)53.1算法的總體思想(流程)53.2數(shù)據(jù)結(jié)構(gòu)模塊63.2.1功能63.2.2數(shù)據(jù)結(jié)構(gòu)63.3隨機數(shù)字產(chǎn)生方法模塊63.3.1功能63.3.2算法63.4先到先服務(wù)(FCFS)模塊73.4.1功能73.4.2數(shù)據(jù)結(jié)構(gòu)73.4.3算法73.5SJF(最短作業(yè)優(yōu)先)調(diào)度算法模塊73.5.1功能73.5.2數(shù)據(jù)結(jié)構(gòu)83.5.3算法83.6優(yōu)先級調(diào)度算法模塊103.6.1功能103.6.2數(shù)據(jù)結(jié)構(gòu)103.6.3算法103.7RR時間片輪轉(zhuǎn)調(diào)度算法模塊123.7.1功能133.7.2數(shù)據(jù)結(jié)構(gòu)133.7.3算法133.8主函數(shù)模塊143.8.1功能143.8.2數(shù)據(jù)結(jié)構(gòu)143.8.3算法143.9進程的初始化模塊163.9.1功能163.9.2數(shù)據(jù)結(jié)構(gòu)163.9.3算法164實驗結(jié)果及分析174.1實驗結(jié)果174.1.1先到先服務(wù)算法演示:174.1.2SJF(最短作業(yè)優(yōu)先)調(diào)度算法演示:194.1.3優(yōu)先度調(diào)度算法演示:204.1.4RR(輪轉(zhuǎn)法)調(diào)度算法演示:254.2結(jié)果分析27課題2: 系統(tǒng)動態(tài)分配資源的模擬301設(shè)計目的302任務(wù)及要求302.1設(shè)計任務(wù)及其要求303算法及數(shù)據(jù)結(jié)構(gòu)303.1算法的總體思想(流程)303.2數(shù)據(jù)結(jié)構(gòu)模塊313.3隨機數(shù)字產(chǎn)生方法模塊324.2.1功能324.2.2數(shù)據(jù)結(jié)構(gòu)324.2.3算法323.4用戶自定義模塊323.4.1功能323.4.2數(shù)據(jù)結(jié)構(gòu)323.4.3算法323.5打印系統(tǒng)現(xiàn)在狀態(tài)模塊343.5.1功能343.5.2數(shù)據(jù)結(jié)構(gòu)343.5.3算法343.6打印系統(tǒng)安全狀態(tài)變化模塊353.6.1功能353.6.2數(shù)據(jù)結(jié)構(gòu)353.6.3算法363.7進程申請資源模塊373.7.1功能373.7.2數(shù)據(jù)結(jié)構(gòu)373.7.3算法373.8選擇菜單模塊413.8.1功能413.8.2數(shù)據(jù)結(jié)構(gòu)413.8.3算法413.9系統(tǒng)自動生成系統(tǒng)狀態(tài)模塊423.9.1功能423.9.2數(shù)據(jù)結(jié)構(gòu)423.9.3算法423.10主函數(shù)模塊433.10.1功能433.10.2數(shù)據(jù)結(jié)構(gòu)433.10.3算法434實驗結(jié)果及分析444.1實驗結(jié)果444.1.1用戶自定義演示444.1.2系統(tǒng)自動生成504.2結(jié)果分析50課題3:內(nèi)存的置換算法演示511設(shè)計目的512任務(wù)及要求512.1設(shè)計任務(wù)及其要求513算法及數(shù)據(jù)結(jié)構(gòu)513.1算法的總體思想(流程)513.1.1先進先出頁面置換算法(FIFO)513.1.2最近最少使用算法(LRU)513.1.3最佳置換算法(OPT)523.1.4最近最不經(jīng)常使用置換算法(NUR)523.2先進先出的算法(FIFO)523.2.1功能523.2.2數(shù)據(jù)結(jié)構(gòu)523.2.3算法523.3最近最少使用算法(LRU)543.3.1功能543.3.2數(shù)據(jù)結(jié)構(gòu)543.3.3算法543.4最佳淘汰算法(OPT)563.4.1功能563.4.2數(shù)據(jù)結(jié)構(gòu)563.4.3算法563.5最近最不經(jīng)常使用算法(NUR)583.5.1功能583.5.2數(shù)據(jù)結(jié)構(gòu)583.5.3算法583.6主函數(shù)模塊603.6.1功能603.6.2數(shù)據(jù)結(jié)構(gòu)603.6.3算法604實驗結(jié)果及分析614.1實驗結(jié)果614.1.1先進先出的算法(FIFO)614.1.2最近最少使用算法(LRU)634.1.3最佳淘汰算法(OPT)654.1.4最近最不經(jīng)常使用算法(NUR)664.2結(jié)果分析6868進程調(diào)度算法課題1: 進程調(diào)度算法的模擬1 設(shè)計目的同時通過用C語言編程實現(xiàn)進程調(diào)度的算法,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法2 任務(wù)及要求2.1 設(shè)計任務(wù)及要求1用語言來實現(xiàn)對n個進程采用不同調(diào)度算法的進程調(diào)度。2每個用來標識進程的進程控制塊PCB用結(jié)構(gòu)來描述,包括以下字段:(1)進程編號ID,其中0為閑逛進程,用戶進程的標識數(shù)為1,2,3。(2)進程優(yōu)先級Priority,閑逛進程(idle)的優(yōu)先級為0,用戶進程的優(yōu)先級大于0,且隨機產(chǎn)生,優(yōu)先數(shù)越大,優(yōu)先級越高。(3)進程占用的CPU時間CPUtime,進程每運行一次,累計值等于4。(4)進程總共需要運行時間Alltime,利用隨機函數(shù)產(chǎn)生。(5)進程狀態(tài),0:就緒態(tài);1:運行態(tài);2:阻塞態(tài)。(6)隊列指針next,用來將多個進程控制塊PCB鏈接為隊列。3優(yōu)先數(shù)改變的原則(1)進程在就緒隊列中每呆一個時間片,優(yōu)先數(shù)增加1。(2)進程每運行一個時間片,優(yōu)先數(shù)減3。4在調(diào)度前,系統(tǒng)中擁有的進程數(shù)PCB_number由鍵盤輸入,經(jīng)初始化后,所有的進程控制塊PCB鏈接成就緒隊列。3 算法及數(shù)據(jù)結(jié)構(gòu)3.1 算法的總體思想(流程)對于先到先服務(wù)算法,只需要給定每個進程的進程號,然后依次順序執(zhí)行就可以了。對于SJF(最短作業(yè)優(yōu)先)調(diào)度算法需要判斷作業(yè)的alltime時間,alltime最小的最先執(zhí)行,依次按照時間的從小到大執(zhí)行進程。對于優(yōu)先度調(diào)度算法,需要先判斷優(yōu)先度的大小,優(yōu)先度最大的先執(zhí)行,進程運行完畢以后,按照優(yōu)先數(shù)的改變的原則進行改變,然后繼續(xù)判斷所有的優(yōu)先數(shù)的大小,依舊是優(yōu)先數(shù)最大的先執(zhí)行,直到執(zhí)行完畢。對于RR時間片輪轉(zhuǎn)調(diào)度算法,需要依次執(zhí)行時間片用完即阻塞,轉(zhuǎn)交給下一個進程執(zhí)行,直到所有進程運行完畢。3.2 數(shù)據(jù)結(jié)構(gòu)模塊3.2.1 功能進程的結(jié)構(gòu)體聲明與函數(shù)的聲明3.2.2 數(shù)據(jù)結(jié)構(gòu)struct Processint Pro_Id; /進程編號IDint Priority; /進程優(yōu)先級,隨機產(chǎn)生int CPUtime; /進程占用的CPU時間CPUtimeint Alltime; /進程共需運行時間 ,隨機產(chǎn)生int State; /進程狀態(tài)struct Process * Next;/*函數(shù)聲明*/intrandom_num();/隨機數(shù)字產(chǎn)生struct Process * INITIAL(int *n);/進程的初始化int printall(struct Process * P1 );/打印所有進程的具體信息int get_maxpri(struct Process * P1);/獲取優(yōu)先度最高的進程號int get_mintime(struct Process * P1); /獲作業(yè)時間最短的進程號void alert_status(struct Process * P1,int m);/修改進程的狀態(tài)void alert_pri(struct Process * P1,int m); /修改進程的優(yōu)先度void FCFS(struct Process * Head); /先來先服務(wù)算法void Priority(struct Process *Head,int n); /優(yōu)先級調(diào)度算法struct Process * alert_sjf(struct Process *P2,int m);/修改sjf算法狀態(tài)void SJF(struct Process *Head,int n) ; /SJF調(diào)度算法void RR(struct Process *Head,int n); /RR時間片調(diào)度算法3.3 隨機數(shù)字產(chǎn)生方法模塊3.3.1 功能隨機產(chǎn)生數(shù)字,用于進程初始化時的優(yōu)先度與alltime賦值3.3.2 算法/*隨機數(shù)字產(chǎn)生方法*/int random_num()int m;m=rand()%100;if (m=0)m=1; return m;/隨機數(shù)函數(shù)結(jié)束3.4 先到先服務(wù)(FCFS)模塊3.4.1 功能模擬進程的先到先服務(wù)調(diào)度算法,按照進程編號依次運行。3.4.2 數(shù)據(jù)結(jié)構(gòu)void FCFS(struct Process * Head); /先來先服務(wù)算法printall(struct Process * Head);/打印所有進程信息3.4.3 算法/*先來先服務(wù)算法*/void FCFS(struct Process * Head) struct Process * P1,*P2; P1=Head; while(P1!=NULL) P1-State=1; /printf(%3d n,P1-State); P2=Head; printall(P2);printf(按任意鍵,繼續(xù)演示.n);getchar(); P1-CPUtime=P1-Alltime; P1-State=3; /printf(%3d號進程運行完畢n,P1-Pro_Id); / Sleep(1000+P1-Alltime*10); P1=P1-Next; /while P2=Head; printall(P2); printf(演示結(jié)束,謝謝。n);/FCFS結(jié)束3.5 SJF(最短作業(yè)優(yōu)先)調(diào)度算法模塊3.5.1 功能將每個進程與其下一個CPU區(qū)間段相關(guān)聯(lián)。當CPU為可用時,它會賦給具有最短后續(xù)CPU區(qū)間的進程。如果兩個進程具有同樣長度的CPU區(qū)間,那么可以使用FCFS調(diào)度來處理。3.5.2 數(shù)據(jù)結(jié)構(gòu)void SJF(struct Process *Head,int n)SJF的主函數(shù),用于調(diào)度SJF算法int get_mintime(struct Process * P1)獲取所有進程中最小時間的進程,返回進程號struct Process * alert_sjf(struct Process *P2,int m)進程運行以后,修改進程的狀態(tài)3.5.3 算法/*SJF調(diào)度算法*/void SJF(struct Process *Head,int n) int m; int i; struct Process *P2,*P; P=NULL; for(i=0;iState=3;P-CPUtime=P-Alltime;P=NULL;printf(按任意鍵,繼續(xù)演示.n);getchar();P2=Head;printf(n所有進程運行結(jié)束。nn);printall(P2);printf(SJF算法演示完畢,謝謝使用n);/*獲取進程最短時間*/ int get_mintime(struct Process * P1)int k,m;k=1001;m=0;while(P1!=NULL)if(k P1-Alltime &P1-State!=3)k=P1-Alltime;m=P1-Pro_Id;/ifP1=P1-Next;/whilereturn m;/*修改sjf算法狀態(tài)*/struct Process * alert_sjf(struct Process *P2,int m)struct Process *P1,*P;int k=0;P1=P2;P=NULL;while(1)if(P1-Pro_Id=m)P1-State=1;P=P1;k=1;/ifelseP1=P1-Next;if(k=1)break;/whilereturn P; 3.6 優(yōu)先級調(diào)度算法模塊3.6.1 功能1.每個進程被賦予一個優(yōu)先級數(shù)字(優(yōu)先權(quán))2.CPU分配給優(yōu)先權(quán)高的進程(優(yōu)先級數(shù)字越小,則優(yōu)先權(quán)越大)3.6.2 數(shù)據(jù)結(jié)構(gòu)void Priority(struct Process *Head,int n)優(yōu)先度調(diào)度算法主函數(shù),用于優(yōu)先度算法的調(diào)度;int get_maxpri(struct Process * P1)獲取進程中最大優(yōu)先度的進程,并返回進程號void alert_pri(struct Process * P1,int m)程序運行以后,修改進程的信息優(yōu)先度,按照以下規(guī)則:1.進程在就緒隊列中每呆一個時間片,優(yōu)先數(shù)增加1。2.進程每運行一個時間片,優(yōu)先數(shù)減3。void alert_status(struct Process * P1,int m)程序運行以后修改進程的狀態(tài)3.6.3 算法/*優(yōu)先級調(diào)度算法*/void Priority(struct Process *Head,int n) struct Process *P1,*P2; int key=0; int m; P1=Head; P2=Head; /printf(%dn,n); /printf(%dn,key); while(key Priority;m=P1-Pro_Id;while(P1-Next!=NULL)if(k Next-Priority)k=P1-Next-Priority;m=P1-Next-Pro_Id;/ifP1=P1-Next;/whilereturn m;/*修改進程的優(yōu)先度*/void alert_pri(struct Process * P1,int m)struct Process * P2;int k;k = 0;P2 = P1;while(P2 != NULL)if(P2-Priority0)if(P2 - Pro_Id != m)P2 - Priority = P2 - Priority + 1;/ifelseP2 - Priority = P2 - Priority - 3;/elseif(P2-PriorityPriority=0;P2-State = 3;/if/ifP2=P2-Next;/while/修改進程優(yōu)先度函數(shù)結(jié)束/*修改進程的狀態(tài)*/void alert_status(struct Process * P1,int m)struct Process * P2;/int status;P2=P1;while(P2!=NULL)if(P2-Pro_Id=m)P2-State=1;/ifelseif(P2-State=1)P2-State=2;/elseP2=P2-Next;/while/修改進程狀態(tài)結(jié)束3.7 RR時間片輪轉(zhuǎn)調(diào)度算法模塊3.7.1 功能如果就緒隊列中有n個進程,且時間片為q,則每個進程會得到1/n的CPU時間,每個長度不超過q時間單元。每個進程必須等待CPU的時間不會超過(n-1)q個時間單元,直到它的下一個時間片為止3.7.2 數(shù)據(jù)結(jié)構(gòu)void RR(struct Process *Head,int n)RR調(diào)度算法的主函數(shù),用于RR調(diào)度的算法3.7.3 算法/*RR時間片調(diào)度算法*/void RR(struct Process *Head,int n)struct Process *P2,*P1;int m=n;P2=Head;printall(P2);printf(按任意鍵,繼續(xù)演示.);getchar();P2=Head;P1=Head;while(1)while(P1!=NULL)if(P1-State!=3)P1-State=1;printall(P2);printf(按任意鍵,繼續(xù)演示.n);getchar();P2=Head;if(P1-CPUtime+4 Alltime)P1-State=2;P1-CPUtime=P1-CPUtime+4;elseP1-CPUtime=P1-Alltime;P1-State=3;printf(%d號進程已經(jīng)運行完畢!nn,P1-Pro_Id);m-;/else/ifP1=P1-Next;/whileif(m=0)break;elseP1=Head;P2=Head;printall(P2);printf(時間片輪轉(zhuǎn)算法演示結(jié)束,謝謝使用。n);3.8 主函數(shù)模塊3.8.1 功能用于程序與用戶的交互操作,由用戶選擇模擬實驗的算法,并執(zhí)行相應(yīng)的算法。3.8.2 數(shù)據(jù)結(jié)構(gòu)int main()3.8.3 算法/*主函數(shù)*/int main()struct Process *Head,*P1;int a;int k=1;/int m;int n;n=0;while(k=1)system(cls);P1=NULL;Head=NULL;srand(int)time(NULL);/該語句只需要一次遞交種子就可以printf(*實驗?zāi)M開始*n);printf(n);printf(n);printf(n);printf( 1.先到先服務(wù)調(diào)度算法;n);printf( 2.SJF(最短作業(yè)優(yōu)先)調(diào)度算法;n);printf( 3.優(yōu)先度調(diào)度算法;n);printf( 4.RR(輪轉(zhuǎn)法)調(diào)度算法;n);printf( 5.退出;n);printf(n);printf(n);printf(n);printf(*n);printf(請輸入您的選擇:);scanf(%d,&a);while(a!=1 & a!=2 & a!=3 & a!=4 & a!=5)printf(對不起,您的選擇有誤,請重新選擇);scanf(%d,a);/whileif(a=1|a=2|a=3|a=4)P1=INITIAL(&n);Head=P1;printall(P1);printf(初始化進程已完成.n);printf(n按任意鍵實驗開始演示:);getchar();getchar();switch (a)case 1 :FCFS(Head);break; case 2 : SJF(Head,n); break;case 3 :Priority(Head,n);break;case 4 :RR(Head,n);break;case 5 :printf(感謝您使用該系統(tǒng).再見n);k=0;break;/switchprintf(n);printf(n);printf(n);if(a=1|a=2|a=3|a=4)printf(按任意鍵回到主菜單.);getchar();/while/main3.9 進程的初始化模塊3.9.1 功能用于由用戶輸入進程數(shù)以后,對進程的初始化,并利用隨機函數(shù),隨機生成進程的優(yōu)先度與alltime,并賦值。3.9.2 數(shù)據(jù)結(jié)構(gòu)struct Process * INITIAL(int *n)3.9.3 算法/*進程的初始化*/struct Process * INITIAL(int *n)struct Process *P1,*Head,*P2;int a=0;int i=0;P1=P2=Head=NULL;/*進程的輸入*/doprintf(please input PCB_number(請輸入進程數(shù)):n);scanf(%d,&a);while(a=0);/do.while/*/P1 = (struct Process *)malloc(sizeof(struct Process);Head = P1;for(i = 1 ; i Pro_Id=i;P1-Priority=random_num();P1-CPUtime=0;P1-Alltime=random_num();P1-State=0;if(i=a)break;P2=(struct Process *)malloc(sizeof(struct Process);P1-Next=P2;P1=P2;/forP1-Next=NULL;*n=a;return Head;/初始化函數(shù)結(jié)束4 實驗結(jié)果及分析4.1 實驗結(jié)果4.1.1 先到先服務(wù)算法演示:4.1.2 SJF(最短作業(yè)優(yōu)先)調(diào)度算法演示:4.1.3 優(yōu)先度調(diào)度算法演示:4.1.4 RR(輪轉(zhuǎn)法)調(diào)度算法演示:4.2 結(jié)果分析1.int random_num()/*隨機數(shù)字產(chǎn)生方法*/int m;srand(int)time(NULL);m=rand()%100; /*/return m;這個函數(shù)導(dǎo)致隨機數(shù)產(chǎn)生以后,所有 的隨機數(shù)都是一個數(shù)。問題原因是:隨機種子是傳遞給操作系統(tǒng)的,不是傳遞給函數(shù)的,所以,不必多次調(diào)用。在一個程序中,種子只產(chǎn)生一次即可。也就是說:srand(int)time(NULL);這句只出現(xiàn)在main函數(shù)里一次就可以修改后運行結(jié)果:2.進程開始執(zhí)行以后當所有進程都結(jié)束后。程序一直在運行,結(jié)束不了。加入變量key表示已經(jīng)完成的進程作為解決辦法,但是當用指針處理的時候,發(fā)現(xiàn)打印出的是key的地址,但是用的是*key,最后只能用printall返回一個值表示有進程完成。解決了問題,不明白為什么用*key不能打印出數(shù)字而是地址。修改加入變量后結(jié)果是:3.再次選擇優(yōu)先度算法時,運行輸入一個進程的時候發(fā)現(xiàn)直接沒有運行提示程序運行完畢原因是第一次運行完成后,沒有把key置0導(dǎo)致第二次運行的時候出現(xiàn)key=n,不執(zhí)行while循環(huán)。修改后執(zhí)行:4.實現(xiàn)第二個調(diào)度方法(優(yōu)先度調(diào)度算法)的時候,一直是按照優(yōu)先度為零的時候結(jié)束程序,后來發(fā)現(xiàn)矛盾,。應(yīng)該是cputime=alltime的時候結(jié)束進程。需要修改,但是問題又來了。設(shè)計要求是優(yōu)先級要大于0,如果優(yōu)先級等于0時,cputime!=alltime怎么辦?暫時按照優(yōu)先級等于零為運行結(jié)束。系統(tǒng)動態(tài)分配資源模擬課題2: 系統(tǒng)動態(tài)分配資源的模擬1 設(shè)計目的在計算機操作系統(tǒng)中,最有代表的避免死鎖的算法,是Dijkstra銀行家算法。這是由于該算法能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名的。為了加深對該算法的認識和掌握,進而在計算機上實現(xiàn)。為了實現(xiàn)銀行家算法,系統(tǒng)中必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。2 任務(wù)及要求2.1 設(shè)計任務(wù)及其要求編程序模擬銀行家算法,要求能體現(xiàn)算法的全過程3 算法及數(shù)據(jù)結(jié)構(gòu)3.1 算法的總體思想(流程)1 銀行家算法中的數(shù)據(jù)結(jié)構(gòu)(1) 可利用資源向量Available.這是一個含有m個元素的數(shù)組,其中的每一個元素代表一類可利用的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動態(tài)地改變.(2) 最大需求矩陣Max.這是nm的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求.(3) 分配矩陣Allocation.這也是一個nm的矩陣,它定義了系統(tǒng)中每一類資源當前已分配給每一進程的資源數(shù).(4) 需求矩陣Need. 這也是一個nm的矩陣,用以表示每一個進程尚需的各類資源數(shù).上述三個矩陣間存在下述關(guān)系:Needi,j=Maxi,j-Allocationi,j2 銀行家算法設(shè)Requesti是進程Pi的請求向量,如果Requestij=K,表示進程Pi需要K個Pj類型的資源.當Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查:(1) 如果Requestij=Needi,j,便轉(zhuǎn)向步驟2;否則認為出錯,因為它所需要的資源數(shù)已超出它所宣布的最大值.(2) 如果Requestij=Availablei,j, 便轉(zhuǎn)向步驟3;否則,表示尚無足夠資源, Pi須等待.(3) 系統(tǒng)試探著把資源分配給進程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值: Availablej:= Availablej- Requestij;Allocationi,j:= Allocationi,j+ RequestijNeedi,j:=Needi,j-Requestij;(4) 系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài).若安全,才正式將資源分配給進程Pi,以完成本次分配;否則,將本次的試探分配作廢,恢復(fù)原來的資源分配狀態(tài),讓進程Pi等待.3 安全性算法系統(tǒng)所執(zhí)行的安全性算法可描述如下:(1) 設(shè)置兩個向量: 1 工作向量Work:它表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)目,它含有m個元素,在執(zhí)行安全算法開始時, Work:=Available;2 Finish:它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成.開始時先做Finishi:=false;當有足夠資源分配給進程時,再令Finishi:=true.(2) 從進程集合中找到一個能滿足下述條件的進程:1 Finishi:=false;2 Needi,j= Workj;若找到,執(zhí)行步驟3,否則,執(zhí)行步驟4.(3) 當進程Pi獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行: Workj:= Workj+ Allocationi,j; Finishi:=true;go to step2;(4) 如果所有進程的Finishi:=true都滿足,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài).3.2 數(shù)據(jù)結(jié)構(gòu)模塊#include #include #include #include #include #include /*定義全局變量*/int Available10; /可使用資源向量int Max1010=0; /最大需求矩陣int Allocation1010=0; /分配矩陣int Need1010=0; /需求矩陣int Work10; /工作向量int Finish10; /狀態(tài)標志int Request10; /進程申請資源向量int n=3; /系統(tǒng)資源總數(shù)int m=5;/總的進程數(shù)int pro10;/進程的順序/*函數(shù)聲明*/int check_request(int Request,int k);int check_request1(int Request,int c);3.3 隨機數(shù)字產(chǎn)生方法模塊4.2.1 功能生成隨機數(shù)4.2.2 數(shù)據(jù)結(jié)構(gòu)int random_num()4.2.3 算法/*隨機數(shù)字產(chǎn)生方法*/int random_num()int m;m=rand()%10;if (m=0)m=1; return m;/隨機數(shù)函數(shù)結(jié)束3.4 用戶自定義模塊3.4.1 功能用于用戶自定義系統(tǒng)狀態(tài)3.4.2 數(shù)據(jù)結(jié)構(gòu)void user_initial()int check_request(int Request,int k)int check_request1(int Request,int c)3.4.3 算法void user_initial()int i;int j;printf(請輸入系統(tǒng)總共有的資源數(shù):);scanf(%d,&n);printf(請輸入總共有多少個進程:);scanf(%d,&m);for(i=0;in;i+) printf(系統(tǒng)中%c類資源可用的資源實例:,i+65); scanf(%d,&Availablei);for(i=0;im;i+)for(j=0;jn;j+)printf(進程P%d對%c類資源的最大需求量:,i,j+65);scanf(%d,&Maxij);for(j=0;jn;j+)printf(該進程已經(jīng)擁有的%c類資源數(shù):,j+65);scanf(%d,&Allocationij);Needij=Maxij-Allocationij;int check_request(int Request,int k)int j; for(j=0;jn;j+) if(Requestj=Needkj) ;/當 RequestjNeedcj時,所需的資源已經(jīng)超過它宣布的最大值 break; return 1;int check_request1(int Request,int c) int j;int count=0;for(j=0;jn;j+)if(Requestj=Availablej)count+;elsereturn 0;break;if(count=m)for(j=0;jm;j+)/試探性分配Availablej=Availablej-Requestj;Allocationcj=Allocationcj+Requestj;Needcj=Needcj-Requestj; return 1;3.5 打印系統(tǒng)現(xiàn)在狀態(tài)模塊3.5.1 功能打印系統(tǒng)現(xiàn)在狀態(tài)3.5.2 數(shù)據(jù)結(jié)構(gòu)void printall()3.5.3 算法void printall()int i;int j;int k;printf(n系統(tǒng)進程信息:nn);printf(-目前占有資源-最大需求資源量-尚需資源-n);printf(n進程 | );for(j=1;j4;j+)for(i=0;in;i+)printf(%c類 ,i+65);printf( | );printf(n);for(k=0;km;k+)printf(P%d,k);printf( | );for(j=0;jn;j+)printf(%-2d ,Allocationkj);printf( | );for(j=0;jn;j+)printf(%-2d ,Maxkj);printf( | );for(j=0;jn;j+)printf(%-2d ,Needkj);printf( | );printf(n);printf(n系統(tǒng)剩余資源: );for(i=0;in;i+)printf(%-2d ,Availablei);3.6 打印系統(tǒng)安全狀態(tài)變化模塊3.6.1 功能打印系統(tǒng)安全狀態(tài)變化3.6.2 數(shù)據(jù)結(jié)構(gòu)void printall_work()3.6.3 算法void printall_work()int i;int j;int k;printf(n系統(tǒng)進程信息:nn);printf(-Work-Need-Allocation-Work+Allocation-Finish-n);printf(n進程 | );for(j=1;j5;j+)for(i=0;in;i+)printf(%c類 ,i+65);printf( | );printf(n);for(k=0;km;k+)printf(P%d,k);printf( | );for(j=0;jn;j+)printf(%-2d ,Workj);printf( | );for(j=0;jn;j+)printf(%-2d ,Needkj);printf( | );for(j=0;jn;j+)printf(%-2d ,Allocationkj);printf(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中學(xué)教職工聘任合同范本
- 影視藝人簽約協(xié)議書
- 房屋地基下沉協(xié)議書
- 氣囊封堵合同協(xié)議書
- 景區(qū)資產(chǎn)交接協(xié)議書
- 月度運營分析與總結(jié)計劃
- 陽臺草坪施工方案
- 社會實踐對幼兒園教學(xué)的影響計劃
- 救災(zāi)物品捐贈協(xié)議書
- 教師兼職合同協(xié)議書
- 供水企業(yè)安全生產(chǎn)培訓(xùn)課件
- 2024年《大學(xué)語文》期末考試復(fù)習(xí)題庫(含答案)
- 早產(chǎn)的護理查房課件
- 國家智慧教育平臺培訓(xùn)課件
- 針灸科出科個人小結(jié)
- 語感與語言習(xí)得-【中職專用】高一語文同步課件(高教版2023·基礎(chǔ)模塊上冊)
- 2024年中國石化集團資本有限公司招聘筆試參考題庫含答案解析
- 普通高中地理課程標準(2023年版)
- 檢驗批劃分方案14
- 《公共管理學(xué)》期末考試復(fù)習(xí)題庫(含答案)
- 公司實際控股人協(xié)議書
評論
0/150
提交評論