版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
個(gè)人資料整理 僅限學(xué)習(xí)使用院 系:計(jì)算機(jī)學(xué)院實(shí)驗(yàn)課程: 操作系統(tǒng)實(shí)驗(yàn)工程:進(jìn)程調(diào)度的設(shè)計(jì)與實(shí)現(xiàn)指導(dǎo)老師:陳紅英老師開(kāi)課時(shí)間:2018~2018年度第2學(xué)期專(zhuān) 業(yè):網(wǎng)絡(luò)工程班 級(jí):10級(jí)學(xué) 生:yuth學(xué) 號(hào):*一、實(shí)驗(yàn)工程名稱(chēng)進(jìn)程調(diào)度的設(shè)計(jì)與實(shí)現(xiàn)二、實(shí)驗(yàn)?zāi)康募耙?、綜合應(yīng)用下列知識(shí)點(diǎn)設(shè)計(jì)并實(shí)現(xiàn)操作系統(tǒng)的進(jìn)程調(diào)度:鄰接表,布爾數(shù)組,非阻塞輸入,圖形用戶界面GUI,進(jìn)程控制塊,進(jìn)程狀態(tài)轉(zhuǎn)換,多級(jí)反饋隊(duì)列進(jìn)程調(diào)度算法。2、加深理解操作系統(tǒng)進(jìn)程調(diào)度的過(guò)程。3、加深理解多級(jí)反饋隊(duì)列進(jìn)程調(diào)度算法。三、實(shí)驗(yàn)主要硬件軟件環(huán)境32位PC機(jī),VC++6個(gè)人資料整理 僅限學(xué)習(xí)使用四、實(shí)驗(yàn)內(nèi)容及步驟1、采用一種熟悉的語(yǔ)言,如C、PASCAL或C++等,編制程序,最好關(guān)鍵代碼采用C/C++,界面設(shè)計(jì)可采用其它自己喜歡的語(yǔ)言。2、采用多級(jí)反饋隊(duì)列調(diào)度算法進(jìn)行進(jìn)程調(diào)度。3、每個(gè)進(jìn)程對(duì)應(yīng)一個(gè) PCB。在PCB中包括進(jìn)程標(biāo)識(shí)符 pid、進(jìn)程的狀態(tài)標(biāo)識(shí)status、進(jìn)程優(yōu)先級(jí)priority、進(jìn)程的隊(duì)列指針next和表示進(jìn)程生命周期的數(shù)據(jù)life<在實(shí)際系統(tǒng)中不包括該項(xiàng))。4、創(chuàng)建進(jìn)程時(shí)即創(chuàng)建一個(gè)PCB,各個(gè)進(jìn)程的pid都是唯一的,pid是在1到100范圍內(nèi)的一個(gè)整數(shù)??梢詣?chuàng)建一個(gè)下標(biāo)為1到100的布爾數(shù)組,“真”表示下標(biāo)對(duì)應(yīng)的進(jìn)程標(biāo)識(shí)號(hào)是空閑的,“假”表示下標(biāo)對(duì)應(yīng)的進(jìn)程標(biāo)識(shí)號(hào)已分配給某個(gè)進(jìn)程。5、進(jìn)程狀態(tài)status的取值為“就緒ready”或“運(yùn)行run”,剛創(chuàng)建時(shí),狀態(tài)為“ready”。被進(jìn)程調(diào)度程序選中后變?yōu)椤皉un”。6、進(jìn)程優(yōu)先級(jí)priority是0到49范圍內(nèi)的一個(gè)隨機(jī)整數(shù)。7、進(jìn)程生命周期 life是1到5范圍內(nèi)的一個(gè)隨機(jī)整數(shù)。8、初始化時(shí),創(chuàng)建一個(gè)鄰接表,包含50個(gè)就緒隊(duì)列,各就緒隊(duì)列的進(jìn)程優(yōu)先級(jí)priority分別是0到49。9、為了模擬用戶動(dòng)態(tài)提交任務(wù)的過(guò)程,要求動(dòng)態(tài)創(chuàng)建進(jìn)程。進(jìn)入進(jìn)程調(diào)度循環(huán)后,每次按 ctrl+f即動(dòng)態(tài)創(chuàng)建一個(gè)進(jìn)程,然后將該 PCB插入就緒隊(duì)列中。按ctrl+q退出進(jìn)程調(diào)度循環(huán)。10、在進(jìn)程調(diào)度循環(huán)中,每次選擇優(yōu)先級(jí)最大的就緒進(jìn)程來(lái)執(zhí)行。將其狀態(tài)從就緒變?yōu)檫\(yùn)行,通過(guò)延時(shí)一段時(shí)間來(lái)模擬該進(jìn)程執(zhí)行一個(gè)時(shí)間片的過(guò)程,然后優(yōu)先級(jí)減半,生命周期減一。設(shè)計(jì)圖形用戶界面GUI,在窗口中顯示該進(jìn)程和其他所有進(jìn)程的PCB內(nèi)容。如果將該運(yùn)行進(jìn)程的生命周期不為0,則重新把它變?yōu)榫途w狀態(tài),插入就緒隊(duì)列中;否則該進(jìn)程執(zhí)行完成,撤消其PCB。以上為一次進(jìn)程調(diào)度循環(huán)。五、實(shí)驗(yàn)設(shè)計(jì)<一)、需求分析1、采用一種熟悉的語(yǔ)言,如 C、PASCAL或C++等,編制程序,最好關(guān)鍵代碼采用C/C++,界面設(shè)計(jì)可采用其它自己喜歡的語(yǔ)言。2、采用多級(jí)反饋隊(duì)列調(diào)度算法進(jìn)行進(jìn)程調(diào)度。3、要求動(dòng)態(tài)創(chuàng)建進(jìn)程。進(jìn)入進(jìn)程調(diào)度循環(huán)后,每次按ctrl+f即動(dòng)態(tài)創(chuàng)建一個(gè)進(jìn)程,然后將該P(yáng)CB插入就緒隊(duì)列中。按ctrl+q退出進(jìn)程調(diào)度循環(huán)。<二)詳細(xì)設(shè)計(jì)1、總體設(shè)計(jì)方案流程圖個(gè)人資料整理 僅限學(xué)習(xí)使用開(kāi)始輸入按鍵提示Y按下Ctrl+F ? 調(diào)用創(chuàng)建進(jìn)程子函數(shù)NY按下Ctrl+R? 調(diào)用進(jìn)程調(diào)度子函數(shù)NN按下Ctrl+Q?Y停止調(diào)度2、創(chuàng)建進(jìn)程函數(shù)個(gè)人資料整理 僅限學(xué)習(xí)使用3、進(jìn)程調(diào)度函數(shù)從鄰接表中取一個(gè)優(yōu)先級(jí)最高的進(jìn)程 PCB延時(shí)一段時(shí)間,模擬進(jìn)程的進(jìn)行該進(jìn)程的優(yōu)先級(jí)減半,生命周期減一N生命周期不為0? 將進(jìn)程號(hào)歸還Y將該進(jìn)程的PCB插入到返回對(duì)應(yīng)優(yōu)先級(jí)的就緒隊(duì)列中4、使用的數(shù)據(jù)結(jié)構(gòu)<一)、進(jìn)程的PCB結(jié)構(gòu)//進(jìn)程隊(duì)列節(jié)點(diǎn)(由于僅僅是模擬實(shí)驗(yàn),這里無(wú)動(dòng)作 >structprocess{}。//進(jìn)程控制塊
PCBstructPCB{intpid。
//進(jìn)程標(biāo)識(shí)符stringstatus。
//進(jìn)程的狀態(tài)標(biāo)識(shí),取值為“就緒
ready
”或“運(yùn)行run”intpriority。process*next。
//進(jìn)程優(yōu)先級(jí),0到49范圍內(nèi)的一個(gè)隨機(jī)整數(shù)。//進(jìn)程的隊(duì)列指針個(gè)人資料整理 僅限學(xué)習(xí)使用intlife。 //進(jìn)程生命周期,1到5范圍內(nèi)的一個(gè)隨機(jī)整數(shù)。voidoperator=(PCBp>//運(yùn)算符=重載{pid=p.pid。status=p.status。priority=p.priority。next=p.next。life=p.life。}}。//就緒隊(duì)列節(jié)點(diǎn)structreadyque{PCBpc。structreadyque*next。voidoperator=(readyquer> //運(yùn)算符=重載{pc=r.pc。next=r.next。}}。<二)、進(jìn)程調(diào)度類(lèi) threadmanager成員:classthreadmanager{private:boolpidarray[101]。 //“真”表示下標(biāo)對(duì)應(yīng)的進(jìn)程標(biāo)識(shí)號(hào)是空閑的,“假”表示下標(biāo)對(duì)應(yīng)的進(jìn)程標(biāo)識(shí)號(hào)已分配給某個(gè)進(jìn)程。structreadyqueadj[50]。//鄰接表public:threadmanager(>。
//構(gòu)造函數(shù)voidrun(>。boolnewpro(>。
//運(yùn)行進(jìn)程調(diào)度程序<對(duì)外的接口)//新建一個(gè)進(jìn)程的函數(shù)voidManage_Draw(>。 //進(jìn)程調(diào)度并將進(jìn)程調(diào)度的情況顯示在屏幕上voidDrawpro(intpriority>。 //畫(huà)出優(yōu)先級(jí)比正在運(yùn)行進(jìn)程優(yōu)先級(jí)低的其他進(jìn)程個(gè)人資料整理 僅限學(xué)習(xí)使用}。六、主要功能模塊<一)、構(gòu)造函數(shù)threadmanager::threadmanager(>{inti。//初始化鄰接表for(i=0。i<50。i++>adj[i].next=NULL?!罢妗北硎鞠聵?biāo)對(duì)應(yīng)的進(jìn)程標(biāo)識(shí)號(hào)(1~100>是空閑的,“假”表示下標(biāo)對(duì)應(yīng)的進(jìn)程標(biāo)識(shí)號(hào)已分配給某個(gè)進(jìn)程。for(i=0。i<101。i++>pidarray[i]=true。 //剛開(kāi)始每個(gè)進(jìn)程標(biāo)識(shí)號(hào)都是空閑的。}<二)、運(yùn)行進(jìn)程調(diào)度程序。功能:監(jiān)聽(tīng)各個(gè)按鍵并作出相應(yīng)動(dòng)作voidthreadmanager::run(>{intc。srand((unsigned>time(NULL>>。//srand(>函數(shù)產(chǎn)生一個(gè)以當(dāng)前時(shí)間開(kāi)始的隨機(jī)種子while(1>{// cout<<"請(qǐng)輸入要進(jìn)行的操作: Ctrl+f(新建進(jìn)程> Ctrl+r(開(kāi)始調(diào)度>Ctrl+q(停止調(diào)度>"<<endl。cout<<"Pleaseinputthekeyyouwanttodo"<<endl。cout<<" Ctrl+f(new thread>, Ctrl+r(start manager>Ctrl+q(stopmanager>"<<endl。//檢查當(dāng)前是否鍵盤(pán)輸入,若有則返回一個(gè)非
0值,否則返回
0if(!_kbhit(>>{c=_getch(>。
//_getch返回的是鍵的
asciiswitch(c>{case0x6://Ctrl+f(新建進(jìn)程>srand((unsigned>time(NULL>>。//srand(>函數(shù)產(chǎn)生一個(gè)以當(dāng)前時(shí)間開(kāi)始的隨機(jī)種子個(gè)人資料整理 僅限學(xué)習(xí)使用newpro(>。break。case0x12://Ctrl+r(開(kāi)始調(diào)度>Manage_Draw(>。break。case0x11://Ctrl+q(停止調(diào)度>。}}}}//進(jìn)程調(diào)度并將進(jìn)程調(diào)度的情況顯示在屏幕上voidthreadmanager::Manage_Draw(>{readyque*rq=NULL,*tmpr=NULL 。inti,j=0。cout<<"優(yōu)先級(jí)標(biāo)識(shí)符狀態(tài)標(biāo)識(shí)生命周期"<<endl。cout<<" prioritypid statuslife"<<endl。j=1。for(i=49。i>=0。i-->//找優(yōu)先級(jí)最大的進(jìn)程來(lái)執(zhí)行{if(adj[i].next!=NULL>// 當(dāng)對(duì)應(yīng)的就緒隊(duì)列不為空時(shí){rq=adj[i].next。 //從就緒隊(duì)列取出一個(gè)進(jìn)程執(zhí)行。adj[i].next=rq->next。rq->pc.status="run"。Sleep(1500>。 //通過(guò)延時(shí)一段時(shí)間來(lái)模擬該進(jìn)程執(zhí)行一個(gè)時(shí)間片的過(guò)程.//畫(huà)優(yōu)先級(jí)cout<<" **"<<rq->pc.priority<<"**" 。//畫(huà)一次進(jìn)程的調(diào)度情況//1、畫(huà)正在運(yùn)行進(jìn)程的 PCB//設(shè)置下一個(gè)輸出文本的字體顏色:綠色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE>,FOREGROUND_INTENSITY|FOREGROUND_GREEN>。個(gè)人資料整理 僅限學(xué)習(xí)使用cout<<"--->**"<<rq->pc.pid<<"**"<<rq->pc.status<<"**"<<rq->pc.life<<"**"。//2、畫(huà)優(yōu)先級(jí)與正在運(yùn)行進(jìn)程相同的其他進(jìn)程的 PCB(如果有的話>設(shè)置下面輸出文本的字體顏色:白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE>,FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE>。tmpr=adj[i].next。while(tmpr!=NULL>//當(dāng)對(duì)應(yīng)的就緒隊(duì)列不為空時(shí){cout<<"--->**"<<tmpr->pc.pid<<"**"<<tmpr->pc.status<<"**"<<tmpr->pc.life<<"**"。tmpr=tmpr->next。j++。if(j%3==0>cout<<endl<<" "。}cout<<endl。//3、畫(huà)出優(yōu)先級(jí)比正在運(yùn)行進(jìn)程優(yōu)先級(jí)低的其他進(jìn)程Drawpro(i>。(rq->pc.priority>/=2。 //優(yōu)先級(jí)減半(rq->pc.life>-=1。 //生命周期減一//如果該運(yùn)行進(jìn)程的生命周期不為0,則重新把它變?yōu)榫途w狀態(tài),插入就緒隊(duì)列中if(rq->pc.life>0>{rq->pc.status="ready"。rq->next=adj[rq->pc.priority].next。adj[rq->pc.priority].next=rq。}else //否則將其進(jìn)程號(hào)歸還。pidarray[i]=true。break。//一次進(jìn)程調(diào)度循環(huán)結(jié)束。}//endofif}//endofforcout<<"onetimemanagerhavefinish!"<<endl<<endl。個(gè)人資料整理 僅限學(xué)習(xí)使用}//畫(huà)出優(yōu)先級(jí)比正在運(yùn)行進(jìn)程優(yōu)先級(jí)低的其他進(jìn)程voidthreadmanager::Drawpro(intpriority> //priority記錄正在運(yùn)行進(jìn)程的優(yōu)先級(jí){readyque*rq=NULL。intj。for(inti=priority-1。i>=0。i-->{rq=adj[i].next。if(rq!=NULL>{//畫(huà)優(yōu)先級(jí)cout<<" **"<<i<<"**" 。j=0。while(rq!=NULL>//當(dāng)對(duì)應(yīng)的就緒隊(duì)列不為空時(shí){cout<<"--->**"<<rq->pc.pid<<"**"<<rq->pc.status<<"**"<<rq->pc.life<<"**" 。rq=rq->next。j++。if(j%3==0>cout<<endl<<" "。}cout<<endl。}}}//新建一個(gè)進(jìn)程的函數(shù)boolthreadmanager::newpro(>{structreadyque*t=NULL。srand((unsigned>time(NULL>>。//srand(>函數(shù)產(chǎn)生一個(gè)以當(dāng)前時(shí)間開(kāi)始的隨機(jī)種子for(inti=1。i<101。i++>{if(pidarray[i]==true>//找一個(gè)空的進(jìn)程號(hào){個(gè)人資料整理 僅限學(xué)習(xí)使用t=newreadyque。t->pc.pid=i。pidarray[i]=false。//宣布該進(jìn)程號(hào)已被使用。t->pc.status="ready"。t->pc.priority=rand(>%50。//隨機(jī)產(chǎn)生優(yōu)先級(jí)
<隨機(jī)域?yàn)?~49)。t->pc.next=NULL。t->pc.life=rand(>%5+1。 //隨機(jī)產(chǎn)生生命周期 <隨機(jī)域?yàn)?~5)。t->next=adj[t->pc.priority].next。adj[t->pc.priority].next=t。//將新建的進(jìn)程的PCB插入就緒隊(duì)列returntrue。//創(chuàng)建進(jìn)程成功}}returnfalse。//找不到空的進(jìn)程號(hào),創(chuàng)建進(jìn)程失敗}七、實(shí)驗(yàn)結(jié)果及分析<一)、新建進(jìn)程連續(xù)15次按下Ctrl+F鍵后新建15個(gè)進(jìn)程:個(gè)人資料整理 僅限學(xué)習(xí)使用<二)、開(kāi)始調(diào)度每按一次Ctrl+R將進(jìn)行一次進(jìn)程調(diào)度:個(gè)人資料整理 僅限學(xué)習(xí)使用<三)、在一次進(jìn)程調(diào)度完成后按下 Ctrl+F將新建一個(gè)進(jìn)程:個(gè)人資料整理 僅限學(xué)習(xí)使用從上
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024老勞動(dòng)合同范本
- 2024新技術(shù)開(kāi)發(fā)保密責(zé)任合同書(shū)版B版
- 2025年度公共場(chǎng)所消防安全管理合同細(xì)則3篇
- 2025年度數(shù)控車(chē)床采購(gòu)合同(含刀具智能檢測(cè)技術(shù))4篇
- 2025年度特殊人群客運(yùn)服務(wù)合同書(shū)-無(wú)障礙出行服務(wù)合作協(xié)議4篇
- 2025年度智慧醫(yī)療平臺(tái)建設(shè)出資擔(dān)保協(xié)議書(shū)4篇
- 2025年企業(yè)食堂承包及員工健康餐飲服務(wù)協(xié)議4篇
- 2024銷(xiāo)售人員提成獎(jiǎng)金分配勞動(dòng)合同3篇
- 2024蘋(píng)果期貨交易與風(fēng)險(xiǎn)管理合同3篇
- 2025年度抖音平臺(tái)虛擬商品交易安全保障協(xié)議3篇
- 第二章 運(yùn)營(yíng)管理戰(zhàn)略
- 《三本白皮書(shū)》全文內(nèi)容及應(yīng)知應(yīng)會(huì)知識(shí)點(diǎn)
- 專(zhuān)題14 思想方法專(zhuān)題:線段與角計(jì)算中的思想方法壓軸題四種模型全攻略(解析版)
- 醫(yī)院外來(lái)器械及植入物管理制度(4篇)
- 圖像識(shí)別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 港口與港口工程概論
- 《念珠菌感染的治療》課件
- 個(gè)體戶店鋪?zhàn)赓U合同
- 門(mén)店裝修設(shè)計(jì)手冊(cè)
- 考研計(jì)算機(jī)學(xué)科專(zhuān)業(yè)基礎(chǔ)(408)研究生考試試卷與參考答案(2025年)
- 新概念英語(yǔ)第二冊(cè)考評(píng)試卷含答案(第49-56課)
評(píng)論
0/150
提交評(píng)論