




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上實驗名稱: 進程管理實驗要求: 閱讀后面的C語言實例,修改程序,使其優先數在運行期間可以變化(動態優先數)。例如,當某進程被時間片中斷次數增加到一定數目時,提高其優先權。關鍵問題: 讀懂源程序代碼,了解進程管理的方式,并設計一個算法使程序能在運行過程中修改進程優先級。設計思路: 在進程控制塊中定義一個記錄進程中斷次數的變量,在block函數中設置跟蹤并記錄進程中斷次數,在調度函數schedule中設置算法,在進程中斷3次后將該進程的優先級提升至最高。改動后的代碼:#include <stdio.h>#define TRUE 1#define FALSE 0
2、#define MAXPRI 100#define NIL -1/進程控制塊struct int id; /進程號 char status; /進程狀態,'e'-執行態 'r'-高就緒態 't'-低就緒態 'w'-等待態 'c'-完成態 int nextwr; /等待鏈指針,指示在同一信號量上等待的下一個等待進程的進程號。 int priority; /進程優先數,值越小,優先級越高。 int c;/進程中斷次數 pcb3;/共3個進程/s1、s2為三個進程共享的變量;seed為隨機值;registeri模擬寄存器
3、值,存放計算的重復次數。int registeri,s1,s2,seed,exe=NIL;/exe為當前運行(占有cpu)的進程號/2個信號量sem0、sem1,分別與共享變量s1、s2相聯系。/對應信號量sem0、sem1分別有兩個阻塞隊列,隊列首由sem.firstwr指定,隊列鏈指針是pcb.nextwrstruct int value;/信號量值 int firstwr;/等待該信號量的阻塞隊列的首個進程號sem2;/三個進程的現場保留區,其中savearea0為寄存器內容,savearea1為下一條指令地址。char savearea34;char addr;/當前執行程序的當前指針
4、void main();void init();float random();int timeint(char ad);int scheduler();int find();int p(int se,char ad);void block(int se);int v(int se,char ad);void wakeup(int se);void process1();void process2();void process3();void eexit(int n);/-/主程序void main() int currentProcess; printf("進程管理器n")
5、; init(); printf("s1=%d,s2=%dn",s1,s2); printf("進程1、進程2、進程3已經準備好!n"); for (;) currentProcess=scheduler(); /進程調度,選擇優先級別最高的就緒進程運行。if (currentProcess=NIL) break; /所有進程已經運行完畢,結束。switch (currentProcess) /運行當前進程代碼 case 0: process1(); break; case 1: process2(); break; case 2: process3()
6、; break; default: printf("進程號出錯!n"); break; printf("最后結果:s1=%d,s2=%dn",s1,s2);/-/初始化void init() int i,j; s1=0;s2=0; /生成進程控制塊 for (j=0;j<3;j+) pcbj.id=j; /進程號 pcbj.status='r' /進程初始狀態為高就緒狀態 pcbj.nextwr=NIL; printf("n進程 %d 的優先數?",j+1); scanf("%d",&
7、i); pcbj.priority=i; /進程優先級 pcbj.c=0; /初始化兩個信號量 sem0.value=1;/與s1相聯系 sem0.firstwr=NIL; sem1.value=1;/與s2相聯系 sem1.firstwr=NIL; /初始化現場保留區。每個進程均有現場保留區。 for (i=1;i<3;i+) for (j=0;j<4;j+)saveareaij='0' /end of init()/-/生成01之間隨機值float random() int m; if (seed<0) m=-seed; else m=seed; seed
8、=(25173*seed+13849)%65536; return (m/32767.0);/-/檢測當前進程的時間片是否已到。未到,返回FALSE,否則返回TRUE。系統采用分時執行,/規定每個進程的執行概率為33%,用產生數x模擬時間片。/ad為程序的當前語句地址。int timeint(char ad) float x; x=random(); if (x<0.33)&&(exe=0) return (FALSE);/當前進程為進程1,時間片未到。 if (x>=0.33)&&(x<0.66)&&(exe=1) retur
9、n (FALSE);/當前進程為進程2,時間片未到。 if (x>=0.66)&&(x<1)&&(exe=2) return (FALSE);/當前進程為進程3,時間片未到。 /時間片已到處理:置正在執行進程狀態為低就緒,處理器空閑。 saveareaexe0=registeri;/保存通用寄存器內容 saveareaexe1=ad;/保存程序指針 pcbexe.status='t'/狀態改為低就緒態 printf("時間片中斷 ,進程%d轉入就緒態n",exe+1); exe=NIL; return (TRUE)
10、;/-/進程調度:選擇一個進程投入運行。返回當前進程的進程號。int scheduler() int pd; /選擇投入運行的進程pd if (pd=find()=NIL && exe=NIL) return (NIL);/無進程可運行,將結束。 if (pd!=NIL) if (exe=NIL) /選中了進程且處理器空閑,則投入運行。 pcbpd.status='e' exe=pd; printf("進程%d正在執行n",exe+1); else if (pcbpd.priority<pcbexe.priority)/選中進程的優選級
11、別高于當前進程 /將當前進程轉入高就緒狀態 pcbexe.status='r' printf("進程%d進入就緒狀態n",exe+1);/選中進程pd投入執行 pcbpd.status='e' exe=pd; printf("進程%d正在執行n",exe+1); /恢復進程現場 registeri=saveareaexe0;/恢復當前進程的寄存器。 addr=saveareaexe1;/恢復執行進程的程序指針/修改優先權 if(pcbpd.c=3) pcbpd.c=0; pcbpd.priority=0; printf(&
12、quot;n!進程%d中斷次數達到3,優先級提高n",pd+1); return (exe);/返回當前進程的進程號/-/在3個進程中按就緒狀態及其優先數選出進程。返回選出的進程號。int find() int j,pd=NIL,w=MAXPRI; for (j=0;j<3;j+) /選擇高就緒狀態優先級最高的進程 if (pcbj.status='r') && (pcbj.priority<w) w=pcbj.priority;pd=j; if (pd=NIL) /沒有高就緒狀態的進程,尋找低就緒狀態的進程。 for (j=0;j<
13、3;j+) if (pcbj.status='t') && (pcbj.priority<w) w=pcbj.priority; pd=j; return (pd);/-/P操作,申請資源。若申請se號資源成功,返回FALSE,若失敗,把當前進程掛入se號資源的阻塞隊列,/讓出cpu,返回TRUE./se為資源號,ad為程序當前指令的地址。int p(int se,char ad) if (-semse.value>=0) return (FALSE);/資源申請成功 /資源申請失敗處理: block(se);/把當前進程掛入se號資源的阻塞隊列 s
14、aveareaexe0=registeri;/保存當前進程的寄存器內容 saveareaexe1=ad;/保存當前進程的下一條指令地址 exe=NIL;/讓出CPU return (TRUE);/資源申請失敗/-/把當前進程阻塞,并掛到資源se的阻塞隊列。void block(int se) int w; int i; i=(se=0)?1:2; printf("進程%d申請s%i時被阻塞n",exe+1,i); pcbexe.status='w'/當前進程被阻塞 pcbexe.c+; printf("進程%d中斷次數+1,當前為%dn"
15、,exe+1,pcbexe.c); pcbexe.nextwr=NIL; if (w=semse.firstwr)=NIL)/se資源的阻塞隊列空,w為隊列的首個進程號。 semse.firstwr=exe;/當前進程為阻塞隊列第一個進程 else while(pcbw.nextwr!=NIL)/尋找隊列的最后一個進程w w=pcbw.nextwr; pcbw.nextwr=exe;/將阻塞進程掛到隊列尾部 /-/V操作,釋放資源se。若無進程等待se資源,返回FALSE;若有進程等待se資源,將該等待進程置為高就緒狀態,/保存當前進程現場,返回TRUE(將引起重新調度)./se為資源號,ad
16、為當前指令的地址。int v(int se,char ad) if (+semse.value>0) return (FALSE);/釋放資源后,無等待該資源的進程,返回。 /有進程在等待該資源,則喚醒它。 wakeup(se);/喚醒等待資源se的進程。 /保存當前進程(執行態)的現場,因為后面將引起處理器重新調度。 saveareaexe0=registeri;/保存寄存器 saveareaexe1=ad;/保存指令指針 return (TRUE);/-/將等待se資源的首個進程置為高就緒狀態(喚醒)void wakeup(int se) int w; int i; i=(se=0)
17、?1:2; w=semse.firstwr;/取資源se阻塞隊列的首個進程w if (w!=NIL) semse.firstwr=pcbw.nextwr;/調整阻塞隊列首指針 pcbw.status='r'/將w進程置為高就緒態 printf("進程%d被喚醒,得到資源s%dn",w+1,i); /-/進程1的程序代碼,完成5次的重復計算:s1=s1+1;s2=s2+1;/該程序退出后將進行重新調度。void process1() /根據當前當前指令地址跳轉 if (addr='a') goto a1; if (addr='b'
18、;) goto b1; if (addr='c') goto c1; if (addr='d') goto d1; if (addr='e') goto e1; if (addr='f') goto f1; /該程序的首次執行 for (registeri=1;registeri<6;registeri+) /程序執行s1=s1+1計算: if (p(0,'a') /申請s1對應信號量sem0。若申請失敗 ,則當前進程被阻塞,'a'為中斷地址,即下次恢復執行時地址。break;/退出。當前進程
19、被阻塞。 /可以使用s1,但要檢查時間片是否到限。a1: printf("進程1得到s1,正在臨界區1n");if (timeint('b') /檢查該進程的時間片是否到。若到,阻塞進程,'b'為中斷地址。break;/退出,重新調度。/完成計算b1: printf("s1=%dn",+s1); /s1=s1+1 if (v(0,'c') /釋放信號量sem0。如有等待該信號量的進程,則退出。c為中斷地址。break; /退出。重新調度。/程序執行s2=s2+1計算:c1: if (p(1,'d
20、39;) /申請s2對應信號量。如申請失敗 ,則當前進程被阻塞。break;/退出。當前進程阻塞。 /可以使用s2.d1: printf("進程1得到s2,正在臨界區2n");if (timeint('e') /檢查進程1的時間片是否到限。break; /時間片到限,退出。重新調度。 /使用s2e1: printf("s2=%dn",+s2); /s2=s2+1 if (v(1,'f') /釋放信號量break; /有進程等待該信號量,退出。重新調度。f1: printf("進程1循環計算次數=%dn"
21、,registeri); /for循環 if (registeri<6) return; /計算任務未完成 eexit(0);/任務完成。結束進程1。/-/進程2的程序代碼,完成5次的重復計算:s2=s2+1;s1=s1+1;void process2() if (addr='a') goto a2; if (addr='b') goto b2; if (addr='c') goto c2; if (addr='d') goto d2; if (addr='e') goto e2; if (addr='
22、;f') goto f2; /從這里開始執行 for (registeri=1;registeri<6;registeri+) /進程執行s2=s2+1計算:if (p(1,'a') /申請s2對應信號量。若失敗 ,當前進程被阻塞。break;/退出。重新調度。 /可以使用s2a2: printf("進程2得到s2,正在臨界區2n");if (timeint('b') /檢查進程的時間片是否到限break;/ 時間片到,退出。重新調度。b2: printf("s2=%dn",+s2); /計算s2=s2+1
23、if (v(1,'c') /釋放信號量。break; /有進程正在等待該信號量,退出,重新調度。/進程執行s1=s1+1計算:c2: if (p(0,'d') /申請s1對應信號量。若失敗,進程被阻塞。break;/進程阻塞,退出,重新調度。 /可以使用s1d2: printf("進程2得到s1,正在臨界區1n");if (timeint('e') /檢查進程的時間片是否到。若到,阻塞進程。break; /時間片到,退出,重新調度。e2: printf("s1=%dn",+s1); / 計算s1=s1+1 if (v(0,'f') /釋放信號量。break; /有進程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 校園安保內務管理制度
- 校園戲曲社團管理制度
- 校園欺凌日常管理制度
- 校園禁煙工作管理制度
- 校園配電設施管理制度
- 校園防爆器材管理制度
- 2024年竹藤家具項目資金申請報告代可行性研究報告
- 2024年鉑電阻資金需求報告代可行性研究報告
- 商務英語綜合教程(第3版 第二冊)Unit 3 參考答案
- 新型農村合作生產經營協議書
- 2025年高考化學湖北卷試題真題解讀及復習備考指導(精校打印)
- 2025年連云港市中考數學試題卷(含答案)
- CJ/T 358-2019非開挖工程用聚乙烯管
- 理論聯系實際闡述文化在社會發展中具有什么樣的作用?參考答案四
- 四川雅安天立學校2025年七下數學期末預測試題含解析
- 電子元器件品質協議書
- 破產拍賣協議書
- 駕校退款協議書
- 2025年中國石油套管油管市場現狀分析及前景預測報告
- 《課件的責任與擔當》
- 2025-2030中國造紙行業市場前景趨勢及競爭格局與投資研究報告
評論
0/150
提交評論