操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度的模擬實(shí)現(xiàn)_第1頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度的模擬實(shí)現(xiàn)_第2頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度的模擬實(shí)現(xiàn)_第3頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度的模擬實(shí)現(xiàn)_第4頁
操作系統(tǒng)課程設(shè)計(jì)進(jìn)程調(diào)度的模擬實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、課程設(shè)計(jì)題目 進(jìn)程調(diào)度算法模擬編程 學(xué)生姓名 學(xué)號 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班級 指導(dǎo)教師 完成日期2012年12月18日進(jìn)程調(diào)度的模擬實(shí)現(xiàn)摘要:進(jìn)程管理是操作系統(tǒng)中的重要功能,用來創(chuàng)建進(jìn)程、撤消進(jìn)程、實(shí)現(xiàn)進(jìn)程狀態(tài)轉(zhuǎn)換,它提供了在可運(yùn)行的進(jìn)程之間復(fù)用CPU的方法。在進(jìn)程管理中,進(jìn)程調(diào)度是核心,因?yàn)樵诓捎枚嗟莱绦蛟O(shè)計(jì)的系統(tǒng)中,往往有若干個(gè)進(jìn)程同時(shí)處于就緒狀態(tài),當(dāng)就緒進(jìn)程個(gè)數(shù)大于處理器數(shù)目時(shí),就必須依照某種策略決定哪些進(jìn)程優(yōu)先占用處理器。本文通過兩種算法模擬實(shí)現(xiàn)了進(jìn)程之間的調(diào)度。關(guān)鍵詞:進(jìn)程創(chuàng)建,先來先服務(wù),優(yōu)先級調(diào)度。一前言在操作系統(tǒng)中,調(diào)度的實(shí)質(zhì)是一種資源分配,調(diào)度算法即指:根據(jù)系統(tǒng)的資源分

2、配策略所規(guī)定的資源分配算法。對于不同的系統(tǒng)和系統(tǒng)目標(biāo),通常采用不同的調(diào)度算法,如在批處理系統(tǒng)中,為照顧為數(shù)眾多的短作業(yè),采用短作業(yè)有限調(diào)度算法;在分時(shí)系統(tǒng)中,為保證系統(tǒng)具有合理的響應(yīng)時(shí)間,采用輪轉(zhuǎn)法進(jìn)行調(diào)度。采用算法時(shí),則要考慮多方面因素,以便達(dá)到最佳效果。做好這個(gè)課程設(shè)計(jì),有利于加深對操作系統(tǒng)進(jìn)程調(diào)度知識的理解。二. 系統(tǒng)總體框架設(shè)計(jì)本程序采用兩種算法(最高優(yōu)先級數(shù)優(yōu)先的調(diào)度算法和先來先服務(wù)算法)對多個(gè)進(jìn)程進(jìn)行調(diào)度,每個(gè)進(jìn)程有三個(gè)狀態(tài),初始狀態(tài)為就緒狀態(tài)。最高優(yōu)先級數(shù)優(yōu)先的調(diào)度算法中,程序的某進(jìn)程運(yùn)行時(shí)間以時(shí)間片為單位計(jì)算。各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時(shí)間數(shù)以及進(jìn)程需運(yùn)行的時(shí)間片數(shù)的初始值均由用戶給

3、定。在優(yōu)先級數(shù)優(yōu)先的調(diào)度算法中,優(yōu)先級數(shù)的值設(shè)計(jì)為100與運(yùn)行時(shí)間的差值,即Pro_time-process->needtime。進(jìn)程每執(zhí)行一次,優(yōu)先數(shù)減3,CPU時(shí)間片數(shù)加1,進(jìn)程還需要的時(shí)間片數(shù)減1。對于遇到優(yōu)先數(shù)一致的情況,采用先來先服務(wù)策略解決。程序設(shè)計(jì)組成框圖數(shù)據(jù)項(xiàng)作用pro_name進(jìn)程名稱time_submit進(jìn)程創(chuàng)建時(shí)刻pro_id進(jìn)程號,當(dāng)進(jìn)程有相同名稱時(shí),用來區(qū)分進(jìn)程time_start進(jìn)程啟動(dòng)時(shí)刻time_exe進(jìn)程要求運(yùn)行時(shí)間time_end進(jìn)程結(jié)束的時(shí)刻pro_priority進(jìn)程優(yōu)先級圖1-2 進(jìn)程控制塊CpuModel類成員作用Cpurun()Cpu模擬運(yùn)行

