進程管理實驗_第1頁
進程管理實驗_第2頁
進程管理實驗_第3頁
進程管理實驗_第4頁
進程管理實驗_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、進程管理實驗 本系統(tǒng)的同步機構采用信號量上的本系統(tǒng)的同步機構采用信號量上的P、V操作的機制;控制機操作的機制;控制機構包括:構包括: (1)阻塞和喚醒操作;阻塞和喚醒操作; (2)時間片中斷處理程序模擬時間片中斷;時間片中斷處理程序模擬時間片中斷; (3)進程調度程序負責為各進程分配處理機。進程調度程序負責為各進程分配處理機。 系統(tǒng)中涉及了系統(tǒng)中涉及了3個并發(fā)進程。它們之間的關系是:個并發(fā)進程。它們之間的關系是: (1) 3個進程需要互斥使用臨界資源個進程需要互斥使用臨界資源S2。 (2)進程進程12又需互斥使用臨界資源又需互斥使用臨界資源S1 本系統(tǒng)在運行過程中隨機打印出各進程的狀態(tài)變換過程

2、,系統(tǒng)本系統(tǒng)在運行過程中隨機打印出各進程的狀態(tài)變換過程,系統(tǒng)的調度過程及公共變量的變化情況。的調度過程及公共變量的變化情況。題目題目系統(tǒng)為進程設置了系統(tǒng)為進程設置了5種運行狀態(tài):種運行狀態(tài): e執(zhí)行態(tài);執(zhí)行態(tài);r高就緒態(tài);高就緒態(tài);t低就緒態(tài)(執(zhí)行進程因時間低就緒態(tài)(執(zhí)行進程因時間片到限而轉入);片到限而轉入);w等待態(tài);等待態(tài);c完成態(tài)。各進程的初始完成態(tài)。各進程的初始狀態(tài)均設置為狀態(tài)均設置為r. 系統(tǒng)分時執(zhí)行各進程,并規(guī)定系統(tǒng)分時執(zhí)行各進程,并規(guī)定3個進程的執(zhí)行概率均為個進程的執(zhí)行概率均為33。通過產生隨機數。通過產生隨機數x來模擬時間片。當進程來模擬時間片。當進程process1訪問隨訪

3、問隨機數機數x時,若時,若x=0.33;當進程;當進程process2訪問訪問x時,若時,若x=0.66;當進程當進程process3訪問訪問x時,若時,若x0.66,則分別認為,則分別認為各進程的執(zhí)行時間片到限,產生各進程的執(zhí)行時間片到限,產生“時間片中斷時間片中斷”而轉入低就而轉入低就緒態(tài)緒態(tài)t?;舅悸坊舅悸?進程調度算法采用剝奪式最高優(yōu)先數法。各進程的優(yōu)先數通過進程調度算法采用剝奪式最高優(yōu)先數法。各進程的優(yōu)先數通過鍵盤輸入予以靜態(tài)設置。調度程序每次總是選擇優(yōu)先數最?。▋?yōu)鍵盤輸入予以靜態(tài)設置。調度程序每次總是選擇優(yōu)先數最?。▋?yōu)先權最高)的就緒進程投入執(zhí)行。先從先權最高)的就緒進程投入執(zhí)

4、行。先從r狀態(tài)進程中選擇,再從狀態(tài)進程中選擇,再從t狀態(tài)進程中選擇。當現行進程喚醒某個等待進程,且被喚醒進程狀態(tài)進程中選擇。當現行進程喚醒某個等待進程,且被喚醒進程的優(yōu)先數小于現行進程時,則剝奪現行進程的執(zhí)行權。的優(yōu)先數小于現行進程時,則剝奪現行進程的執(zhí)行權。 各進程在使用臨界資源各進程在使用臨界資源S1和和S2時,通過調用信號量時,通過調用信號量sem1和和sem2上的上的P、V操作來實現同步。阻塞和喚醒操作負責完成操作來實現同步。阻塞和喚醒操作負責完成從進程的執(zhí)行態(tài)到等待態(tài)以及從等待態(tài)到就緒態(tài)的轉換。從進程的執(zhí)行態(tài)到等待態(tài)以及從等待態(tài)到就緒態(tài)的轉換。 系統(tǒng)啟動后,在完成必要的系統(tǒng)初始化后便

