基于linux的實現(xiàn)進程的信號量互斥申請操作系統(tǒng)課程設(shè)計_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)課程設(shè)計</b></p><p><b>  說 明 書</b></p><p>  2013 年 11月 6 日</p><p><b>  1 需求分析</b></p><p>  基于Linux的進程同步與通信的模擬實現(xiàn)需要完成以下功

2、能:</p><p>  (1)創(chuàng)建進程:手動創(chuàng)建幾個進程,或者隨即創(chuàng)建幾個進程,都在界面上完成;要求包括進程的名稱(不能重復(fù))、執(zhí)行時間和申請資源的等待時間等。在同一時刻可能有多個進行在內(nèi)存申請某資源,即可以輸入多個進程的資源申請。</p><p> ?。?)3類臨界資源的管理,包括申請以及分配等。分別通過信號量實現(xiàn)或者管程實現(xiàn)。 </p><p> ?。?

3、)銀行家算法,判斷是否可以進行資源的分配。</p><p>  基于以上的功能,可以使用戶選擇操作,模擬臨界資源的管理和銀行家算法。</p><p>  目的:實現(xiàn)臨界資源的管理及死鎖的避免。</p><p><b>  總體設(shè)計</b></p><p>  進程同步與模擬實現(xiàn)系統(tǒng)分為4個模塊:輸入輸出,進程對資源的隨機

4、申請及分配,臨界資源管理,銀行家算法避免死鎖。</p><p>  輸入輸出:包括系統(tǒng)運行所需要的進程的名稱,執(zhí)行時間,申請資源的等待時間,進程對資源的需要量等信息以及系統(tǒng)所要顯示出的進程的創(chuàng)建信息,資源的分配信息,進行執(zhí)行信息,進行動態(tài)申請資源信息等。</p><p>  進程對資源的隨機申請及分配:根據(jù)所輸入的進程、資源、以及進程對資源的最大申請情況,隨機產(chǎn)生進程當前對資源的申請,輸出

5、相應(yīng)的分配信息與進程執(zhí)行信息并調(diào)用銀行家算法對進程的資源申請進行判斷。</p><p>  臨界資源的管理:創(chuàng)建相應(yīng)個數(shù)的進程,完成進程的并發(fā)執(zhí)行,使用互斥信號量使各進程互斥的進入各自的臨界區(qū)對資源進行申請,進程執(zhí)行完畢后,互斥的對資源進行恢復(fù)。</p><p>  銀行家算法避免死鎖:對當前進程對資源的申請利用銀行家算法進行判斷,看系統(tǒng)分配后是否處于安全狀態(tài),若處于安全狀態(tài),則將資源分配

6、給進程,并輸出分配信息,否則對不予以分配。</p><p><b>  3.詳細設(shè)計</b></p><p>  在該系統(tǒng)中我主要實現(xiàn)了銀行家算法中隨機分配的模塊,該模塊中主要使用了數(shù)組的數(shù)據(jù)結(jié)構(gòu).</p><p>  3.1隨機分配算法:</p><p>  3.1.1首先:定義了一個結(jié)構(gòu)體y其中放置了Max數(shù)組中申請

7、資源量大于0的資源。(包括進程下標,資源下標,進程是否對資源申請過的信號量,該資源是否已經(jīng)被申請完的信號量)。再定義一個數(shù)組col[]。用來存放第m個進程中過濾(去除申請資源量為0)的資源數(shù)。</p><p>  3.1.2 (1)遍歷Max數(shù)組對二維Y數(shù)組和一維col數(shù)組進行初始化:生成一個去除了申請量為0的新的二維結(jié)構(gòu)體數(shù)組(記錄有進程下標和資源下標)。col中放置新的Y數(shù)組對應(yīng)的信息(每個進程申請資源數(shù))。

