操作系統(tǒng)課程設(shè)計--進程通信與進程同步機制實踐_第1頁
已閱讀1頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《操作系統(tǒng)》課程設(shè)計</p><p>  題目:進程通信與進程同步機制實踐</p><p>  學院名稱: 計算機科學與通信工程學院 </p><p><b>  班級學號: </b></p><p><b>  學生姓名: </b></p>&l

2、t;p>  教師姓名: </p><p>  教師職稱: </p><p>  2016年 1 月8日</p><p><b>  目錄</b></p><p><b>  一 課程設(shè)計內(nèi)容</b></p><p>&

3、lt;b>  二 開發(fā)環(huán)境</b></p><p><b>  二 原理</b></p><p>  五 主要數(shù)據(jù)結(jié)構(gòu)和流程</p><p>  六 原語對應(yīng)的函數(shù)及算法</p><p><b>  七 測試結(jié)果與分析</b></p><p><b&g

4、t;  八 總結(jié)</b></p><p><b>  九 源程序清單</b></p><p><b>  一課程設(shè)計的內(nèi)容</b></p><p><b>  【設(shè)計內(nèi)容】</b></p><p>  某銀行提供6個服務(wù)窗口(3個對私服務(wù)窗口,2個對公服務(wù)窗口,1個

5、理財服務(wù)窗口、一臺取號機和20個供顧客等待的座位。顧客到達銀行時,若有空座位,則到取號機上領(lǐng)取一個號,等待叫號;若沒有空座位,則在門外等待或離開。取號機每次僅允許一位顧客使用,有對公、對私和理財三類號,每位顧客只能選取其中一個。當營業(yè)員空閑時,通過叫號選取一位顧客,并為其服務(wù)。</p><p><b>  【說明】</b></p><p>  (1)可模擬設(shè)立一個服務(wù)

6、時間區(qū)間如9:00-17:00,也可限定最大服務(wù)人數(shù);</p><p>  (2)顧客達到時間隨機,辦理對私、對公、理財業(yè)務(wù)隨機,每位顧客服務(wù)時間可設(shè)定在一定范圍內(nèi)。這些都可通過隨機數(shù)產(chǎn)生。</p><p>  (3)取號時顧客拿到的號含有號碼和等待的人數(shù),例如A、B、C分別代表對私、對公、理財,“號碼:A05,有2人等待”表示取的是對私服務(wù)號,編號是05,有2人等待辦理對私業(yè)務(wù)。<

7、/p><p>  (4)成績評定:平時占60%,實驗報告占40%;其中平時60%包括考勤和學習態(tài)度、學習積極性等占20%,兩次檢查,每次檢查各占20%。</p><p><b>  【檢查說明】</b></p><p>  第一次檢查:時間18周周三-四,檢查同步與互斥算法與API熟悉情況</p><p>  第二次檢查:時

8、間18周周五上午與晚上,檢查最終程序完成情況。</p><p><b>  【要求】</b></p><p>  說明設(shè)置哪些信號量?信號量的含義和初始值是什么?并用信號量和P、V操作寫出進程的同步算法。(注:該內(nèi)容包含在設(shè)計報告中,并在第一次檢查時檢查)</p><p>  查閱并自學進程、線程的創(chuàng)建與撤銷、信號量、P操作、V操作等相關(guān)原語的

9、系統(tǒng)調(diào)用。(注:該內(nèi)容包含在設(shè)計報告中,并在第一次檢查時檢查)</p><p>  在Linux或Windows或Unix環(huán)境下,采用系統(tǒng)調(diào)用中的進程或線程的創(chuàng)建與撤銷、信號量、P操作、V操作,編程解決上述問題,并完成調(diào)試與測試工作。(注:該內(nèi)容包含將并在第二次檢查時檢查)</p><p>  打印:(注意:由于多個進程共享一個顯示器或文件,需要互斥訪問)</p><p

10、>  各進程的初始狀態(tài)信息;</p><p><b>  中間狀態(tài)變化信息;</b></p><p><b>  最終狀態(tài)信息。</b></p><p>  例如,顧客到達時的時間狀態(tài)信息,領(lǐng)取的號碼信息,等待時間,接收服務(wù)的服務(wù)窗口信息、服務(wù)時間,離開時間等信息。</p><p><b

11、>  目的</b></p><p>  通過課程設(shè)計模擬銀行辦理業(yè)務(wù)的情景,使用pv操作實現(xiàn)互斥與同步。來進一步熟悉課堂上講授的pv操作原語,掌握進程的互斥與同步的知識。</p><p><b>  二開發(fā)環(huán)境</b></p><p>  windows操作系統(tǒng),</p><p><b>  

12、使用Java語言,</b></p><p>  在eclipse上實現(xiàn)</p><p><b>  三原理及算法</b></p><p>  1用一個線程來模擬一位客戶,客戶到來時間,離開時間,都是通過獲取系統(tǒng)的時間來體現(xiàn)。中間等待及辦理業(yè)務(wù)的時間則通過產(chǎn)生的一定范圍的隨機數(shù)對線程進行睡眠來模擬的</p><p&

13、gt;<b>  2總共分為三個類,</b></p><p>  第一個類是包括主函數(shù)的類,用來開啟程序并創(chuàng)建線程對象。</p><p>  第二個類是線程類,包括線程的定義和線程的方法run方法,在run方法內(nèi)對實現(xiàn)主要程序的功能的函數(shù)進行調(diào)用。</p><p>  第三個類,就是存儲的需要用到的主要變量,計數(shù)器,及實現(xiàn)程序功能的三個函數(shù),供

14、所有的線程公用。三個函數(shù)。</p><p>  第一個函數(shù)進行座位的檢測,有座位則進入銀行,沒有在在外等待,以及獲取此時運行該線程的名字,作為一個客戶的標識,并通告該客戶到來及此時的時間。</p><p>  第二個函數(shù)實現(xiàn)取號功能,其中包括判斷取號機是否有人使用,取號時根據(jù)隨機數(shù)產(chǎn)生三種不同的票號,同時該票號的內(nèi)容還包括票的序號和此類票號對應(yīng)的服務(wù)窗口現(xiàn)在還有多少人在等待。</p&

15、gt;<p>  第三個函數(shù)是服務(wù)功能,包括根據(jù)票號判斷此時該類窗口是否有已滿,滿了就等待,沒滿則去辦理業(yè)務(wù)。辦理業(yè)務(wù)通過產(chǎn)生隨機數(shù)對線程進行休眠,客戶離開時,通告客戶的服務(wù)時間,及離開的時間。</p><p>  四主要數(shù)據(jù)結(jié)構(gòu)和流程</p><p><b>  六個信號量</b></p><p>  一個代表大廳的座位,初值為

16、20。</p><p>  一個代表取號機,初值為1,。</p><p>  三個窗口,初值分別為3,2,1。</p><p>  一個用來實現(xiàn)對記錄大廳人數(shù)的變量的互斥操作。</p><p><b>  四個變量</b></p><p>  一個代表辦理業(yè)務(wù)的總?cè)藬?shù)。</p>&l