5、執(zhí)行進程調度程系統(tǒng)啟動后,在完成必要的系統(tǒng)初始化后便執(zhí)行進程調度程序。當執(zhí)行進程因序。當執(zhí)行進程因“時間片中斷時間片中斷”,或被排斥使用臨界資源,或,或被排斥使用臨界資源,或喚醒某個進程時,立即進行進程調度。當喚醒某個進程時,立即進行進程調度。當3個進程都處于完成狀個進程都處于完成狀態(tài)后,系統(tǒng)退出運行。態(tài)后,系統(tǒng)退出運行。 基本思路基本思路 (1)每個進程有一個進程控制塊)每個進程有一個進程控制塊PCB,內容包括:,內容包括:id進程標識號,進程標識號,id0,1,2;status進程狀態(tài),可為進程狀態(tài),可為e,r,t,w,c;priority 進程優(yōu)先數;進程優(yōu)先數;nextwr 等待鏈指針

6、,指示在同一信號量上等待的下一等待鏈指針,指示在同一信號量上等待的下一個進程的標識號。個進程的標識號。 (2)信號量)信號量semaphore,對應于臨界資源,對應于臨界資源S1和和S2分別有分別有sem1和和sem2,均為互斥信號量,內容包括:,均為互斥信號量,內容包括: value 信號量,初值為信號量,初值為1; firstwr 等待鏈首指針,指示在同一信號量上等待的下一個等待鏈首指針,指示在同一信號量上等待的下一個進程的標識數。進程的標識數。數據結構數據結構 (3)現場保留區(qū),用數組)現場保留區(qū),用數組savearea34表示。即每個進程表示。即每個進程都有一個大小為都有一個大小為4個

7、單元的保留區(qū),用來保存被個單元的保留區(qū),用來保存被“中斷中斷”時時的現場信息,如通用寄存器的內容和斷點地址等。的現場信息,如通用寄存器的內容和斷點地址等。 此外,系統(tǒng)中還用到下列主要全程變量:此外,系統(tǒng)中還用到下列主要全程變量: exe執(zhí)行進程指針,其值為進程標識號;執(zhí)行進程指針,其值為進程標識號; i用來模擬一個通用寄存器;用來模擬一個通用寄存器; addr用來模擬程序計數器;用來模擬程序計數器; s1,s2兩個公共變量,用作共享臨界資源兩個公共變量,用作共享臨界資源 數據結構數據結構const MAXPRI=100; NIL=-1;TYPE procp=record PCB類型類型 id:

8、integer; status:char; 進程號進程號,進程狀態(tài)進程狀態(tài) nextwr:integer; mess:message; 等待號等待號,消息隊指針消息隊指針 inum:integer; addr:char; 運行次數運行次數,返回地址返回地址 priority:integer; end; 優(yōu)先數優(yōu)先數 message=messagetp; 指向消息塊指針類型指向消息塊指針類型 messagetp=record 消息塊類型消息塊類型(信息信息,指針指針,發(fā)送者號發(fā)送者號) num:integer; next:message; pro:integer; end; semaphorel

9、=record 信號量類型信號量類型(信號量信號量,等待隊頭號等待隊頭號) value:integer; firstwr:integer; end;VAR pcb:array1.3 of procb; PCB表表 sem:array1.2 of semaphorel; 信號量表信號量表 addr:char; i,seed,exe:integer; 當前進程地址當前進程地址,運行次數運行次數,隨機變量隨機變量,當前運行進程號當前運行進程號program processc(input,output);var q,p:message; 工作指針工作指針 begin new(p); p.num:=sn

10、um; 申請消息塊申請消息塊,寫入緩沖寫入緩沖 p.next:=NIL; :=sender; 下一指針置空下一指針置空,置發(fā)送者置發(fā)送者 writeln(send message to process ,receiver); writeln(process ,sender,already run ,snum, times); q:=pcbreceiver.mess; q指向接收者消息等待隊列首指向接收者消息等待隊列首 if(q=NIL) then pcbreceiver.mess:=p q空則空則p插入隊首插入隊首 else begin while(q.nextNIL) do q:=

