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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、</p><p>  還可以進(jìn)行遍歷,篩選并記錄各進(jìn)程對(duì)所有資源的最大申請(qǐng)量大于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í)行時(shí)間</p><p>  int waittime; //等待時(shí)間</p><p>  int typenum; //進(jìn)程所申請(qǐng)的資源數(shù)</p><

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

11、//資源下標(biāo)</p><p>  int tr; //進(jìn)程的下標(biāo)</p><p>  int flag1; //1:該資源不能再申請(qǐng);0:該資源還可以申請(qǐng)</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>  //對(duì)整個(gè)二維數(shù)組Y進(jìn)行遍歷</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個(gè)進(jìn)程的

14、1種資源未申請(qǐng)完,則返回1</p><p><b>  }</b></p><p><b>  }</b></p><p>  return 0; //僅當(dāng)所有進(jìn)程對(duì)資源的申請(qǐng)都達(dá)到所需量時(shí)才返回0</p><p><b>  }</b></p><p>

15、;  //對(duì)二維數(shù)組中的某一行(對(duì)應(yīng)某種進(jìn)程)進(jìn)行遍歷</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; //該進(jìn)程只要有1個(gè)資源未申請(qǐng)完,則返回0</p><p><b>  }</b></p><p>  return 1; //僅當(dāng)該進(jìn)程所有資源都申請(qǐng)完時(shí)返回1</p><p><b>  }</b></p><p

17、>  //產(chǎn)生隨機(jī)進(jìn)程和進(jìn)程所申請(qǐng)的資源,并調(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的元素個(gè)數(shù)</p><p>  printf(

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

19、<p>  //對(duì)Max數(shù)組進(jìn)行遍歷,篩選并記錄各進(jìn)程對(duì)所有資源的最大申請(qǐng)量大于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記錄資源下標(biāo)</p><p>  Y[m][n].tr = i; //tr記錄進(jìn)程下標(biāo)</p><p>  Y[m][n].flag = 0; //flag=1:所記錄的資源已申請(qǐng)過,flag=0:所記錄的資源尚未申請(qǐng)</p><p>  Y[m][n].flag1 = 0; //flag1=1:進(jìn)程對(duì)該資源的申請(qǐng)已達(dá)到所

21、需量,flag=0:還未達(dá)到所需量</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; //對(duì)n進(jìn)行恢復(fù),以便下次循環(huán)</p><p><b>  m++;</b></p><p><b>  }</b></p><p>  //只要有資源未申請(qǐng)完就執(zhí)行循環(huán)</p><p>  while (judge_pro(m, col)) {</p>

23、<p>  int _one = 0;</p><p><b>  int tr;</b></p><p>  //若該進(jìn)程所有資源都申請(qǐng)完,則執(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進(jìn)程申請(qǐng)\n", JC[Y[tr][0].tr].name);</p><p>  int x = col[tr];</p><p>  //若有資源申請(qǐng)完,則使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ù),使該進(jìn)程隨機(jī)產(chǎn)生對(duì)各資源的申請(qǐng)量</p&g

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

27、one == j) {</p><p>  j = rand() % (col[tr]); //j表示Y[][]的第tr行的資源下標(biāo)</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代表當(dāng)前資源既沒申請(qǐng)過也沒申請(qǐng)完</p><p>  flag=1;flag1=0代表當(dāng)前資源已申請(qǐng)過,但沒申請(qǐng)完</p><p>  flag=0;flag1=1代表當(dāng)前資源沒申

29、請(qǐng)過,但申請(qǐng)完(不存在這種可能)</p><p>  flag=1;flag1=1代表當(dāng)前資源已申請(qǐng)過,同時(shí)申請(qǐng)完</p><p><b>  */</b></p><p>  Y[tr][j].flag = 1; //改進(jìn)程的當(dāng)前資源標(biāo)志為已申請(qǐng)過</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個(gè)", w);</p><p>  Request[Y[tr][0].tr][Y[tr][j].index] = w; //將申請(qǐng)的資源信息賦給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("進(jìn)程%c已執(zhí)行完畢!", JC[Y[tr][0].tr].name);</p><p

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論