4、函數(shù)CreatePcb()進(jìn)程創(chuàng)建函數(shù)ShowPcb()進(jìn)程顯示函數(shù)PriModel()實(shí)現(xiàn)優(yōu)先級調(diào)度算法FcfsModel()實(shí)現(xiàn)先來先服務(wù)算法pcbnum進(jìn)程數(shù)量freetimeCpu空閑時(shí)間allturn總周轉(zhuǎn)時(shí)間allaver總帶權(quán)周轉(zhuǎn)時(shí)間PcbList進(jìn)程就緒隊(duì)列的實(shí)現(xiàn)圖1-3CpuModel類開始程序流程圖創(chuàng)建進(jìn)程及屬性先來先服務(wù)算法優(yōu)先數(shù)調(diào)度算法顯示進(jìn)程執(zhí)行狀態(tài)結(jié)束1.可強(qiáng)占優(yōu)先調(diào)度算法實(shí)現(xiàn)過程流程圖: 2先來先服務(wù)調(diào)度算法實(shí)現(xiàn)過程流圖3 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)1.設(shè)計(jì)創(chuàng)建進(jìn)程的結(jié)構(gòu)類型定義和結(jié)構(gòu)變量說明struct ProcessPcb,定義PCB相關(guān)變量: ProcessPcb()ne

5、xt=NULL;char pro_name20; /進(jìn)程的名字int time_submit ; /提交時(shí)間,從時(shí)間為1開始計(jì)時(shí)int time_exe ; /進(jìn)程所需的運(yùn)行時(shí)間 int pro_id ; /進(jìn)程ID(系統(tǒng)生成)int pro_priority ; /進(jìn)程優(yōu)先級int time_start ; /開始執(zhí)行的時(shí)間int time_end ; /結(jié)束的時(shí)間 int time_wait ; /等待的時(shí)間int pro_state ; /進(jìn)程的狀態(tài) (就緒,執(zhí)行,完成)int time_left ; /還需多少時(shí)間單位,初始化為所需的執(zhí)行時(shí)間int time_turn ; /周轉(zhuǎn)時(shí)間d

6、ouble time_aver ; /帶權(quán)周轉(zhuǎn)時(shí)間2.創(chuàng)建PCB類class CpuModel,定義程序中使用的各函數(shù):CpuModelCpuModel()pcbnum=0; void cpurun(); /cpu模擬運(yùn)行函數(shù)bool GetPcb(); /進(jìn)程輸入函數(shù)void ShowPcb(); /將輸入的進(jìn)程展示出來void PriModel(); /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式void FcfsModel(); /先到先服務(wù)調(diào)度模式ProcessPcb PcbList100;/按提交時(shí)間排的未就緒進(jìn)程隊(duì)列()4 測試結(jié)果及分析 1.開始運(yùn)行,顯示: 2.輸入進(jìn)程數(shù),各進(jìn)程屬性: 關(guān)于提交時(shí)

7、間執(zhí)行時(shí)間等,將檢測輸入是否數(shù)字,不是數(shù)字即退出程序。 3.顯示已創(chuàng)建的各進(jìn)程及其屬性:此處的優(yōu)先級數(shù),是用100減去執(zhí)行時(shí)間。對于優(yōu)先級數(shù)相同,則默認(rèn)FIFO。4.測試可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度:一次調(diào)度完成,將計(jì)算此次運(yùn)行中CPU的利用率。 5. 先到先服務(wù)調(diào)度算法運(yùn)行情況: 6. 選擇5,回車,退出程序。五設(shè)計(jì)心得在學(xué)完操作系統(tǒng)課程之后,一直對進(jìn)程調(diào)度這一塊不是很理解,借著做課程設(shè)計(jì)的機(jī)會,我就選擇了進(jìn)程調(diào)度模擬編程這個(gè)題目,打算在做課程設(shè)計(jì)的過程中好好的再學(xué)習(xí)一下這塊的知識。我在做課程設(shè)計(jì)的過程中,遇到了許多的問題,通過請教同學(xué),上網(wǎng)查資料等途徑一一解決。通過這次操作系統(tǒng)的課程設(shè)計(jì),我研究了