11、q.next; q移到隊尾移到隊尾 q.next:=p; 將將p鏈接到隊尾鏈接到隊尾 end; end;proc send(sender, receiver, snum:integer); 發(fā)送發(fā)送var p,q:message; 工作指針工作指針begin p:=pcbreceiver.mess; p指向接收者消息等待隊列首指向接收者消息等待隊列首 while(pNIL) do begin 顯示發(fā)送者和接收者信息顯示發(fā)送者和接收者信息 writeln(receive message from process ,); writeln(process ,,is already

12、 run, p.num,times); q=p; 陸續(xù)將接收過的的消息塊刪除并釋放陸續(xù)將接收過的的消息塊刪除并釋放 p:=p.next; dispose(q) end; pcbreceiver.mess:=NIL; 接收完后消息等待隊列置空接收完后消息等待隊列置空end; proce receive(receiver:integer); 接收接收var j:integer;begin for j:=1 to 3 do 初始化各進程控制塊初始化各進程控制塊 begin pcbj.id:=j; pcbj.status:=r; 進程號進程號,進程狀態(tài)進程狀態(tài) pcbj.nextwr:=NIL; pc

13、bj.mess:=NIL; 等待等待,消息指針消息指針 write(process, j,priority?); readln(pcbj.priority); 讀入優(yōu)先數讀入優(yōu)先數 pcbj.inum:=0; pcbj.addr:=0; 運行次數運行次數, 地址地址 end; sem1.value:=1; sem1.firstwr:=NIL; 對信號量初始化對信號量初始化 sem2.value:=1; sem2.firstwr:=NIL; exe:=NIL; 當前執(zhí)行進程號置為空當前執(zhí)行進程號置為空end;proce init; 初始化初始化func random:real; proc eex

14、it(n:integer);func random:real; 產生產生01之間的隨機數之間的隨機數var m:integer; begin seed為為integer 型型,實際值在實際值在-32768到到32767之間之間 if seed0 then m:=-seed else m:=-seed; seed:=(25171*seed+13841) mod 65536; random:=m/32767.0 end;proce eexit(n:integer); 退出退出 begin pcbn.status:=c; 本進程置為完成態(tài)本進程置為完成態(tài) writeln(process,n,is c

15、ompleted !); exe:=NIL; 當前執(zhí)行進程號置空當前執(zhí)行進程號置空 end;func find:integer; 選進程選進程 var j, pd, w: integer;begin pd:=NIL; W:=MAXPRI; for j:=1 to 3 do 先在高就緒態(tài)中找優(yōu)先數最小的進程先在高就緒態(tài)中找優(yōu)先數最小的進程 if pcbj.status=r then if pcbj.priorityw then begin w:=pcbj.priority; pd:=j end; if pd=NIL then for j:=1 to 3 do 再在低就緒態(tài)中找優(yōu)先數最小的進程再在

16、低就緒態(tài)中找優(yōu)先數最小的進程 if pcbj.status=t then if pcbj.priorityw then begin w:=pcbj.priority; pd:=j end; find:=pd 返回進程號返回進程號end;func scheduler:integer; 調度調度 var pd:integer;begin pd:=find; 找優(yōu)先進程找優(yōu)先進程 if (pdNIL) or (exeNIL) then begin if pdNIL then 若有就緒進程則若有就緒進程則 if exe=NIL then 若無當前執(zhí)行進程則若無當前執(zhí)行進程則 begin pcbpd.s

17、tatus:=e; exe:=pd; 新進程置執(zhí)行態(tài)新進程置執(zhí)行態(tài) writeln(process,exe,is executing); end else if pcbpd.prioritypcbexe.priority then 切切換換 begin pcbexe.status:=r; 原執(zhí)行進程置高就緒態(tài)原執(zhí)行進程置高就緒態(tài) writeln(process,exe,enter into ready); pcbpd.status:=e; exe:=pd; 新進程置執(zhí)行態(tài)新進程置執(zhí)行態(tài) writeln(process,exe,is executing); end; i:=pcbexe.inum

18、; addr:=pcbexe.addr; 恢復現場恢復現場 end scheduler:=exe; 返回當前執(zhí)行進程號返回當前執(zhí)行進程號end; proce block三三; 阻塞阻塞 proce wakeup三三; 喚醒喚醒proce block(se:integer); var w:integer; 工作指針工作指針begin writeln(process,exe,is block); pcbexe.status:=w; pcbexe.nextwr=NIL; 置阻塞態(tài)置阻塞態(tài) w:=semse.firstwr; 信號量等待隊列頭指針賦給信號量等待隊列頭指針賦給w if w=NIL the