8、</p><p>  還可以進行遍歷,篩選并記錄各進程對所有資源的最大申請量大于0的元素信息3.2數(shù)據(jù)結(jié)構(gòu)</p><p>  struct zy {</p><p>  char type; //資源的名稱</p><p>  int n; //資源的數(shù)量</p><p><b>  };</b>

9、;</p><p>  struct jc {</p><p>  char name; //名稱</p><p>  int runtime; //執(zhí)行時間</p><p>  int waittime; //等待時間</p><p>  int typenum; //進程所申請的資源數(shù)</p><

10、;p>  struct zy r[5]; //所申請資源的信息</p><p><b>  };</b></p><p>  struct y {</p><p>  int flag; //標志,0:未出現(xiàn)過的資源,(進程a申請資源B 1個資源B 1個)1:該資源已申請</p><p>  int index;

11、//資源下標</p><p>  int tr; //進程的下標</p><p>  int flag1; //1:該資源不能再申請;0:該資源還可以申請</p><p>  } Y[10][NUM];</p><p>  struct jc JC[5];</p><p>  struct zy ZY[NUM]; //

12、每種資源的名稱及數(shù)量</p><p><b>  3.3核心代碼</b></p><p>  //對整個二維數(shù)組Y進行遍歷</p><p>  int judge_pro(int m, int p[10]) {</p><p><b>  int i, j;</b></p><p

13、>  for (i = 0; i < m; i++) {</p><p>  for (j = 0; j < p[i]; j++) {</p><p>  if (!(Y[i][j].flag1)) {</p><p><b>  return 1;</b></p><p>  } //只要有1個進程的

14、1種資源未申請完,則返回1</p><p><b>  }</b></p><p><b>  }</b></p><p>  return 0; //僅當所有進程對資源的申請都達到所需量時才返回0</p><p><b>  }</b></p><p>

15、;  //對二維數(shù)組中的某一行(對應(yīng)某種進程)進行遍歷</p><p>  int panduan1(int tr, int p[10]) {</p><p><b>  int i;</b></p><p>  for (i = 0; i < p[tr]; i++) {</p><p>  if (!(Y[tr]

16、[i].flag1))</p><p>  return 0; //該進程只要有1個資源未申請完,則返回0</p><p><b>  }</b></p><p>  return 1; //僅當該進程所有資源都申請完時返回1</p><p><b>  }</b></p><p

17、>  //產(chǎn)生隨機進程和進程所申請的資源,并調(diào)用銀行家算法</p><p>  int ra() {</p><p>  int col[10];</p><p>  int i, j, k = 0, w = 0, m = 0, n = 0, q = 0; //k記錄最大需求矩陣中數(shù)目不為0的元素個數(shù)</p><p>  printf(