17、t;p>  三個分別代表三個窗口的等待人數(shù)。</p><p>  票號的格式為服務(wù)+票號+等待人數(shù)。例如A-22-3表示辦理對私服務(wù),票號為22,該窗口還有3人在等待。</p><p>  等待時間,服務(wù)時間,均是調(diào)用函數(shù)產(chǎn)生隨機數(shù)。</p><p><b>  流程圖</b></p><p>  五原語對應(yīng)函數(shù)及

18、pv算法</p><p>  創(chuàng)建線程:繼承Thread類,實現(xiàn)run方法</p><p>  信號量semaphore</p><p>  p操作:acquire</p><p>  v操作:release</p><p>  Semaphore Zcount ,Qcount,counta,countb,countc

19、,countx;</p><p>  Zcount.value=20;</p><p>  Qcount.value=1; </p><p>  Counta.value=3;</p><p>  Countb.value=2;</p><p>  Countc.value=1;</p><p>

20、;  Countx.value=1;</p><p><b>  Process{</b></p><p>  P(&zcount);{</p><p>  p(&qcount);</p><p><b>  取票</b></p><p><b> 

21、 A</b></p><p><b>  B</b></p><p><b>  C</b></p><p>  Return A或者B或者C;</p><p>  v(&qcount);</p><p><b>  If(A){</b&g

22、t;</p><p>  P(&counta);</p><p>  V(&zcount);</p><p><b>  辦理服務(wù)</b></p><p>  V(&counta);</p><p><b>  }</b></p><

23、;p>  Else if(B){</p><p>  P(&countb);</p><p>  V(&zcount);</p><p><b>  辦理服務(wù)</b></p><p>  V(&countb);</p><p><b>  }</b&g

24、t;</p><p><b>  Else{</b></p><p>  P(&countc);</p><p>  V(&zcount);</p><p><b>  辦理服務(wù)</b></p><p>  V(&countc);</p>

25、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  六測試結(jié)果與分析</b></p><p>  分析:進程的名字標志客戶。</p><

26、p>  由于線程太快,設(shè)置的休眠時間較短,所以存在同一秒級有多個用戶到達。</p><p>  服務(wù)時間為1000,2000,3000毫秒隨機。</p><p>  到來及離開都是分別獲取此時系統(tǒng)的時間。</p><p><b>  七總結(jié)</b></p><p>  經(jīng)過本次的實驗對pv操作有了更進一步的理解,從

27、更深層次了解了同步與互斥的原理及實現(xiàn)的過程。設(shè)計過程遇到了各種問題。</p><p>  在設(shè)計pv操作時由于座位加上窗口共可以存放26個人,盡管信號量設(shè)置的是20,但是需要在每一個人申請到窗口時即釋放座位。就是在釋放窗口之前。</p><p>  在設(shè)計程序時關(guān)于每個線程共享的變量以及每個線程私有的變量的問題,比如取到的號即為每個線程的私有變量。</p><p>

28、  最后經(jīng)過一周半的課程設(shè)計之后,對編程,解決問題的能力,都有了一定的提升。</p><p><b>  九 源程序清單</b></p><p><b>  第一個類</b></p><p>  package bank1;</p><p>  publicclass routine {</p

29、><p>  publicstatic common comm =new common();</p><p>  @SuppressWarnings("deprecation")</p><p>  publicstaticvoid main(String[] args) {</p><p><b>  inti;

30、</b></p><p>  for (i=1;i<=20;i++){</p><p>  client clii=new client(comm);</p><p>  clii.start();</p><p><b>  }</b></p><p><b>  }

31、</b></p><p><b>  }</b></p><p><b>  第二個類</b></p><p>  package bank1;</p><p>  import bank1.common;</p><p>  import java.util.R

32、andom;</p><p>  import java.util.concurrent.Semaphore;</p><p>  public class client extends Thread {</p><p>  private common comm;</p><p>  String result= new String();

33、</p><p>  public client(common thiscomm) {</p><p>  // TODO 自動生成的構(gòu)造函數(shù)存根</p><p>  comm=thiscomm;</p><p><b>  }</b></p><p>  public void run(){&

34、lt;/p><p>  Random ran=new Random();</p><p><b>  try {</b></p><p>  sleep((ran.nextInt(6)+1)*2000);</p><p>  } catch (InterruptedException e1) {</p><

35、;p>  // TODO 自動生成的 catch 塊</p><p>  e1.printStackTrace();</p><p><b>  }</b></p><p>  comm.sit(this.getName());</p><p>  result=comm.qu(this.getName());&l

36、t;/p><p>  comm.handle(result, this.getName());</p><p><b>  try {</b></p><p>  sleep(10);</p><p>  } catch (InterruptedException e) {</p><p>  //

37、TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>

38、  第三個類</b></p><p>  package bank1;</p><p>  import java.util.Date;</p><p>  import java.util.Random;</p><p>  import java.util.concurrent.Semaphore;</p>&l

39、t;p>  publicclass common {</p><p>  privateintzcount;</p><p>  privateintaa,bb,cc;</p><p>  Semaphore semaphore = new Semaphore(10); </p><p>  Semaphore semaphoreq =

40、 new Semaphore(1);</p><p>  Semaphore semaphorea = new Semaphore(3);</p><p>  Semaphore semaphoreb = new Semaphore(2);</p><p>  Semaphore semaphorec = new Semaphore(1);</p>&

41、lt;p>  Semaphore semaphorez = new Semaphore(1);</p><p>  Random ran1=new Random();</p><p>  public common(){</p><p><b>  zcount=1;</b></p><p><b>  

42、aa=-3;</b></p><p><b>  bb=-2;</b></p><p><b>  cc=-1;</b></p><p><b>  }</b></p><p>  publicvoid sit(String name){</p>

43、<p><b>  try {</b></p><p>  semaphore.acquire();</p><p>  } catch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace(

44、);</p><p><b>  }</b></p><p>  Date date=new Date();</p><p>  System.out.println("客戶:"+name+"在時間"+date.toString()+":到達"+"\n");<

45、/p><p><b>  }</b></p><p>  public String qu(String name) {</p><p>  String a= new String();</p><p><b>  try {</b></p><p>  semaphoreq.

46、acquire();</p><p>  } catch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>&l

47、t;b>  intx;</b></p><p><b>  inty;</b></p><p>  Random ran=new Random();</p><p>  x=ran.nextInt(9);</p><p><b>  y=zcount;</b></p>

48、<p>  //System.out.println(x);</p><p><b>  if(x<3){</b></p><p><b>  aa++;</b></p><p><b>  intaaa;</b></p><p><b>  if

49、(aa<0)</b></p><p><b>  aaa=0;</b></p><p>  else{aaa=aa;}</p><p>  a="A"+"--"+y+"該服務(wù)有"+aaa+"人等待";</p><p>  S

50、ystem.out.println("客戶:"+name+":取到號:"+a+"\n");</p><p><b>  try {</b></p><p>  semaphorez.acquire();</p><p>  } catch (InterruptedException e

51、) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  zcount++;</b></p><p>  semaphorez.re

52、lease();</p><p><b>  }</b></p><p>  elseif(3<=x&&x<=6){</p><p><b>  bb++;</b></p><p><b>  intbbb;</b></p><p

53、><b>  if (bb<0)</b></p><p><b>  bbb=0;</b></p><p>  else{bbb=bb;}</p><p>  a="B"+"--"+y+"該服務(wù)有"+bbb+"人等待";</p

54、><p>  System.out.println("客戶:"+name+":取到號:"+a+"\n");</p><p><b>  try {</b></p><p>  semaphorez.acquire();</p><p>  } catch (Inte

55、rruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  zcount++;</b></p><p&

56、gt;  semaphorez.release();</p><p><b>  }</b></p><p><b>  else{</b></p><p><b>  cc++;</b></p><p><b>  intccc;</b></p&g

57、t;<p><b>  if (cc<0)</b></p><p><b>  ccc=0;</b></p><p>  else{ccc=cc;}</p><p>  a="C"+"--"+y+"該服務(wù)有"+ccc+"人等待&quo

58、t;;</p><p>  System.out.println("客戶:"+name+":取到號:"+a+"\n");</p><p><b>  try {</b></p><p>  semaphorez.acquire();</p><p>  } ca

59、tch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  zcount++;</b></p>

60、;<p>  semaphorez.release();</p><p><b>  }</b></p><p>  semaphoreq.release();</p><p><b>  returna;</b></p><p><b>  }</b></

61、p><p>  publicvoid handle(String b ,String name){</p><p>  if (b.charAt(0)=='A'){</p><p><b>  try {</b></p><p>  semaphorea.acquire();</p><p

62、>  } catch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  semaphore.release();</p&

63、gt;<p>  System.out.println(name+":正在對私服務(wù)窗口辦理業(yè)務(wù)"+"\n");</p><p>  intt=(ran1.nextInt(3)+1)*1000;</p><p><b>  try {</b></p><p>  Thread.sleep(t)

64、;</p><p>  } catch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  

65、aa--;</b></p><p>  semaphorea.release();</p><p>  Date date=new Date();</p><p>  System.out.println(name+"服務(wù)時間"+t+"毫秒在"+date+":離開"+"\n"

66、);</p><p><b>  }</b></p><p>  elseif(b.charAt(0)=='B'){</p><p><b>  try {</b></p><p>  semaphoreb.acquire();</p><p>  } cat

67、ch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  semaphore.release();</p><p&

68、gt;  System.out.println(name+":正在對公服務(wù)窗口辦理業(yè)務(wù)"+"\n");</p><p>  intt=(ran1.nextInt(3)+1)*1000;</p><p><b>  try {</b></p><p>  Thread.sleep(t);</p>

69、<p>  } catch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  bb--;</b

70、></p><p>  semaphoreb.release();</p><p>  Date date=new Date();</p><p>  System.out.println(name+"服務(wù)時間"+t+"毫秒在"+date+":離開"+"\n");</p>

71、;<p><b>  }</b></p><p>  elseif(b.charAt(0)=='C') {</p><p><b>  try {</b></p><p>  semaphorec.acquire();</p><p>  } catch (Interr

72、uptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  semaphore.release();</p><p>  Syste

73、m.out.println(name+":正在理財服務(wù)窗口辦理業(yè)務(wù)"+"\n");</p><p>  intt=(ran1.nextInt(3)+1)*1000;</p><p><b>  try {</b></p><p>  Thread.sleep(t);</p><p>

74、;  } catch (InterruptedException e) {</p><p>  // TODO 自動生成的 catch 塊</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  cc--;</b></p

75、><p>  semaphorec.release();</p><p>  Date date=new Date();</p><p>  System.out.println(name+"服務(wù)時間"+t+"毫秒在"+date+":離開"+"\n");</p><p&g

76、t;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  附件</b></p><p><b>  檢查一</b></p><p>

77、  1信號量的含義初值?</p><p>  zcount座位,初值20。</p><p>  qcount取號機,初值1。</p><p>  Counta A類窗口,初值3。</p><p>  Countb B類窗口,初值2。</p><p>  Countc C類窗口,初值1。</p><p

78、>  Countx 計數(shù)器互斥操作,初值1。</p><p>  2 pv原語對應(yīng)的api?</p><p><b>  Java語言</b></p><p>  信號量 semaphore</p><p>  P :acquire</p><p>  V : release</p&

79、gt;<p><b>  線程創(chuàng)建</b></p><p><b>  繼承Thread類</b></p><p><b>  實現(xiàn)run方法</b></p><p>  3 是否要區(qū)分窗口,每一個窗口都設(shè)置一個信號量?</p><p>  不需要,可將每一種窗口

80、化為一類,判斷有無空閑即可,有則服務(wù),沒有則等待。</p><p><b>  檢查二</b></p><p>  1是否設(shè)置服務(wù)時間,或最大服務(wù)量?</p><p>  根據(jù)作業(yè)要求該功能是可選模塊,可以選擇是否實現(xiàn),</p><p>  本作業(yè)有實現(xiàn)可以加一個if else 判斷是否在服務(wù)時間段內(nèi),如在則允許創(chuàng)建線程

81、對象,如不在,則禁止創(chuàng)建,并輸出“不在服務(wù)時間范圍內(nèi)”。</p><p>  2開始客戶到來的時間是隨機的嗎?</p><p>  是,在創(chuàng)建每個線程之后,調(diào)用start之前產(chǎn)生隨機數(shù),并且根據(jù)隨機數(shù)進行線程休眠,這樣可以模擬客戶的隨機到來,但是由于線程運行太塊,為了方便展示實現(xiàn)效果,將休眠的時間設(shè)置為妙級的,所以隨機的到來時間只是秒數(shù)或者分鐘不同。</p><p>

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論