8、進(jìn)程調(diào)度的相關(guān)知識,加深了對進(jìn)程調(diào)度的理解。課程設(shè)計(jì)和平時(shí)的實(shí)驗(yàn)課比較起來有很大的差距,實(shí)驗(yàn)課只是將這一章的一部分內(nèi)容練習(xí)操作一遍,而課程設(shè)計(jì)需要的是他們綜合起來的東西,這要更難一些??傮w來說我認(rèn)為操作系統(tǒng)這門學(xué)科在計(jì)算機(jī)科學(xué)當(dāng)中是非常重要的,這次操作系統(tǒng)的課程設(shè)計(jì)收獲頗豐,復(fù)習(xí)了許多東西,也從新學(xué)會了許多東西,我想這也許就是課程設(shè)計(jì)的最終目的吧。參考文獻(xiàn)1劉振安、劉燕君著.C+程序設(shè)計(jì)課程設(shè)計(jì).北京: 機(jī)械工業(yè)出版社,20042美Abraham Silberschatz, Peter Baer Galvin, Greg Gagne 著. 鄭扣根 譯. 操作系統(tǒng)概念(第六版). 北京: 高等教

9、育出版社,20043陳向群,向勇 等. Windows操作系統(tǒng)原理(第二版). 北京:機(jī)械工業(yè)出版社,2004.4費(fèi)翔林,李敏,葉保留等.Linux操作系統(tǒng)實(shí)驗(yàn)教程.北京:高等教育出版社,2009附錄:#include <iostream.h>#include <queue>#include <string>#include <windows.h> #include <malloc.h>using namespace std ; /進(jìn)程的狀態(tài)#define UNREADY 0 /未就緒#define READY 1 /就緒#defin

10、e EXECUTE 2 /執(zhí)行#define END 3 /完成 /進(jìn)程的PCB結(jié)構(gòu)類型定義和結(jié)構(gòu)變量說明struct ProcessPcb ProcessPcb() next=NULL; char pro_name20; /進(jìn)程的名字 int time_submit ; /提交時(shí)間,從時(shí)間的1開始計(jì)時(shí) int time_exe ; /進(jìn)程所需的運(yùn)行時(shí)間 int pro_id ; /進(jìn)程ID(系統(tǒng)生成) int pro_priority ; /進(jìn)程優(yōu)先級 int time_start ; /開始執(zhí)行的時(shí)間 int time_end ; /結(jié)束的時(shí)間 int time_wait ; /等待的時(shí)間

11、 int pro_state ; /進(jìn)程的狀態(tài) (就緒,執(zhí)行,完成) int time_left ; /還需多少時(shí)間單位,初始化為所需的執(zhí)行時(shí)間 int time_turn ; /周轉(zhuǎn)時(shí)間 double time_aver ; /帶權(quán)周轉(zhuǎn)時(shí)間 ProcessPcb *next; /封裝CPU調(diào)度與分配程序模塊。進(jìn)程類class CpuModelpublic:CpuModel()pcbnum=0;void cpurun(); /cpu模擬運(yùn)行函數(shù)bool CreatePcb(); /進(jìn)程輸入函數(shù)void ShowPcb(); /將輸入的進(jìn)程展示出來void PriModel(); /可強(qiáng)占的優(yōu)先

12、進(jìn)程調(diào)度模式void FcfsModel(); /先到先服務(wù)調(diào)度模式private:ProcessPcb PcbList100; /按提交時(shí)間排的未就緒進(jìn)程隊(duì)列int pcbnum ; /進(jìn)程數(shù)量int freetime ; /cpu空閑時(shí)間int allturn ; /總周轉(zhuǎn)時(shí)間float allaver ; /總帶權(quán)周轉(zhuǎn)時(shí)間;#include<algorithm> /cpu模擬運(yùn)行函數(shù)void CpuModel:cpurun() int choose = 0 ; while(1) cout<<"* 主菜單 *"<<endl;cout&

13、lt;<"-"<<endl;cout<<"* 1: 創(chuàng)建進(jìn)程 *"<<endl;cout<<"* 2: 顯示已創(chuàng)建的進(jìn)程 *"<<endl;cout<<"* 3: 可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度 *"<<endl;cout<<"* 4: 先到先服務(wù)調(diào)度 *"<<endl;cout<<"* 5: 退出系統(tǒng) *"<<endl;cout<<&q

14、uot;n* 請選擇 : " ;cin>>choose ;cout<<endl ; switch(choose) case 1:CreatePcb(); /創(chuàng)建進(jìn)程break;case 2:ShowPcb(); /顯示已創(chuàng)建的進(jìn)程break;case 3: PriModel(); /可強(qiáng)占的優(yōu)先進(jìn)程方式 break; case 4: FcfsModel(); /先到先服務(wù)調(diào)度方式 break;case 5:return ; /結(jié)束程序 cout<<endl; /按進(jìn)程提交時(shí)間排序的比較函數(shù)bool cmp(ProcessPcb a,ProcessP