19、n semse.firstwr:=exe 空則當前進程作隊頭空則當前進程作隊頭 else begin while(pcbw.nextwrNIL) do w:=pcbw.nextwr; 指針后推到隊尾指針后推到隊尾 pcbw.nextwr:=exe 當前進程鏈接到隊尾當前進程鏈接到隊尾 end;end;proce wakeup(se:integer); var w:integer; begin w:=semse.firstwr; 隊列頭指針賦給隊列頭指針賦給w if wNIL then begin 非空則摘下首塊非空則摘下首塊 semse.firstwr:=pcbw.nextwr; 重鏈接重鏈接

20、 pcbw.status:=r; 置為高就緒態(tài)置為高就緒態(tài) writeln(process,exe,is wakeup); end; end;func p( ); func v( ); funct p(se:integer;ad:char):boolean; wait操作操作 begin semse.value:=semse.value-1; 信號量減信號量減1 if semse.value=0 then p:=false 有資源不等有資源不等待待 else begin block(se); 阻塞到阻塞到 se 等待隊列等待隊列 pcbexe.inum:=i; pcbexe.addr:=ad;

21、 保護現場保護現場 exe:=NIL; p:=true 執(zhí)行進程置空執(zhí)行進程置空,等待標志置真等待標志置真 end; end;function v(se:integer;ad:char):boolean; signal操作操作 begin semse.value:=semse.value+1; 信號量加信號量加1 if semse.value0 then v:=false 無等待不重新調無等待不重新調度度 else begin wakeup(se); 有等待喚醒有等待喚醒 se 等待隊列的進程等待隊列的進程 pcbexe.inum:=i; pcbexe.addr:=ad; 保護現場保護現場 v

22、:=true 要重新調度要重新調度 end;end;function timeint(ad:char):boolean; 模擬時間片中斷模擬時間片中斷var x:real;begin x:=rendom; x為為01之間的隨機數之間的隨機數 if (x=0.67)and(exe=3) or (x0.33)and(x0.67)and(exe=2) then timeint:=false 若在各自的時間片不產生中斷若在各自的時間片不產生中斷 else begin 否則產生時間片中斷否則產生時間片中斷 pcbexe.inum:=i; pcbexe.addr:=ad; 保護現場保護現場 pcbexe.

23、status:=t; 置為低就緒態(tài)置為低就緒態(tài) writeln(Times silce interrupt.); writeln(process,exe,enter into ready); exe:=NIL; 執(zhí)行進程置空執(zhí)行進程置空 timeint:=true 中斷標志置真中斷標志置真 end; end; procedure process1(var s1,s2:integer); 模擬并發(fā)進程模擬并發(fā)進程1label a1,b1,c1,d1,e1,f1,stop1;begin if addr=a then goto a1; if addr=b then goto b1; if addr=

24、c then goto c1; if addr=d then goto d1; if addr=e then goto e1; if addr=f then goto f1; while(i=5) then eexit(1); 5次循環(huán)后本進程結束次循環(huán)后本進程結束end; writeln(process1 calls p on sem1); if p(1,a) then goto stop1; 對信號量對信號量1進行進行P操作返回操作返回a地址地址a1: writeln(process1 is execution on its cretical section 1.);入臨界區(qū)入臨界區(qū) if

25、 timeint(b) then goto stop1; 若時間片到則重新調度若時間片到則重新調度b1: s1:=s1+1; writeln(s1=,s1); s1是臨界資源不是信號量是臨界資源不是信號量 writeln(process1 calls v on sem1 and quit cretical section 1); if v(1,c) then goto stop1; 對信號量對信號量1進行進行V操作操作,出臨界區(qū)出臨界區(qū)c1: writeln(process1 calls p on sem2); if p(2,d) then goto stop1; 對信號量對信號量2進行進行P

26、操作返回操作返回d地址地址d1: writeln(process1 is execution on its cretical section 2.); if timeint(e) then goto stop1;e1: s2:=s2+1; writeln(s2=,s2); s2是臨界資源不是信號量是臨界資源不是信號量 writeln(process1 calls v on sem1 and quit cretical section 2.); if v(2,f) then goto stop1; 對信號量對信號量2進行進行V操作操作,出臨界區(qū)出臨界區(qū)f1: writeln(process1 cyclen count=, i+1); i:=i+1; send(1,2,i); send(1,3,i); readln; 循環(huán)次數加循環(huán)次數加1,發(fā)消息發(fā)消息procedure process2(var s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論