




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上東莞理工學院操作系統課程設計報告學 院: 計算機學院 專 業 班 級: 13軟件工程1班 學號姓名評價提交時間: 2015/9/14 指導教師評閱意見:.項目名稱: 進程與線程管理功能 一、設計目的用語言來模擬進程和線程管理系統,加深對進程和線程的理解,掌握對進程和線程各種狀態和管理的算法原理。二、環境條件系統: WindowsXP、VMWare、Ubuntu Linux語言:C/C+開發工具:gcc/g+、Visual C+ 6.0三、設計內容1. 項目背景計算機的硬件資源有限,為了提高內存的利用率和系統的吞吐量,就要根據某種算法來管理進程和線程的狀態從而達到目的。
2、進程與線程管理功能完成基于優先級的搶占式線程調度功能,完成進程虛擬內存管理功能。進程與線程管理功能基本要求:完成基于優先級的搶占式線程調度功能,完成進程虛擬內存管理功能。提高要求:(增加1項就予以加分)(1) 實現多種線程調度算法;(2)通過“公共信箱”進行通信的機制,規定每一封信的大小為128字節,實現兩個用戶進程之間通過這個“公共信箱”進行通信。(3) 實現多用戶進程并發的虛擬內存管理功能。(4) 實現用戶進程間通信功能,并用生產者/消費者問題測試進程間通信功能的正確性。(5) 實現改進型Clock頁面置換算法。(6) 實現Cache功能,采用FIFO替換算法。2. 擴展內容實現多種線程調
3、度算法:時間片輪轉調度算法4、 人員分工優先級調度算法:鐘德新,莫友芝時間片輪轉調度算法:張德華,袁馬龍設計報告由小組隊員共同完成。小組成員設計的代碼分工如下:鐘德新編寫的代碼:void Prinft()PCB *p;system(cls);/清屏p=run;/運行隊列if(p!=NULL)p-next=NULL;cout當前正在運行的進程:endl;cout進程名稱t優先數t還需要時間t已運行時間t狀態:endl;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout當前的就緒隊列:en
4、dl; cout進程名稱t優先數t還需要時間t已運行時間t狀態:endl;p=ready;/就緒隊列while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout當前已經完成的進程:endl;/終止隊列cout進程名稱t優先數t還需要時間t已運行時間t狀態:endl; p=finish;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext; 這個函數是優先級調度算法程序的界面函數,主要為程序運行時能夠直觀的顯示結果void i
5、nsert(PCB *p)PCB *S1,*S2;if(ready=NULL)/判斷隊列是否為空p-next = NULL;ready = p;/插入就緒隊列elseS1 = ready;S2 = S1;while(S1!=NULL)if(S1-pri = p-pri)/判斷優先級大小S2 = S1;/置換位置S1 = S1-next; elsebreak;/跳出循環if(S2-pri = p-pri)S2-next = p;p-next = S1;elsep-next = ready;ready = p;這是程序優先級排序的函數,也是優先級調度算法的核心思想函數,對程序的優先級通過指針進行排
6、序,再將隊首的程序調入運行隊列,通過置換的方法,將運行隊列隊首即占用CPU的程序調入就緒隊列,如此循環直至所有程序終止為止。莫友芝編寫的代碼:void priority()run = ready;ready = ready-next;run-state = 運行;while(run!=NULL) /*當運行隊列不空時,有進程正在運行*/Dtime(3);/調用延時函數,延時3秒run-runtime=run-runtime+1;/運行時間+1run-needOftime=run-needOftime-1;/完成需要時間-1run-pri=run-pri-1; /*/優先級-1每運行一次優先數降
7、低1個單位*/if(run-needOftime=0) /*如所需時間為0將其插入完成隊列*/run-state = 完成;run-next = finish;finish = run;run=NULL; /*運行隊列頭指針為空*/if(ready!=NULL) /*如就緒隊列不空*/run = ready;run-state = 運行;ready = ready-next;else if(ready!=NULL)&(run-pri pri)/就緒隊列不為空,就緒隊列隊首優先級大于運行隊列隊首run-state=就緒;insert(run);/運行中的進程重新比較優先級大小run = read
8、y;/對隊列隊首的進程調入CPUrun-state = 運行; ready = ready-next; Prinft(); /*輸出進程PCB信息*/ 這是程序運行時的實時程序,通過循環的方法在程序等候3秒后,調用德新設計的優先級排序算法,進行排序。void CTProcessOfPri()/創建進程 PCB * Node; string c5=P1,P2,P3,P4,P5;/模擬設計5條進程srand(int)time(0);/設置隨機種子for(int j = 0;j procname=cj;/為進程名賦值Node-needOftime=1+(int)(15.0*rand()/(RAND_
9、MAX+1.0);/為進程隨機分配占用CPU時間.Node-runtime = 0;/為運行時間賦值Node-state =就緒;/設置初始狀態為“就緒”狀態Node-pri =1+(int)(20.0*rand()/(RAND_MAX+1.0);/為進程隨機分配優先數. insert(Node);/出入就行隊列 隨機創建5個模擬程序,為其賦上初值后,調用優先級排序函數,進行第一次排序張德華編寫的程序代碼: void insert(PCB *p)/時間片插入函數 if(start-next=NULL) PCB *q=start; if(p-Arrive_timeArrive_time) sta
10、rt=p; p-next=q; q-next=NULL; end=q; else q-next=p; p-next=NULL; end=p; else PCB *q=start; PCB *s=start-next; while(s!=NULL) if(q-Arrive_time p-Arrive_time) p-next=q; start=p; return; else if(s-Arrive_time p-Arrive_time) q-next=p; p-next=s; return; else q=q-next; s=s-next; s-next=p; end=p; 這個是時間片插入函數
11、,也是輪轉調度模擬程序的核心函數,首先對到達時間進行排序,將隊首調入CPU后,運行時間片的時間后,調入就緒隊列隊尾,等候下一次的資源.void firstin()/將就緒隊列的第一個進程放入運行隊列run=start; run-State=W;/改變其狀態start=start-next; 模擬占用CPU的函數void show(PCB *p)/輸出函數 cout進程名t到達時間t剩余時間t狀態n;/ if(run!=NULL)/如果運行指針不為空,就輸出當前正在運行的進程的PCBcoutnametArrive_timettNeed_timettStatenn; 這是一個程序初始值的輸出函數,
12、驗證輸入的各程序的初始值是否是預期輸入袁馬龍編寫的代碼:void create()/時間片算法創建進程函數 coutN; PCB *p; int Time_piece; start=NULL;/就緒隊列頭指針 finish=NULL;/完成隊列頭指針 run=NULL;/運行隊列指針coutTime_piece; for(int i=1;i=N;i+)/輸入進程名字和所需時間,創建進程的PCB p=(PCB *)malloc(sizeof(PCB); cout請輸入第ip-name; coutp-Need_time; coutp-Arrive_time;Cpu_time=0; p-Count=
13、0;/計數器p-State=W;/進程的初始狀態設為就緒W p-Time_piece=Time_piece;/時間片的初始值if(start!=NULL) insert(p);/若就緒隊列不為空,將其插入就緒隊列else/創建就緒隊列的第一個PCB p-next=start; start=p;/頭指針end=p;/尾指針 coutendlendlt使用時間片輪轉算法輸出結果:(W為就緒狀態,F為終止狀態)n; coutnext; run-State=W; 這是一個設置程序運行初始的條件函數,如需要運行的程序數目,程序名稱,運行時間等,在調用德華設計的排序函數進行排序,調入隊列中void rou
14、ndrobin()/時間片算法函數int m=0; while(run!=NULL) if(run-Arrive_timeCpu_time) Cpu_time=Cpu_time+1;/每運行一次cputime加一else if(m=0) cout進程nameNeed_time=run-Need_time-1;/每運行一次needtime減一if(run-Need_time!=0) show(run); Cpu_time=Cpu_time+1;/每運行一次cputime加一run-Count=run-Count+1;/每運行一次計數器count加一if(run-Need_time=0)/若運行完
15、后run-next=finish; finish=run;/將其插入完成隊列頭部run-State=F;/將其狀態改為完成態F show(run); cout進程name結束nn; run=NULL;/將運行隊列清空if(start!=NULL) firstin();/若就緒對列不空,將第一個進程投入運行cout進程nameCount=run-Time_piece)/如果時間片到run-Count=0;/計數器置0 if(start!=NULL)/若就緒隊列不空run-State=W; insert2(run);/將進程插入到就緒隊列中等待輪轉firstin();/將就緒隊列的第一個進程投入運
16、行cout進程name開始nn; cout*n; 這是一個程序運行結果的輸出函數,輸出程序的結果內容,在什么時間段完成,什么時間段到達,以及程序的狀態等信息5、 設計過程進程是進程實體的運行過程是系統進行資源分配和調度的一個獨立單位。另有一種定義方法是“程序在處理器上的執行”。為了模擬的方便,本設計采用這種定義。簡單地說,進程包括三種狀態:運行狀態、就緒狀態、完成狀態優先級調度算法:按照進程的優先級大小來調度,是高優先級進程得到優先的處理的調度策略,可使用非搶占或可搶占兩種策略用C+模擬設計一個進程模擬類class PCB public: string procname;/進程名int pri
17、;/進程優先數string state;/進程狀態int runtime;/進程已運行CPU時間int needOftime;/還需要時間PCB *next;/指針; 來記錄進程的基本信息,如進程名稱,優先級,進程狀態,進程運行時間,進程所需時間再設計模擬進程所需要的各種算法,運行調試結果時間片輪轉調度算法: 是一種最古老,最簡單,最公平且使用最廣的算法。每個進程被分配一時間段,稱作它的時間片,即該進程允許運行的時間. 如果在時間片結束時進程還在運行,則CPU將被剝奪并分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。調度程序所要做的就是維護一張就緒進程列表,當進程用完
18、它的時間片后,它被移到隊列的末尾.用C語言模擬設計一個類typedef struct node char name10; /進程名int Time_piece;/時間片int Need_time; /還需要的時間int Count;/計數器char State;/進程的狀態struct node *next;/鏈指針int Arrive_time;/到達時間 PCB;用這個類根據算法的基本思想來設計程序,模擬算法的運行情況優先級搶占式調度算法:(過程圖)時間片輪轉調度算法:(過程圖)六、運行結果優先級搶占式:時間片輪轉調度算法:七、結果分析程序的結果很好體現的進程運行的優先級處理,對于優先級高
19、的程序,采用搶占式,分配程序CPU使用,優先級較低的進入就緒隊列等待CPU資源而時間片輪轉調度算法也很好的實行預期情況,程序進入CPU運行時間片長度的時間后,調入就緒隊列隊尾,完成則進入完成隊列。隊首調入CPU,占用資源,循環直到所有程序都進入就緒隊列.八、設計總結1.設計基本實現了我們小組想要的功能和預測情況,雖然中間關于指針的使用我們做了許多的調試,但是我們還是做出來了。2.然后就是進程算法的調用過程和知識,發現自己對知識的遺忘程度有點大,邊做邊補,實驗結束的會后發現自己的知識鞏固了不少。對操作系統的了解也更加深入了。3.和隊友合作然后團隊意識有一定的提高附錄:優先級搶占式調度算法:/優先
20、級搶占式線程調度算法/#include stdlib.h #include #include #include using namespace std; int n; class PCB public: string procname;/進程名int pri;/進程優先數string state;/進程狀態int runtime;/進程已運行CPU時間int needOftime;/還需要時間PCB *next;/指針; PCB *run = NULL; /運行隊列頭指針PCB *ready = NULL;/就緒隊列頭指針PCB *finish = NULL;/完成隊列頭指針/延時函數,模擬C
21、PU占用時間/void Dtime(int t)/此代碼塊參考網上資料time_t current_time;time_t start_time;time(&start_time); dotime(& current_time);while(current_time-start_time)next=NULL;cout當前正在運行的進程:endl;cout進程名稱t優先數t還需要時間t已運行時間t狀態:endl;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout當前的就緒隊列:endl;
22、 cout進程名稱t優先數t還需要時間t已運行時間t狀態:endl;p=ready;/就緒隊列while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext;coutendlendl;cout當前已經完成的進程:endl;/終止隊列cout進程名稱t優先數t還需要時間t已運行時間t狀態:endl; p=finish;while(p!=NULL)coutprocnamettpritneedOftimettruntimettstatenext; /按優先級大小插入就緒隊列void insert(PCB *p)PCB *S1,*S2;if
23、(ready=NULL)/判斷隊列是否為空p-next = NULL;ready = p;/插入就緒隊列elseS1 = ready;S2 = S1;while(S1!=NULL)if(S1-pri = p-pri)/判斷優先級大小S2 = S1;/置換位置S1 = S1-next; elsebreak;/跳出循環if(S2-pri = p-pri)S2-next = p;p-next = S1;elsep-next = ready;ready = p;/實時運行函數/void priority()run = ready;ready = ready-next;run-state = 運行;wh
24、ile(run!=NULL) /*當運行隊列不空時,有進程正在運行*/Dtime(3);/調用延時函數,延時3秒run-runtime=run-runtime+1;/運行時間+1run-needOftime=run-needOftime-1;/完成需要時間-1run-pri=run-pri-1; /*/優先級-1每運行一次優先數降低1個單位*/if(run-needOftime=0) /*如所需時間為0將其插入完成隊列*/run-state = 完成;run-next = finish;finish = run;run=NULL; /*運行隊列頭指針為空*/if(ready!=NULL) /*
25、如就緒隊列不空*/run = ready;run-state = 運行;ready = ready-next;else if(ready!=NULL)&(run-pri pri)/就緒隊列不為空,就緒隊列隊首優先級大于運行隊列隊首run-state=就緒;insert(run);/運行中的進程重新比較優先級大小run = ready;/對隊列隊首的進程調入CPUrun-state = 運行; ready = ready-next; Prinft(); /*輸出進程PCB信息*/ void CTProcessOfPri()/創建進程 PCB * Node; string c5=P1,P2,P3,
26、P4,P5;/模擬設計5條進程srand(int)time(0);/設置隨機種子for(int j = 0;j procname=cj;/為進程名賦值Node-needOftime=1+(int)(15.0*rand()/(RAND_MAX+1.0);/為進程隨機分配占用CPU時間.Node-runtime = 0;/為運行時間賦值Node-state =就緒;/設置初始狀態為“就緒”狀態Node-pri =1+(int)(20.0*rand()/(RAND_MAX+1.0);/為進程隨機分配優先數. insert(Node);/出入就行隊列 void main() cout*endl; co
27、ut* 優先數調度算法*endl; cout*endl; cout按任意鍵開始創建進程?endl; getchar();CTProcessOfPri();/新建進程Prinft();/調用界面輸出函數coutendl; cout 按任意鍵開始運行進程模擬調度程序?next=NULL) PCB *q=start; if(p-Arrive_timeArrive_time) start=p; p-next=q; q-next=NULL; end=q; else q-next=p; p-next=NULL; end=p; else PCB *q=start; PCB *s=start-next; wh
28、ile(s!=NULL) if(q-Arrive_time p-Arrive_time) p-next=q; start=p; return; else if(s-Arrive_time p-Arrive_time) q-next=p; p-next=s; return; else q=q-next; s=s-next; s-next=p; end=p; void insert2(PCB *p) end-next=p;/將新的PCB插入在當前就緒隊列的尾end=p; p-next=NULL; void show(PCB *p)/輸出函數 cout進程名t到達時間t剩余時間t狀態n;/ if(r
29、un!=NULL)/如果運行指針不為空,就輸出當前正在運行的進程的PCBcoutnametArrive_timettNeed_timettStatenn; void create()/時間片算法創建進程函數 coutN; PCB *p; int Time_piece; start=NULL;/就緒隊列頭指針 finish=NULL;/完成隊列頭指針 run=NULL;/運行隊列指針coutTime_piece; for(int i=1;i=N;i+)/輸入進程名字和所需時間,創建進程的PCB p=(PCB *)malloc(sizeof(PCB); cout請輸入第ip-name; coutp-Need_time; coutp-Arrive_time;Cpu_time=0; p-Count=0;/計數器p-State=W;/進程的初始狀態設為就緒W p-Ti
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB23-T2945-2021-相變瀝青混合料路面設計與施工技術規范-黑龍江省
- DB23-T2878-2021-過伐林紅松大徑材單株撫育技術-黑龍江省
- DB23-T2842-2021-政務信息資源數據交換規范-黑龍江省
- 基層醫院采購管理制度
- 工具集中采購管理制度
- 工程公司工地管理制度
- 商場收銀收款管理制度
- 創業培訓教師管理制度
- 創業期間公司管理制度
- 外貿汽車采購方案(3篇)
- 2025年河北省中考乾坤押題卷物理試卷B及答案
- 2023年廣東初中學業水平考試生物試卷真題(含答案)
- 微創冠狀動脈搭橋手術方法及圍術期處理原則微創冠脈搭橋進展課件
- 住院患者出院后的隨訪與指導流程圖
- 安徽省工傷職工停工留薪期分類目錄
- 北京小升初分班考試數學試卷
- 拆線換藥評分表
- GB∕T 20394-2019 體育用人造草
- 雨水管道非開挖修復工程施工方案
- 通道縣生物多樣性調查
- 假發行業英語術語整理
評論
0/150
提交評論