15、cb b) if(a.time_submit<b.time_submit) return true; return false; /判斷是否數(shù)字int isnumber(char a) int len=strlen(a); int i,num=0; if(a0>'0'&&a0<='9') num=a0-'0' else return -1; for(i=1;i<len;i+) if(ai>='0'&&ai<='9') num=num*10+ai-&

16、#39;0' else return -1; return num; /進(jìn)程輸入函數(shù)bool CpuModel:CreatePcb() char num10; cout<<"n*請輸入你想建立的進(jìn)程個(gè)數(shù): " cin>>num; /輸入進(jìn)程個(gè)數(shù) pcbnum=isnumber(num); if(pcbnum<=0) cout<<"*輸入有錯(cuò)*n" return 0; int i; for(i=0;i<pcbnum;i+) /輸入進(jìn)程信息 cout<<"*請依次輸入第"

17、<<i+1<<"個(gè)進(jìn)程的信息*"<<endl ; cout<<"*名字:" ; cin>>PcbL_name ; cout<<"*提交時(shí)間:" cin>>num; PcbListi.time_submit=isnumber(num); if(PcbListi.time_submit<=0)cout<<"*輸入有錯(cuò)*n" return 0; cout<<"*執(zhí)行時(shí)間:"

18、 cin>>num; PcbListi.time_exe=isnumber(num); if(PcbListi.time_exe<=0) cout<<"*輸入有錯(cuò)*n" return 0; PcbListi.time_left=PcbListi.time_exe; /設(shè)置剩余執(zhí)行時(shí)間 PcbL_state=UNREADY; /設(shè)置狀態(tài)為未就緒 PcbL_priority=100-PcbListi.time_exe; /設(shè)置優(yōu)先級,優(yōu)先級=100-執(zhí)行時(shí)間 cout<<endl ; sort(PcbLi

19、st,PcbList+pcbnum,cmp); /按提交時(shí)間排序 for(i=0;i<pcbnum;i+) PcbL_id=i+1; /設(shè)置Id,根據(jù)提交時(shí)間 return 1; /展示所需執(zhí)行進(jìn)程信息void CpuModel:ShowPcb() int i; cout<<"n*所需執(zhí)行的進(jìn)程信息如下*n" for(i=0;i<pcbnum;i+) cout<<" 進(jìn)程編號: "<<PcbL_id<<" 進(jìn)程名字: " <<Pcb

20、L_name<<" 提交時(shí)間: "<<PcbListi.time_submit <<" 執(zhí)行時(shí)間: "<<PcbListi.time_exe<<" 優(yōu)先級數(shù):" <<PcbL_priority<<endl ; cout<<endl; /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式void CpuModel:PriModel() cout<<"*可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度過程如下*n" freetime=