18、"\n");</p><p>  if (u == 0 || a == 0) {</p><p>  printf("請先輸入信息!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p>

19、<p>  //對Max數(shù)組進行遍歷,篩選并記錄各進程對所有資源的最大申請量大于0的元素信息</p><p>  for (i = 0; i < u; i++) {</p><p>  for (j = 0; j < a; j++) {</p><p>  if (Max[i][j]) {</p><p>  Y[m]

20、[n].index = j; //index記錄資源下標</p><p>  Y[m][n].tr = i; //tr記錄進程下標</p><p>  Y[m][n].flag = 0; //flag=1:所記錄的資源已申請過,flag=0:所記錄的資源尚未申請</p><p>  Y[m][n].flag1 = 0; //flag1=1:進程對該資源的申請已達到所

21、需量,flag=0:還未達到所需量</p><p><b>  n++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  col[m] = n; //數(shù)組col記錄二維數(shù)組Y的每一行的列數(shù)</p><

22、;p>  n = 0; //對n進行恢復(fù),以便下次循環(huán)</p><p><b>  m++;</b></p><p><b>  }</b></p><p>  //只要有資源未申請完就執(zhí)行循環(huán)</p><p>  while (judge_pro(m, col)) {</p>

23、<p>  int _one = 0;</p><p><b>  int tr;</b></p><p>  //若該進程所有資源都申請完,則執(zhí)行循環(huán)</p><p><b>  do {</b></p><p>  tr = rand() % m;</p><p&g

24、t;  } while (panduan1(tr, col)); //</p><p>  printf("%c進程申請\n", JC[Y[tr][0].tr].name);</p><p>  int x = col[tr];</p><p>  //若有資源申請完,則使x減1</p><p>  for (i = 0;

25、 i < col[tr]; i++) { //處理函數(shù).</p><p>  if (Y[tr][i].flag1)</p><p><b>  x--;</b></p><p><b>  }</b></p><p>  //用x保證循環(huán)次數(shù),使該進程隨機產(chǎn)生對各資源的申請量</p&g

26、t;<p>  for (i = 0; i < x; i++) {</p><p>  //該進程對當前資源</p><p><b>  do {</b></p><p>  j = rand() % (col[tr]); //j表示Y[][]的第tr行的資源下標</p><p>  while (_

27、one == j) {</p><p>  j = rand() % (col[tr]); //j表示Y[][]的第tr行的資源下標</p><p><b>  }</b></p><p><b>  _one = j;</b></p><p>  } while (Y[tr][j].flag &a

28、mp;& Y[tr][j].flag1);</p><p><b>  /*</b></p><p>  flag=0;flag1=0代表當前資源既沒申請過也沒申請完</p><p>  flag=1;flag1=0代表當前資源已申請過,但沒申請完</p><p>  flag=0;flag1=1代表當前資源沒申

29、請過,但申請完(不存在這種可能)</p><p>  flag=1;flag1=1代表當前資源已申請過,同時申請完</p><p><b>  */</b></p><p>  Y[tr][j].flag = 1; //改進程的當前資源標志為已申請過</p><p>  printf("%c資源",

30、ZY[Y[tr][j].index].type);</p><p><b>  w = 1</b></p><p><b>  + rand()</b></p><p>  % (Max[tr][Y[tr][j].index]</p><p>  - Allocation[tr][Y[tr][j].

31、index]);</p><p>  printf("%d個", w);</p><p>  Request[Y[tr][0].tr][Y[tr][j].index] = w; //將申請的資源信息賦給Request數(shù)組</p><p><b>  }</b></p><p>  printf(&qu

32、ot;\n");</p><p>  request(Y[tr][0].tr, col[tr], tr); //調(diào)用銀行家算法</p><p>  if (panduan1(tr, col)) {</p><p>  printf("進程%c已執(zhí)行完畢!", JC[Y[tr][0].tr].name);</p><p

33、><b>  }</b></p><p><b>  }</b></p><p>  //所有進程執(zhí)行完成后,對資源數(shù)目進行恢復(fù)</p><p>  if (!(judge_pro(m, col))) {</p><p>  for (i = 0; i < a; i++) {</p

34、><p>  Allocation[j][i] = 0;</p><p>  Need[j][i] = Max[j][i] - Allocation[j][i];</p><p><b>  }</b></p><p><b>  }</b></p><p><b> 

35、 return 0;</b></p><p><b>  }</b></p><p><b>  3.4運行結(jié)果</b></p><p><b>  圖3.4.1</b></p><p><b>  圖3.4.2</b></p>

36、<p><b>  圖3.4.3</b></p><p><b>  圖3.4.4</b></p><p><b>  圖3.4.5</b></p><p><b>  圖3.4.6</b></p><p><b>  圖3.4.7&l

37、t;/b></p><p><b>  圖3.4.8</b></p><p><b>  圖3.4.9</b></p><p><b>  圖3.4.10</b></p><p><b>  圖3.4.11</b></p><p&

38、gt;<b>  4.心得體會</b></p><p>  經(jīng)過這次的操作系統(tǒng)課程設(shè)計,讓我經(jīng)歷了一次有意義的項目開發(fā)過程,讓我了解了團隊合作的重要性,起初我們只是在不停的各干各的,發(fā)現(xiàn)根本不可能完成預(yù)期的任務(wù),后來我們坐下來討論了系統(tǒng)的功能,然后各司其職,發(fā)現(xiàn)效果真的不一樣,雖然在這兩周的時間里我們做了很多,中間也遇到了一些問題,比如說臨界資源管理模塊和銀行家模塊怎樣結(jié)合起來,起初是將兩個

溫馨提示

  • 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

提交評論