21、0; /初始化系統(tǒng)空閑時(shí)間為0 int time=0; /時(shí)間 int nextid=0; int pnum=0; /已就緒進(jìn)程數(shù)目 ProcessPcb *head; /就緒隊(duì)列 ProcessPcb *pcb,*pcb1,*pcb2;head=(ProcessPcb*)malloc(sizeof(ProcessPcb); head->next=NULL; /head 指針不用,head->next開始為就緒隊(duì)列 /模擬cpu開始工作 while(head->next!=NULL|pnum<pcbnum) Sleep(1000); time+; /時(shí)間片為1cout&

22、lt;<"*Time: 第"<<time<<"秒"<<endl; /打印 / 進(jìn)程就緒(查看未就緒的進(jìn)程中在該時(shí)間片是否可以進(jìn)入就緒隊(duì)列) while(pnum<pcbnum && PcbListpnum.time_submit<=time) pcb=(ProcessPcb*)malloc(sizeof(ProcessPcb);*pcb=PcbListpnum+;/進(jìn)入就緒隊(duì)列 pcb->next=head->next; /插在head之后 head->next=pc

23、b; /查找在time時(shí)間片應(yīng)該運(yùn)行的進(jìn)程 if(head->next=NULL) cout<<" 沒有可運(yùn)行的進(jìn)程"<<endl; freetime+; else pcb2=head; pcb=head->next; pcb1=head->next;/查找當(dāng)前優(yōu)先級最高的就緒進(jìn)程 while(pcb1->next!=NULL) if(pcb->pro_priority<=pcb1->next->pro_priority) pcb2=pcb1;pcb=pcb1->next; pcb1=pcb1-&

24、gt;next; /運(yùn)行優(yōu)先級最高的進(jìn)程 if(pcb->time_left=pcb->time_exe) /該進(jìn)程是否已開始pcb->time_start=time; /設(shè)置開始時(shí)間 pcb->pro_state=EXECUTE; /設(shè)置狀態(tài)為執(zhí)行 pcb->pro_priority=pcb->pro_priority-3; /優(yōu)先級數(shù)減3 pcb->time_left-; /剩余執(zhí)行時(shí)間減去時(shí)間片1/打印該進(jìn)程信息 cout<<" 進(jìn)程編號: "<<pcb->pro_id<<"

25、 進(jìn)程名字:" <<pcb->pro_name<<" 提交時(shí)間: " <<pcb->time_submit<<" 執(zhí)行時(shí)間: "<<pcb->time_exe <<"n開始時(shí)間: "<<pcb->time_start <<" 還剩時(shí)間: "<<pcb->time_left<<" 優(yōu)先級數(shù):" <<pcb->pro_pri

26、ority<<endl ;/該進(jìn)程是否執(zhí)行結(jié)束 if(pcb->time_left=0) pcb2->next=pcb2->next->next;/將其在就緒隊(duì)列中出列 pcb->time_end=time; /設(shè)置結(jié)束時(shí)間 pcb->time_turn=pcb->time_end-pcb->time_submit+1; /計(jì)算周轉(zhuǎn)時(shí)間 pcb->time_aver=pcb->time_turn/(double)pcb->time_exe;/計(jì)算帶權(quán)周轉(zhuǎn)時(shí)間 pcb->pro_state=END; cout&l

27、t;<"n進(jìn)程"<<pcb->pro_id<<"運(yùn)行結(jié)束:"<<"n進(jìn)程名字: " <<pcb->pro_name<<" 提交時(shí)間: " <<pcb->time_submit<<" 執(zhí)行時(shí)間: " <<pcb->time_exe<<" 開始時(shí)間: " <<pcb->time_start <<" 結(jié)束時(shí)

28、間: "<<pcb->time_end<<"n周轉(zhuǎn)時(shí)間: " <<pcb->time_turn<<"帶權(quán)周轉(zhuǎn)時(shí)間: " <<pcb->time_aver<<endl ; /模擬CPU工作結(jié)束 cout<<"n 所有進(jìn)程運(yùn)行完畢!"<<endl; double c=(time-freetime)/(double)time*100; cout<<"n cpu利用率:"<<c

29、<<"%"<<endl; /可強(qiáng)占的優(yōu)先進(jìn)程調(diào)度模式結(jié)束 /先到先服務(wù)調(diào)度模式void CpuModel:FcfsModel() cout<<"*先到先服務(wù)進(jìn)程調(diào)度過程如下*n" freetime=0; /初始化系統(tǒng)空閑時(shí)間為0 int time=0; /時(shí)間 int pnum=0; /已就緒進(jìn)程數(shù)目 ProcessPcb que100; /就緒隊(duì)列 int quef=0,quee=0; /就緒隊(duì)列的頭指針和尾指針 /模擬cpu開始工作 while(quef<quee|pnum<pcbnum) Sleep(

30、1000); time+; /時(shí)間片為1 cout<<"*Time: 第"<<time<<"秒"<<endl; /打印 /進(jìn)程就緒(查看未就緒的進(jìn)程中在該時(shí)間片是否可以進(jìn)入就緒隊(duì)列) while(pnum<pcbnum && PcbListpnum.time_submit<=time) quequee+=PcbListpnum+; /查找time時(shí)間片的運(yùn)行進(jìn)程 if(quef=quee) cout<<" 沒有可運(yùn)行的進(jìn)程"<<endl

31、; freetime+; else /運(yùn)行進(jìn)程 if(quequef.time_left=quequef.time_exe) /該進(jìn)程是否已開始 quequef.time_start=time; /設(shè)置開始時(shí)間 _state=EXECUTE; /設(shè)置狀態(tài)為執(zhí)行 quequef.time_left-; /剩余執(zhí)行時(shí)間減去時(shí)間片1 /打印進(jìn)程信息 cout<<"進(jìn)程編號: "<<_id<<" 進(jìn)程名字: " <<_name<<&quo

32、t; 提交時(shí)間: " <<quequef.time_submit<<" 執(zhí)行時(shí)間: "<<quequef.time_exe <<"n開始時(shí)間: "<<quequef.time_start<<" 還剩時(shí)間: " <<quequef.time_left<<endl ; /該進(jìn)程是否執(zhí)行結(jié)束 if(quequef.time_left=0) quequef.time_end=time; quequef.time_turn= quequef.time_end-quequef.time_submit+1; quequef.time_aver= qu

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論