欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法

      時(shí)間:2019-05-14 18:30:26下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法》。

      第一篇:計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法

      實(shí)驗(yàn)4 頁(yè)面置換算法(2學(xué)時(shí))

      一、實(shí)驗(yàn)?zāi)康?/p>

      通過實(shí)驗(yàn)加強(qiáng)對(duì)虛擬存儲(chǔ)管理中頁(yè)面置換算法的理解和掌握。

      二、實(shí)驗(yàn)內(nèi)容

      編寫程序?qū)崿F(xiàn)虛擬存儲(chǔ)管理中OPT,FIFO,LRU頁(yè)面置換算法。

      三、實(shí)驗(yàn)要求

      1、任意給出一組頁(yè)面訪問順序(如頁(yè)面走向是1、2、5、7、5、7、1、4、3、5、6、4、3、2、1、5、2)。

      2、分配給該作業(yè)一定的物理塊(如3塊、4塊等)。

      3、利用OPT,FIFO,LRU頁(yè)面置換算法模擬頁(yè)面置換過程并計(jì)算其缺頁(yè)率。

      4、每訪問一個(gè)頁(yè)面均需給出內(nèi)存中的內(nèi)容(內(nèi)存中的頁(yè)面號(hào)),若有淘汰還需給出淘汰的頁(yè)面號(hào)。

      5、通過給出特殊的頁(yè)面訪問順序,分配不同的物理塊,利用FIFO算法計(jì)算其缺頁(yè)率,進(jìn)一步理解Belady現(xiàn)象。

      6、(附加)實(shí)現(xiàn)CLOCK置換算法,修改位可在確定頁(yè)面號(hào)時(shí)直接任意給出。

      程序代碼(java)

      package wcm4;

      import java.util.LinkedList;import java.util.Scanner;

      public class Test {

      /**

      * @param args

      */ LinkedList ll=new LinkedList();int a;int leng;int[] all={1,2,5,7,5,7,1,4,3,5,6,4,3,2,1,5,2};//int[] free=new int[all.length];

      Object o=new Integer(a);public static void main(String[] args){

      public void begin(){ System.out.println(“請(qǐng)選擇測(cè)試類型:”);System.out.println(“1 OPT;2 FiFO;3 LRU;4 CLOCK;5退出”);

      } public void need(){ System.out.println(“請(qǐng)輸入分配給該作業(yè)的物理塊數(shù):”);Scanner sc=new Scanner(System.in);leng=sc.nextInt();Scanner sc=new Scanner(System.in);int choose=sc.nextInt();while(choose!=5){

      } switch(choose){ case 1:this.opt();break;case 2:this.fifo();break;case 3:this.lru();break;case 4:this.clock();break;} System.out.println(“請(qǐng)選擇測(cè)試類型:”);System.out.println(“1 OPT;2 FiFO;3 LRU;4 CLOCK;5退出”);sc=new Scanner(System.in);choose=sc.nextInt();// TODO Auto-generated method stub Test t=new Test();t.begin();

      }

      }

      public void fifo(){ ll=new LinkedList();this.need();

      int a=0;for(int i=0;i

      o=all[i];if(!ll.contains(o)){

      } if(ll.size()

      } ll.add(o);o=ll.poll();a++;else{ o=null;} this.print();} System.out.println(“FIFO的缺頁(yè)率為:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length);

      } public void opt(){//最佳置換算法

      //leng=0;ll=new LinkedList();this.need();int a=0;//int temp=0;//int[] b=new int[leng];

      for(int i=0;i

      int[] b=new int[leng];o=all[i];if(!ll.contains(o)){ if(ll.size()

      ll.add(o);

      }

      o=null;} else{ for(int j=i;j

      Object o1=new Integer(all[j]);

      }

      for(int k=0;k

      }

      if(ll.get(k).equals(o1)){

      }

      if(b[k]==0){

      b[k]=j;//待替換的頁(yè)在以后第一次出現(xiàn)的位置

      } } if(b[leng-1]==0){

      o=ll.set(leng-1, o);a++;} else{ int temp=0;

      }

      for(int m=0;m

      if(b[m]==0){ temp=m;break;}

      else if(b[m]>b[temp]){ }

      temp=m;

      }

      o=ll.set(temp, o);//替換以后離得最遠(yuǎn)的 a++;} else{ } o=null;this.print();} System.out.println(“OPT的缺頁(yè)率為:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length);

      public void lru(){//最近最久未使用

      }

      public void clock(){//簡(jiǎn)單clock

      ll=new LinkedList();this.need();int a=0;int[] b=new int[leng];for(int i=0;i

      o=all[i];if(!ll.contains(o)){

      if(ll.size()

      o=all[i];if(!ll.contains(o)){

      if(ll.size()

      } ll.add(o);o=ll.poll();a++;} else{ ll.add(o);ll.remove(o);o=null;} this.print();} System.out.println(“OPT的缺頁(yè)率為:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length);

      }

      } else{

      for(int j=0;j<=ll.size();j++){

      if(b[j%ll.size()]==0){

      }

      }

      }

      else{ int temp1=j%ll.size();

      }

      o=ll.set(temp1, o);

      b[temp1]=0;//改變?cè)撐坏臉?biāo)記位 break;

      b[j%ll.size()]=1;a++;} else{ int temp=ll.indexOf(o);//找到該位

      b[temp]=0;o=null;} this.print();System.out.println(“標(biāo)記位為:”);for(int k=0;k

      public void print(){ Object[] op=ll.toArray();for(int i=0;i

      ”);System.out.println(o);//System.out.println();System.out.print(op[i]);} }

      第二篇:計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)三頁(yè)面置換算法模擬實(shí)驗(yàn)

      計(jì)算機(jī)工程學(xué)院

      實(shí)驗(yàn)報(bào)告書

      課程名:《

      操作系統(tǒng)原理A

      目:

      虛擬存儲(chǔ)器管理

      頁(yè)面置換算法模擬實(shí)驗(yàn)

      級(jí):

      學(xué)

      號(hào):

      名:

      評(píng)語(yǔ):

      成績(jī):

      指導(dǎo)教師:

      批閱時(shí)間:

      ****年**月**日

      一、實(shí)驗(yàn)?zāi)康呐c要求

      1.目的:

      請(qǐng)求頁(yè)式虛存管理是常用的虛擬存儲(chǔ)管理方案之一。通過請(qǐng)求頁(yè)式虛存管理中對(duì)頁(yè)面置換算法的模擬,有助于理解虛擬存儲(chǔ)技術(shù)的特點(diǎn),并加深對(duì)請(qǐng)求頁(yè)式虛存管理的頁(yè)面調(diào)度算法的理解。

      2.要求:

      本實(shí)驗(yàn)要求使用C語(yǔ)言編程模擬一個(gè)擁有若干個(gè)虛頁(yè)的進(jìn)程在給定的若干個(gè)實(shí)頁(yè)中運(yùn)行、并在缺頁(yè)中斷發(fā)生時(shí)分別使用FIFO和LRU算法進(jìn)行頁(yè)面置換的情形。其中虛頁(yè)的個(gè)數(shù)可以事先給定(例如10個(gè)),對(duì)這些虛頁(yè)訪問的頁(yè)地址流(其長(zhǎng)度可以事先給定,例如20次虛頁(yè)訪問)可以由程序隨機(jī)產(chǎn)生,也可以事先保存在文件中。要求程序運(yùn)行時(shí)屏幕能顯示出置換過程中的狀態(tài)信息并輸出訪問結(jié)束時(shí)的頁(yè)面命中率。程序應(yīng)允許通過為該進(jìn)程分配不同的實(shí)頁(yè)數(shù),來(lái)比較兩種置換算法的穩(wěn)定性。

      二、實(shí)驗(yàn)說明

      1.設(shè)計(jì)中虛頁(yè)和實(shí)頁(yè)的表示

      本設(shè)計(jì)利用C語(yǔ)言的結(jié)構(gòu)體來(lái)描述虛頁(yè)和實(shí)頁(yè)的結(jié)構(gòu)。

      pn

      pfn

      time

      pn

      pfn

      next

      虛頁(yè)結(jié)構(gòu)

      實(shí)頁(yè)結(jié)構(gòu)

      在虛頁(yè)結(jié)構(gòu)中,pn代表虛頁(yè)號(hào),因?yàn)楣?0個(gè)虛頁(yè),所以pn的取值范圍是0—9。pfn代表實(shí)頁(yè)號(hào),當(dāng)一虛頁(yè)未裝入實(shí)頁(yè)時(shí),此項(xiàng)值為-1;當(dāng)該虛頁(yè)已裝入某一實(shí)頁(yè)時(shí),此項(xiàng)值為所裝入的實(shí)頁(yè)的實(shí)頁(yè)號(hào)pfn。time項(xiàng)在FIFO算法中不使用,在LRU中用來(lái)存放對(duì)該虛頁(yè)的最近訪問時(shí)間。

      在實(shí)頁(yè)結(jié)構(gòu)中中,pn代表虛頁(yè)號(hào),表示pn所代表的虛頁(yè)目前正放在此實(shí)頁(yè)中。pfn代表實(shí)頁(yè)號(hào),取值范圍(0—n-1)由動(dòng)態(tài)指派的實(shí)頁(yè)數(shù)n所決定。next是一個(gè)指向?qū)嶍?yè)結(jié)構(gòu)體的指針,用于多個(gè)實(shí)頁(yè)以鏈表形式組織起來(lái),關(guān)于實(shí)頁(yè)鏈表的組織詳見下面第4點(diǎn)。

      2.關(guān)于缺頁(yè)次數(shù)的統(tǒng)計(jì)

      為計(jì)算命中率,需要統(tǒng)計(jì)在20次的虛頁(yè)訪問中命中的次數(shù)。為此,程序應(yīng)設(shè)置一個(gè)計(jì)數(shù)器count,來(lái)統(tǒng)計(jì)虛頁(yè)命中發(fā)生的次數(shù)。每當(dāng)所訪問的虛頁(yè)的pfn項(xiàng)值不為-1,表示此虛頁(yè)已被裝入某實(shí)頁(yè)內(nèi),此虛頁(yè)被命中,count加1。最終命中率=count/20*100%。

      3.LRU算法中“最近最久未用”頁(yè)面的確定

      為了能找到“最近最久未用”的虛頁(yè)面,程序中可引入一個(gè)時(shí)間計(jì)數(shù)器countime,每當(dāng)要訪問一個(gè)虛頁(yè)面時(shí),countime的值加1,然后將所要訪問的虛頁(yè)的time項(xiàng)值設(shè)置為增值后的當(dāng)前countime值,表示該虛頁(yè)的最后一次被訪問時(shí)間。當(dāng)LRU算法需要置換時(shí),從所有已分配實(shí)頁(yè)的虛頁(yè)中找出time值為最小的虛頁(yè)就是“最近最久未用”的虛頁(yè)面,應(yīng)該將它置換出去。

      4.算法中實(shí)頁(yè)的組織

      因?yàn)槟芊峙涞膶?shí)頁(yè)數(shù)n是在程序運(yùn)行時(shí)由用戶動(dòng)態(tài)指派的,所以應(yīng)使用鏈表組織動(dòng)態(tài)產(chǎn)生的多個(gè)實(shí)頁(yè)。為了調(diào)度算法實(shí)現(xiàn)的方便,可以考慮引入free和busy兩個(gè)鏈表:free鏈表用于組織未分配出去的實(shí)頁(yè),首指針為free_head,初始時(shí)n個(gè)實(shí)頁(yè)都處于free鏈表中;busy鏈表用于組織已分配出去的實(shí)頁(yè),首指針為busy_head,尾指針為busy_tail,初始值都為null。當(dāng)所要訪問的一個(gè)虛頁(yè)不在實(shí)頁(yè)中時(shí),將產(chǎn)生缺頁(yè)中斷。此時(shí)若free鏈表不為空,就取下鏈表首指針?biāo)傅膶?shí)頁(yè),并分配給該虛頁(yè)。若free鏈表為空,則說明n個(gè)實(shí)頁(yè)已全部分配出去,此時(shí)應(yīng)進(jìn)行頁(yè)面置換:對(duì)于FIFO算法要將busy_head

      所指的實(shí)頁(yè)從busy鏈表中取下,分配給該虛頁(yè),然后再將該實(shí)頁(yè)插入到busy鏈表尾部;對(duì)于LRU算法則要從所有已分配實(shí)頁(yè)的虛頁(yè)中找出time值為最小的虛頁(yè),將該虛頁(yè)從裝載它的那個(gè)實(shí)頁(yè)中置換出去,并在該實(shí)頁(yè)中裝入當(dāng)前正要訪問的虛頁(yè)。

      三、程序流程圖

      四、主要程序清單

      #include

      #include

      /*全局變量*/

      int

      mSIZE;

      /*物理塊數(shù)*/

      int

      pSIZE;

      /*頁(yè)面號(hào)引用串個(gè)數(shù)*/

      static

      int

      memery[10]={0};

      /*物理塊中的頁(yè)號(hào)*/

      static

      int

      page[100]={0};

      /*頁(yè)面號(hào)引用串*/

      static

      int

      temp[100][10]={0};

      /*輔助數(shù)組*/

      /*置換算法函數(shù)*/

      void

      FIFO();

      void

      LRU();

      void

      OPT();

      /*輔助函數(shù)*/

      void

      print(unsigned

      int

      t);

      void

      designBy();

      void

      download();

      void

      mDelay(unsigned

      int

      Delay);

      /*主函數(shù)*/

      void

      main()

      {

      int

      i,k,code;

      printf(“請(qǐng)輸入物理塊的個(gè)數(shù)(M<=10):“);

      scanf(“%d“,&mSIZE);

      printf(“請(qǐng)輸入頁(yè)面號(hào)引用串的個(gè)數(shù)(P<=100):“);

      scanf(“%d“,&pSIZE);

      puts(“請(qǐng)依次輸入頁(yè)面號(hào)引用串(連續(xù)輸入,無(wú)需隔開):“);

      for(i=0;i

      scanf(“%1d“,&page[i]);

      download();

      do

      {

      puts(“輸入的頁(yè)面號(hào)引用串為:“);

      for(k=0;k<=(pSIZE-1)/20;k++)

      {

      for(i=20*k;(i

      {

      if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

      printf(“%d\n“,page[i]);

      else

      printf(“%d

      “,page[i]);

      }

      }

      printf(“*

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *\n“);

      printf(“*

      請(qǐng)選擇頁(yè)面置換算法:\t\t\t

      *\n“);

      printf(“*

      -----------------------------------------*\n“);

      printf(“*

      1.先進(jìn)先出(FIFO)

      2.最近最久未使用(LRU)

      *\n“);

      printf(“*

      3.退出

      *\n“);

      printf(“*

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *\n“);

      printf(“請(qǐng)選擇操作:[

      ]\b\b“);

      scanf(“%d“,&code);

      switch(code)

      {

      case

      1:

      FIFO();

      break;

      case

      2:

      LRU();

      break;

      case

      3:

      OPT();

      break;

      case

      4:

      system(“cls“);

      //system(“color

      0A“);

      exit(0);

      default:

      printf(“輸入錯(cuò)誤,請(qǐng)重新輸入:“);

      }

      printf(“按任意鍵重新選擇置換算法:>>>“);

      getchar();

      }

      while

      (code!=4);

      getchar();

      }

      /*載入數(shù)據(jù)*/

      void

      download()

      {

      printf(“\nFinish.\n載入成功!“);

      }

      /*設(shè)置延遲*/

      void

      mDelay(unsigned

      int

      Delay)

      {

      unsigned

      int

      i;

      for(;Delay>0;Delay--)

      {

      for(i=0;i<124;i++)

      {

      printf(“

      \b“);

      }

      }

      }

      /*顯示設(shè)計(jì)者信息*/

      void

      print(unsigned

      int

      t)

      {

      int

      i,j,k,l;

      int

      flag;

      for(k=0;k<=(pSIZE-1)/20;k++)

      {

      for(i=20*k;(i

      {

      if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

      printf(“%d\n“,page[i]);

      else

      printf(“%d

      “,page[i]);

      }

      for(j=0;j

      {

      for(i=20*k;(i{

      if(i>=j)

      printf(“

      |%d|“,temp[i][j]);

      else

      printf(“

      |

      |“);

      }

      for(i=mSIZE+20*k;(i

      {

      for(flag=0,l=0;l

      if(temp[i][l]==temp[i-1][l])

      flag++;

      if(flag==mSIZE)/*頁(yè)面在物理塊中*/

      printf(“

      “);

      else

      printf(“

      |%d|“,temp[i][j]);

      }

      /*每行顯示20個(gè)*/

      if(i%20==0)

      continue;

      printf(“\n“);

      }

      }

      printf(“----------------------------------------\n“);

      printf(“缺頁(yè)次數(shù):%d\t\t“,t+mSIZE);

      printf(“缺頁(yè)率:%d/%d\n“,t+mSIZE,pSIZE);

      printf(“置換次數(shù):%d\t\t“,t);

      printf(“訪問命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE);

      printf(“----------------------------------------\n“);

      }

      /*計(jì)算過程延遲*/

      void

      compute()

      {

      int

      i;

      printf(“正在進(jìn)行相關(guān)計(jì)算,請(qǐng)稍候“);

      for(i=0;i++<30;printf(“\b“));

      for(i=0;i++<30;printf(“

      “));

      for(i=0;i++<30;printf(“\b“));

      }

      /*先進(jìn)先出頁(yè)面置換算法*/

      void

      FIFO()

      {

      int

      memery[10]={0};

      int

      time[10]={0};

      /*記錄進(jìn)入物理塊的時(shí)間*/

      int

      i,j,k,m;

      int

      max=0;

      /*記錄換出頁(yè)*/

      int

      count=0;

      /*記錄置換次數(shù)*/

      /*前mSIZE個(gè)數(shù)直接放入*/

      for(i=0;i

      {

      memery[i]=page[i];

      time[i]=i;

      for(j=0;j

      temp[i][j]=memery[j];

      }

      for(i=mSIZE;i

      {

      /*判斷新頁(yè)面號(hào)是否在物理塊中*/

      for(j=0,k=0;j

      {

      if(memery[j]!=page[i])

      k++;

      }

      if(k==mSIZE)

      /*如果不在物理塊中*/

      {

      count++;

      /*計(jì)算換出頁(yè)*/

      max=time[0]

      for(m=2;m

      if(time[m]

      max=m;

      memery[max]=page[i];

      time[max]=i;

      /*記錄該頁(yè)進(jìn)入物理塊的時(shí)間*/

      for(j=0;j

      temp[i][j]=memery[j];

      }

      else

      {

      for(j=0;j

      temp[i][j]=memery[j];

      }

      }

      compute();

      print(count);

      }

      /*最近最久未使用置換算法*/

      void

      LRU()

      {

      int

      memery[10]={0};

      int

      flag[10]={0};

      /*記錄頁(yè)面的訪問時(shí)間*/

      int

      i,j,k,m;

      int

      max=0;

      /*記錄換出頁(yè)*/

      int

      count=0;

      /*記錄置換次數(shù)*/

      /*前mSIZE個(gè)數(shù)直接放入*/

      for(i=0;i

      {

      memery[i]=page[i];

      flag[i]=i;

      for(j=0;j

      temp[i][j]=memery[j];

      }

      for(i=mSIZE;i

      {

      /*判斷新頁(yè)面號(hào)是否在物理塊中*/

      for(j=0,k=0;j

      {

      if(memery[j]!=page[i])

      k++;

      else

      flag[j]=i;

      /*刷新該頁(yè)的訪問時(shí)間*/

      }

      if(k==mSIZE)

      /*如果不在物理塊中*/

      {

      count++;

      /*計(jì)算換出頁(yè)*/

      max=flag[0]

      for(m=2;m

      if(flag[m]

      max=m;

      memery[max]=page[i];

      flag[max]=i;

      /*記錄該頁(yè)的訪問時(shí)間*/

      for(j=0;j

      temp[i][j]=memery[j];

      }

      else

      {

      for(j=0;j

      temp[i][j]=memery[j];

      }

      }

      compute();

      print(count);

      }

      /*最佳置換算法*/

      void

      OPT()

      {

      int

      memery[10]={0};

      int

      next[10]={0};

      /*記錄下一次訪問時(shí)間*/

      int

      i,j,k,l,m;

      int

      max;

      /*記錄換出頁(yè)*/

      int

      count=0;

      /*記錄置換次數(shù)*/

      /*前mSIZE個(gè)數(shù)直接放入*/

      for(i=0;i

      {

      memery[i]=page[i];

      for(j=0;j

      temp[i][j]=memery[j];

      }

      for(i=mSIZE;i

      {

      /*判斷新頁(yè)面號(hào)是否在物理塊中*/

      for(j=0,k=0;j

      {

      if(memery[j]!=page[i])

      k++;

      }

      if(k==mSIZE)

      /*如果不在物理塊中*/

      {

      count++;

      /*得到物理快中各頁(yè)下一次訪問時(shí)間*/

      for(m=0;m

      {

      for(l=i+1;l

      if(memery[m]==page[l])

      break;

      next[m]=l;

      }

      /*計(jì)算換出頁(yè)*/

      max=next[0]>=next[1]?0:1;

      for(m=2;m

      if(next[m]>next[max])

      max=m;

      /*下一次訪問時(shí)間都為pSIZE,則置換物理塊中第一個(gè)*/

      memery[max]=page[i];

      for(j=0;j

      temp[i][j]=memery[j];

      }

      }

      if(k==mSIZE)

      /*如果不在物理塊中*/

      {

      count++;

      /*得到物理快中各頁(yè)下一次訪問時(shí)間*/

      for(m=0;m

      {

      for(l=i+1;l

      if(memery[m]==page[l])

      break;

      next[m]=l;

      }

      /*計(jì)算換出頁(yè)*/

      max=next[0]>=next[1]?0:1;

      for(m=2;m

      if(next[m]>next[max])

      max=m;

      /*下一次訪問時(shí)間都為pSIZE,則置換物理塊中第一個(gè)*/

      memery[max]=page[i];

      for(j=0;j

      temp[i][j]=memery[j];

      }

      }

      五、程序運(yùn)行結(jié)果

      ①FIFO

      ②LRU

      六、實(shí)驗(yàn)體會(huì)

      在做該次作業(yè)的時(shí)候,通過對(duì)課本相關(guān)內(nèi)容的溫習(xí),以及對(duì)自己在網(wǎng)絡(luò)上找到的一些資源的了解。我對(duì)操作系統(tǒng)中頁(yè)面調(diào)度的算法有了很大程度的了解,加深了對(duì)課程上知識(shí)的理解,也懂得了如何在程序中將這些算法實(shí)現(xiàn),在程序中基本上實(shí)現(xiàn)了所要求的算法以及相關(guān)的性能分析,基本上實(shí)現(xiàn)了課程的要求。

      這次作業(yè)也暴露了自己在某些方面的不足之處,自己的語(yǔ)言功底有一定的不足,以及一開始對(duì)某個(gè)算法不夠熟悉,將算法實(shí)現(xiàn)設(shè)計(jì)的比較復(fù)雜,此次自己的程序存在一些思想上的漏洞,反映出此次程序設(shè)計(jì)的要求有了一定的限制。

      第三篇:實(shí)驗(yàn)5 頁(yè)面置換算法

      實(shí)驗(yàn)5

      頁(yè)面置換算法

      一、實(shí)驗(yàn)題目:頁(yè)面置換算法(請(qǐng)求分頁(yè))

      二、實(shí)驗(yàn)?zāi)康模?/p>

      進(jìn)一步理解父子進(jìn)程之間的關(guān)系。

      1)理解內(nèi)存頁(yè)面調(diào)度的機(jī)理。2)掌握頁(yè)面置換算法的實(shí)現(xiàn)方法。3)通過實(shí)驗(yàn)比較不同調(diào)度算法的優(yōu)劣。4)培養(yǎng)綜合運(yùn)用所學(xué)知識(shí)的能力。

      頁(yè)面置換算法是虛擬存儲(chǔ)管理實(shí)現(xiàn)的關(guān)鍵,通過本次試驗(yàn)理解內(nèi)存頁(yè)面調(diào)度的機(jī)制,在模擬實(shí)現(xiàn)FIFO、LRU等經(jīng)典頁(yè)面置換算法的基礎(chǔ)上,比較各種置換算法的效率及優(yōu)缺點(diǎn),從而了解虛擬存儲(chǔ)實(shí)現(xiàn)的過程。將不同的置換算法放在不同的子進(jìn)程中加以模擬,培養(yǎng)綜合運(yùn)用所學(xué)知識(shí)的能力。

      三、實(shí)驗(yàn)內(nèi)容及要求

      這是一個(gè)綜合型實(shí)驗(yàn),要求在掌握父子進(jìn)程并發(fā)執(zhí)行機(jī)制和內(nèi)存頁(yè)面置換算法的基礎(chǔ)上,能綜合運(yùn)用這兩方面的知識(shí),自行編制程序。

      程序涉及一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程。父進(jìn)程使用rand()函數(shù)隨機(jī)產(chǎn)生若干隨機(jī)數(shù),經(jīng)過處理后,存于一數(shù)組Acess_Series[]中,作為內(nèi)存頁(yè)面訪問的序列。兩個(gè)子進(jìn)程根據(jù)這個(gè)訪問序列,分別采用FIFO和LRU兩種不同的頁(yè)面置換算法對(duì)內(nèi)存頁(yè)面進(jìn)行調(diào)度。要求:

      1)每個(gè)子進(jìn)程應(yīng)能反映出頁(yè)面置換的過程,并統(tǒng)計(jì)頁(yè)面置換算法的命中或缺頁(yè)情況。

      設(shè)缺頁(yè)的次數(shù)為diseffect??偟捻?yè)面訪問次數(shù)為total_instruction。缺頁(yè)率 = disaffect/total_instruction 命中率 = 1-disaffect/total_instruction 2)將為進(jìn)程分配的內(nèi)存頁(yè)面數(shù)mframe 作為程序的參數(shù),通過多次運(yùn)行程序,說明FIFO算法存在的Belady現(xiàn)象。

      四、程序流程圖

      開始創(chuàng)建子進(jìn)程1創(chuàng)建子進(jìn)程2

      結(jié)束 子進(jìn)程1邏輯頁(yè)面讀完?N命中?N內(nèi)存頁(yè)面滿?Y命中次數(shù)+1YY最先進(jìn)入的進(jìn)程退出內(nèi)存頁(yè)面N當(dāng)前調(diào)入頁(yè)面進(jìn)入內(nèi)存頁(yè)面退出 2邏輯頁(yè)面讀完?N命中?N內(nèi)存頁(yè)面滿?N當(dāng)前調(diào)入頁(yè)面進(jìn)入內(nèi)存頁(yè)面Y被訪問次數(shù)最少的進(jìn)程退出內(nèi)存頁(yè)面Y命中次數(shù)+1,命中頁(yè)面訪問數(shù)+1Y退出

      五、運(yùn)行結(jié)果及其說明

      FIFO:

      LRU:

      六、回答以下問題: ① 父進(jìn)程、子進(jìn)程之間的并發(fā)執(zhí)行的過程

      父進(jìn)程與子進(jìn)程之間的并發(fā)執(zhí)行宏觀并行,微觀串行。從宏觀來(lái)說,父進(jìn)程創(chuàng)建子進(jìn)程1,子進(jìn)程1和父進(jìn)程同時(shí)執(zhí)行,直到父進(jìn)程創(chuàng)建子進(jìn)程2遇到wait()函數(shù)掛機(jī)為止,當(dāng)子進(jìn)程1結(jié)束父進(jìn)程和子進(jìn)程2并發(fā)執(zhí)行到再次遇見wait()函數(shù)是掛起等待子進(jìn)程2結(jié)束,到子進(jìn)程2結(jié)束返回父進(jìn)程父進(jìn)程繼續(xù)執(zhí)行至結(jié)束。從微觀來(lái)說,父進(jìn)程先執(zhí)行至創(chuàng)建子進(jìn)程1,接下來(lái)父進(jìn)程掛起執(zhí)行子進(jìn)程1知道子進(jìn)程1結(jié)束回到父進(jìn)程;父進(jìn)程繼續(xù)執(zhí)行到創(chuàng)建子進(jìn)程2再次掛起,執(zhí)行子進(jìn)程2,直到子進(jìn)程2結(jié)束回到父進(jìn)程繼續(xù)執(zhí)行至結(jié)束。

      ② 通過完成實(shí)驗(yàn),根據(jù)你的體會(huì),闡述虛擬存儲(chǔ)器的原理。虛擬存儲(chǔ)器實(shí)際上是用來(lái)解決作業(yè)大而內(nèi)存小的問題,他通過頁(yè)面置換算法來(lái)提供遠(yuǎn)大于內(nèi)存地址空間的地址范圍,針對(duì)不同的程序?qū)⒉煌臄?shù)據(jù)頁(yè)面讀取到虛擬存儲(chǔ)器中用來(lái)實(shí)現(xiàn)。

      ③ 寫出FIFO算法中出現(xiàn)Belady現(xiàn)象的內(nèi)存頁(yè)面訪問序列。

      4個(gè)內(nèi)存頁(yè)面數(shù):

      序列2 2 5 3 3 1 3 1 2 5 5 2 3個(gè)內(nèi)存頁(yè)面數(shù):

      序列2 1 3 2 1 4 3 1 3 1 5 5

      7次命中,命中率為0.58 6次命中,命中率為0.5

      七、程序源代碼、文檔注釋及文字說明

      #include #include #include #include #include #include #include #include #define max_Frame 12 #define Frame 2

      main(){ srand(time(0));int pid1, pid2, fd[2], Acess_Series[12], temp;float effect, rate = 0;char str1[100], str2[100];struct M_Frame {

      int page_no;

      char flag;};struct M_Frame one_frame[4];one_frame[0].page_no = 0;one_frame[1].page_no = 0;one_frame[2].page_no = 0;one_frame[3].page_no = 0;effect = 0;int i = 0;printf(“內(nèi)存訪問頁(yè)面序列:”);for(;i<12;i++){

      Acess_Series[i] = rand()% 5 + 1;

      printf(“%d ”, Acess_Series[i]);} while((pid1 = fork())==-1);if(pid1 == 0){

      int no = 0;

      int pno = 0;

      printf(“FIFO頁(yè)面置換算法:n”);

      for(;no<12;no++)

      {

      printf(“調(diào)入的頁(yè)面號(hào)是%d ”, Acess_Series[no]);

      int k = 0;

      for(;k <= Frame;k++)

      {

      if(one_frame[k].page_no == Acess_Series[no]){ effect++;printf(“命中n”);break;}

      if(one_frame[k].page_no == 0)

      {

      one_frame[k].page_no = Acess_Series[no];

      printf(“未命中n”);

      break;

      }

      if(k == Frame)

      {

      int j = 1;

      for(;j <= Frame;j++)

      {

      one_frame[j1].page_no;one_frame[t1].page_no = one_frame[j].page_no;

      }

      one_frame[Frame].page_no = Acess_Series[no];

      printf(“未命中n”);

      }

      }

      printf(“內(nèi)存情況為:%d |%d |%d |%dn”, one_frame[0].page_no, one_frame[1].page_no, one_frame[2].page_no, one_frame[3].page_no);

      }

      rate = effect / 12;

      printf(“命中次數(shù):%fn”, effect);

      printf(“命中率:%fn”, rate);

      }

      wait(0);

      exit(0);} }

      第四篇:操作系統(tǒng) 七次實(shí)驗(yàn)報(bào)告 常用頁(yè)面置換算法模擬實(shí)驗(yàn)

      操作系統(tǒng)課程第七次實(shí)驗(yàn)報(bào)告

      姓名

      學(xué)號(hào)

      計(jì)算機(jī)

      任課教師

      指導(dǎo)教師

      評(píng)閱教師

      實(shí)驗(yàn)地點(diǎn)

      綜合樓B102

      實(shí)驗(yàn)時(shí)間

      2012-9-26

      實(shí)驗(yàn)課表現(xiàn)

      出勤和個(gè)人表現(xiàn)Q1(15+15(組長(zhǎng)評(píng)分)=30分)

      得分:

      實(shí)驗(yàn)

      總分

      (Q1+Q2+Q3+Q4)

      實(shí)驗(yàn)完成情況Q2(45分(組長(zhǎng)與教師評(píng)分的加權(quán)平均))

      得分:

      實(shí)驗(yàn)編號(hào)與實(shí)驗(yàn)名稱:

      實(shí)驗(yàn)七、常用頁(yè)面置換算法模擬實(shí)驗(yàn)

      實(shí)驗(yàn)?zāi)康模?/p>

      通過模擬實(shí)現(xiàn)請(qǐng)求頁(yè)式存儲(chǔ)管理的幾種基本頁(yè)面置換算法,了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握虛擬存儲(chǔ)請(qǐng)求頁(yè)式存儲(chǔ)管理中幾種基本頁(yè)面置換算法的基本思想和實(shí)現(xiàn)過程,并比較它們的效率。

      實(shí)驗(yàn)內(nèi)容及要求(詳見實(shí)驗(yàn)講義與實(shí)驗(yàn)指導(dǎo)書):

      要求:

      1)要求用你熟悉的程序設(shè)計(jì)語(yǔ)言編寫和調(diào)試一個(gè)頁(yè)面置換模擬程序;要求在主函數(shù)中測(cè)試。

      2)實(shí)驗(yàn)報(bào)告中必須包括:設(shè)計(jì)思想、數(shù)據(jù)定義(包括詳細(xì)說明)、處理流程(詳細(xì)算法描述和算法流程圖)、源代碼、運(yùn)行結(jié)果、體會(huì)等部分。

      3)必須模擬本實(shí)驗(yàn)內(nèi)容中提到的算法中的至少2種頁(yè)面置換算法。

      4)

      比較不同頁(yè)面置換算法的效率

      內(nèi)容:編寫一個(gè)程序,使用以下頁(yè)面置換算法中的某2種分別模擬一個(gè)分頁(yè)系統(tǒng),并統(tǒng)計(jì)同一個(gè)頁(yè)面訪問序列情況下不同頁(yè)面置換算法引發(fā)的缺頁(yè)中斷次數(shù)。

      1、第二次機(jī)會(huì)算法(Second

      Chance)

      2、最近最少使用算法(Least

      Recently

      Used,LRU)

      3、最不常用算法(Not

      Frequently

      Used,NFU)

      4、最近未使用算法(Not

      Recently

      Used,NRU)

      5、時(shí)鐘頁(yè)面置換算法

      6、老化算法(aging)

      頁(yè)框的數(shù)量固定為4,虛擬頁(yè)面數(shù)為8。實(shí)驗(yàn)輸入為訪問頁(yè)面序列,比如0,1,3,2,7,1

      實(shí)驗(yàn)用到的軟件(:)

      DevC++,Visio

      實(shí)驗(yàn)內(nèi)容及關(guān)鍵步驟(代碼)Q3(15分)

      得分:

      流程圖:輸入頁(yè)面訪問序列

      取訪問的頁(yè)號(hào)

      查頁(yè)表

      是否缺頁(yè)?

      置缺頁(yè)標(biāo)志flag為’*’

      按算法不同淘汰一頁(yè)面

      調(diào)入所訪問的頁(yè)面

      FIFO算法流程圖

      LRU算法流程圖:

      函數(shù)關(guān)系解釋圖:

      實(shí)現(xiàn)結(jié)果:

      圖1

      圖2

      代碼:

      #include

      #include

      #define

      MEMORY_SIZE

      /*物理塊數(shù)*/

      #define

      PROESS_SIZE

      /*頁(yè)面號(hào)引用串個(gè)數(shù)*/#include

      #include

      /*全局變量*/

      int

      mSIZE=4;

      int

      pSIZE=8;

      static

      int

      memery[4]={0};

      /*物理塊中的頁(yè)號(hào)*/

      static

      int

      page[8]={0};

      /*頁(yè)面號(hào)引用串*/

      static

      int

      temp[8][4]={0};

      /*輔助數(shù)組*/

      /*置換算法函數(shù)*/

      void

      FIFO();

      void

      LRU();

      void

      OPT();

      void

      designBy();

      /*輔助函數(shù)*/

      void

      print(unsigned

      int

      t);

      /*主函數(shù)*/

      int

      main()

      {

      int

      i,k,code;

      designBy();

      system(“color

      0A“);

      puts(“請(qǐng)依次輸入頁(yè)面號(hào)(8個(gè)):“);

      for(i=0;i

      scanf(“%1d“,&page[i]);

      system(“cls“);

      system(“color

      0E“);

      do{

      puts(“輸入的頁(yè)面號(hào)引用串為:“);

      for(k=0;k<=(pSIZE-1)/20;k++)

      {

      for(i=20*k;(i

      {

      if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

      printf(“%d\n“,page[i]);

      else

      printf(“%d

      “,page[i]);

      }

      }

      printf(“*

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *\n“);

      printf(“*

      請(qǐng)選擇頁(yè)面置換算法:\t\t\t

      *\n“);

      printf(“*

      -----------------------------------------

      *\n“);

      printf(“*

      1.先進(jìn)先出(FIFO)

      2.最近最久未使用(LRU)

      *\n“);

      printf(“*

      3.退出

      *\n“);

      printf(“*

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *

      *\n“);

      printf(“請(qǐng)選擇操作:[

      ]\b\b“);

      scanf(“%d“,&code);

      switch(code)

      {

      case

      1:

      FIFO();

      break;

      case

      2:

      LRU();

      break;

      case

      3:

      system(“cls“);

      system(“color

      0A“);

      exit(0);

      default:

      printf(“輸入錯(cuò)誤,請(qǐng)重新輸入:“);

      }

      printf(“按任意鍵重新選擇置換算法:>>>“);

      getch();

      system(“cls“);

      }while

      (code!=3);

      getch();

      }

      void

      print(unsigned

      int

      t)

      {

      int

      i,j,k,l;

      int

      flag;

      for(k=0;k<=(pSIZE-1)/20;k++)

      {

      for(i=20*k;(i

      {

      if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

      printf(“%d\n“,page[i]);

      else

      printf(“%d

      “,page[i]);

      }

      for(j=0;j

      {

      for(i=20*k;(i{

      if(i>=j)

      printf(“

      |%d|“,temp[i][j]);

      else

      printf(“

      |

      |“);

      }

      for(i=mSIZE+20*k;(i

      {

      for(flag=0,l=0;l

      if(temp[i][l]==temp[i-1][l])

      flag++;

      if(flag==mSIZE)/*頁(yè)面在物理塊中*/

      printf(“

      “);

      else

      printf(“

      |%d|“,temp[i][j]);

      }

      /*每行顯示20個(gè)*/

      if(i%20==0)

      continue;

      printf(“\n“);

      }

      }

      printf(“----------------------------------------\n“);

      printf(“缺頁(yè)次數(shù):%d\t\t“,t+mSIZE);

      printf(“缺頁(yè)率:%d/%d\n“,t+mSIZE,pSIZE);

      printf(“置換次數(shù):%d\t\t“,t);

      printf(“訪問命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE);

      printf(“----------------------------------------\n“);

      }

      /*先進(jìn)先出頁(yè)面置換算法*/

      void

      FIFO()

      {

      int

      memery[10]={0};

      int

      time[10]={0};

      /*記錄進(jìn)入物理塊的時(shí)間*/

      int

      i,j,k,m;

      int

      max=0;

      /*記錄換出頁(yè)*/

      int

      count=0;

      /*記錄置換次數(shù)*/

      /*前mSIZE個(gè)數(shù)直接放入*/

      for(i=0;i

      {

      memery[i]=page[i];

      time[i]=i;

      for(j=0;j

      temp[i][j]=memery[j];

      }

      for(i=mSIZE;i

      {

      /*判斷新頁(yè)面號(hào)是否在物理塊中*/

      for(j=0,k=0;j

      {

      if(memery[j]!=page[i])

      k++;

      }

      if(k==mSIZE)

      /*如果不在物理塊中*/

      {

      count++;

      /*計(jì)算換出頁(yè)*/

      max=time[0]

      for(m=2;m

      if(time[m]

      max=m;

      memery[max]=page[i];

      time[max]=i;

      /*記錄該頁(yè)進(jìn)入物理塊的時(shí)間*/

      for(j=0;j

      temp[i][j]=memery[j];

      }

      else

      {

      for(j=0;j

      temp[i][j]=memery[j];

      }

      }

      print(count);

      }

      /*最近最久未使用置換算法*/

      void

      LRU()

      {

      int

      memery[10]={0};

      int

      flag[10]={0};

      /*記錄頁(yè)面的訪問時(shí)間*/

      int

      i,j,k,m;

      int

      max=0;

      /*記錄換出頁(yè)*/

      int

      count=0;

      /*記錄置換次數(shù)*/

      /*前mSIZE個(gè)數(shù)直接放入*/

      for(i=0;i

      {

      memery[i]=page[i];

      flag[i]=i;

      for(j=0;j

      temp[i][j]=memery[j];

      }

      for(i=mSIZE;i

      {

      /*判斷新頁(yè)面號(hào)是否在物理塊中*/

      for(j=0,k=0;j

      {

      if(memery[j]!=page[i])

      k++;

      else

      flag[j]=i;

      /*刷新該頁(yè)的訪問時(shí)間*/

      }

      if(k==mSIZE)

      /*如果不在物理塊中*/

      {

      count++;

      /*計(jì)算換出頁(yè)*/

      max=flag[0]

      for(m=2;m

      if(flag[m]

      max=m;

      memery[max]=page[i];

      flag[max]=i;

      /*記錄該頁(yè)的訪問時(shí)間*/

      for(j=0;j

      temp[i][j]=memery[j];

      }

      else

      {

      for(j=0;j

      temp[i][j]=memery[j];

      }

      }

      //

      compute();

      print(count);

      }

      /*顯示設(shè)計(jì)者信息*/

      void

      designBy()

      {

      printf(“┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n“);

      printf(“┃㊣

      實(shí)驗(yàn)七:頁(yè)面置換算法

      ㊣┃\n“);

      printf(“┃

      學(xué)號(hào):1001010042

      ┃\n“);

      printf(“┃

      姓名:黃浩全

      4.9.9.0>┃\n“);

      printf(“┣━━━━━━━━━━━━━━━━━━━━━━━━━┫\n“);

      }

      實(shí)驗(yàn)過程中遇到的問題解決辦法與實(shí)驗(yàn)體會(huì)Q4(需手寫,10分)

      得分:

      1、在FIFO算法可以很容易用數(shù)組實(shí)現(xiàn),而LRU算法可以用數(shù)組實(shí)現(xiàn),不過用結(jié)構(gòu)體會(huì)更明顯簡(jiǎn)單。結(jié)構(gòu)體成員變量可以記錄頁(yè)號(hào)進(jìn)入的時(shí)間,和最近使用的記錄。相對(duì)比數(shù)組更容易理解和實(shí)現(xiàn)。

      2:首先,F(xiàn)IFO(先進(jìn)先出)算法和LRU(最近未使用算法)兩者之間,F(xiàn)IFO算法明顯會(huì)比LRU容易理解,而且比LRU算法較容易實(shí)現(xiàn),但在性能方面,LRU的確在優(yōu)化方面做的比較理想。再且在考慮頁(yè)框和頁(yè)表號(hào)之間的問題用代碼可以容易模擬,但是真是在物理內(nèi)存塊中是如何實(shí)現(xiàn),那確實(shí)是很難以理解,需要真正理解到內(nèi)存內(nèi)部的知識(shí)才知道這兩個(gè)算法是怎么實(shí)現(xiàn)的。

      評(píng)閱教師特殊評(píng)語(yǔ):

      評(píng)閱教師:

      期:

      第五篇:計(jì)算機(jī)操作系統(tǒng) 課程設(shè)計(jì)報(bào)告 銀行家算法

      《計(jì)算機(jī)操作系統(tǒng)》

      課 程 設(shè) 計(jì) 報(bào) 告

      題 目: 銀行家算法

      班 級(jí): XXXXXXXXXXXXXXXX 姓 名: XXM 學(xué) 號(hào): XXXXXXXXXXXX 指導(dǎo)老師: XXXXXXXXXXXXXX 設(shè)計(jì)時(shí)間: XXXXXXXXXXXXXXX 一.設(shè)計(jì)目的

      1、掌握死鎖概念、死鎖發(fā)生的原因、死鎖產(chǎn)生的必要條件;

      2、掌握死鎖的預(yù)防、死鎖的避免;

      3、深刻理解死鎖的避免:安全狀態(tài)和銀行家算法;

      二.銀行家算法

      1.簡(jiǎn)介

      銀行家算法是一種最有代表性的避免死鎖的算法。在避免死鎖方法中允許進(jìn)程動(dòng)態(tài)地申請(qǐng)資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計(jì)算此次分配資源的安全性,若分配不會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則分配,否則等待。為實(shí)現(xiàn)銀行家算法,系統(tǒng)必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。

      2.數(shù)據(jù)結(jié)構(gòu)

      1)可利用資源向量Available 是個(gè)含有m個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類可利用的資源數(shù)目。如果Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj類資源K個(gè)。2)最大需求矩陣Max 這是一個(gè)n×m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類資源的最大需求。如果Max[i,j]=K,則表示進(jìn)程i需要Rj類資源的最大數(shù)目為K。3)分配矩陣Allocation 這也是一個(gè)n×m的矩陣,它定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。如果Allocation[i,j]=K,則表示進(jìn)程i當(dāng)前已分得Rj類資源的 數(shù)目為K。4)需求矩陣Need 這也是一個(gè)n×m的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類資源數(shù)。如果Need[i,j]=K,則表示進(jìn)程i還需要Rj類資源K個(gè),方能完成其任務(wù)。Need[i,j]=Max[i,j]-Allocation[i,j].3.算法原理

      操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源時(shí),要測(cè)試該進(jìn)程對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請(qǐng)量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程本次申請(qǐng)的資源數(shù)是否超過了該資源所剩余的總量。若超過則拒絕分配資源,若能滿足則按當(dāng)前的申請(qǐng)量分配資源,否則也要推遲分配。

      三.算法實(shí)現(xiàn)

      1.初始化

      由用戶輸入數(shù)據(jù),分別對(duì)可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。

      2.銀行家算法

      在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。

      銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。設(shè)進(jìn)程cusneed提出請(qǐng)求REQUEST [i],則銀行家算法按如下規(guī)則進(jìn)行判斷。(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(zhuǎn)(2);否則,出錯(cuò)。(2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(zhuǎn)(3);否則,出錯(cuò)。(3)系統(tǒng)試探分配資源,修改相關(guān)數(shù)據(jù): AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險(xiǎn)性分配作廢,系統(tǒng)恢復(fù)原狀,進(jìn)程等待。

      3.安全性檢查算法

      (1)設(shè)置兩個(gè)工作向量Work=AVAILABLE;FINISH(2)從進(jìn)程集合中找到一個(gè)滿足下述條件的進(jìn)程,F(xiàn)INISH==false;NEED<=Work;如找到,執(zhí)行(3);否則,執(zhí)行(4)(3)設(shè)進(jìn)程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的進(jìn)程Finish= true,則表示安全;否則系統(tǒng)不安全。

      4.算法流程圖

      1)初始化算法流程圖

      2)銀行家算法流程圖:

      3)安全性算法流程圖:

      4.代碼(C語(yǔ)言)

      #include #include #include #include /*用到了getch()*/ #define M 5 /*進(jìn)程數(shù)*/ #define N 3 /*資源數(shù)*/ #define FALSE 0 #define TRUE 1

      /*M個(gè)進(jìn)程對(duì)N類資源最大資源需求量*/ int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};/*系統(tǒng)可用資源數(shù)*/ int AVAILABLE[N]={10,5,7};/*M個(gè)進(jìn)程對(duì)N類資源最大資源需求量*/ int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};

      /*M個(gè)進(jìn)程已經(jīng)得到N類資源的資源量 */ int

      NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

      /*M個(gè)進(jìn)程還需要N類資源的資源量*/ int Request[N]={0,0,0};

      void main(){

      int i=0,j=0;char flag;

      void showdata();void changdata(int);void rstordata(int);int chkerr(int);showdata();enter:{

      printf(“請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)(從0到”);

      printf(“%d”,M-1);

      printf(“):”);

      scanf(“%d”,&i);} if(i<0||i>=M){

      printf(“輸入的進(jìn)程號(hào)不存在,重新輸入!n”);

      goto enter;}

      err:{

      printf(“請(qǐng)輸入進(jìn)程”);

      printf(“%d”,i);

      printf(“申請(qǐng)的資源數(shù)n”);

      printf(“類別: A B Cn”);printf(“ ”);

      for(j=0;j

      {

      scanf(“%d”,&Request[j]);

      if(Request[j]>NEED[i][j])

      {

      printf(“%d”,i);

      printf(“號(hào)進(jìn)程”);

      printf(“申請(qǐng)的資源數(shù) > 進(jìn)程”);

      printf(“%d”,i);

      printf(“還需要”);

      printf(“%d”,j);printf(“類資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!n”);

      goto err;

      }

      else

      {

      if(Request[j]>AVAILABLE[j])

      {

      printf(“進(jìn)程

      ”);

      printf(“%d”,i);

      printf(“申請(qǐng)的資源數(shù)大于系統(tǒng)可用”);

      printf(“%d”,j);

      printf(“類資源的資源量!申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!n”);

      goto err;

      }

      }

      } }

      changdata(i);if(chkerr(i)){

      rstordata(i);

      showdata();} else

      showdata();

      printf(“n”);

      printf(“按'y'或'Y'鍵繼續(xù),否則退出n”);

      flag=getch();

      if(flag=='y'||flag=='Y'){

      goto enter;

      } else {

      exit(0);}

      }

      /*顯示數(shù)組*/ void showdata(){ int i,j;printf(“系統(tǒng)可用資源向量:n”);printf(“***Available***n”);printf(“資源類別: A B Cn”);printf(“資源數(shù)目:”);for(j=0;j

      printf(“%d ”,AVAILABLE[j]);} printf(“n”);printf(“n”);printf(“各進(jìn)程還需要的資源量:n”);printf(“******Need******n”);printf(“資源類別: A B Cn”);for(i=0;i

      printf(“ ”);

      printf(“%d”,i);

      printf(“號(hào)進(jìn)程:”);

      for(j=0;j

      {

      printf(“

      %d ”,NEED[i][j]);

      }

      printf(“n”);} printf(“n”);printf(“各進(jìn)程已經(jīng)得到的資源量: n”);printf(“***Allocation***n”);printf(“資源類別: A B Cn”);for(i=0;i

      printf(“ ”);

      printf(“%d”,i);

      printf(“號(hào)進(jìn)程:”);

      /*printf(“:n”);*/

      for(j=0;j

      {

      printf(“

      %d ”,ALLOCATION[i][j]);

      }

      printf(“n”);

      }

      printf(“n”);}

      /*系統(tǒng)對(duì)進(jìn)程請(qǐng)求響應(yīng),資源向量改變*/ void changdata(int k){ int j;

      for(j=0;j

      AVAILABLE[j]=AVAILABLE[j]-Request[j];

      ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];

      NEED[k][j]=NEED[k][j]-Request[j];}

      }

      /*資源向量改變*/

      void rstordata(int k)

      { int j;

      for(j=0;j

      AVAILABLE[j]=AVAILABLE[j]+Request

      [j];

      ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];

      NEED[k][j]=NEED[k][j]+Request[j];

      }

      }

      /*安全性檢查函數(shù)*/ int chkerr(int s){ int WORK,FINISH[M],temp[M];int i,j,k=0;

      for(i=0;i

      WORK=AVAILABLE[j];

      i=s;

      printf(“n”);

      while(i

      {

      if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)

      {

      printf(“系統(tǒng)不安全!本次資源申請(qǐng)不成功!n”);

      printf(“n”);

      return 1;

      }

      }

      } WORK=WORK+ALLOCATION[i][j];

      FINISH[i]=TRUE;

      temp[k]=i;k++;i=0;

      printf(“n”);

      printf(“經(jīng)安全性檢查,系統(tǒng)安全,本printf(”n“);

      printf(” 本次安全序列:n“);printf(”進(jìn)程依次為“);for(i=0;i

      printf(”%d“,temp[i]);

      次分配成功。n”);} else { i++;} } for(i=0;i

      printf(“-> ”);}

      printf(“n”);return 0;四.程序運(yùn)行截圖

      0號(hào)進(jìn)程申請(qǐng)資源{1,2,3},各向量發(fā)生變化

      0和進(jìn)程繼續(xù)申請(qǐng)資源{2,2,0},各向量變化

      2號(hào)進(jìn)程申請(qǐng)資源,由于NEED[2]={9,0,2},前兩次申請(qǐng)不合理,系統(tǒng)處于不安全狀態(tài)太。第三次2號(hào)申請(qǐng)資源向量為{1,0,2},系統(tǒng)回到安全狀態(tài),并得出新的安全序列3-0-1-2-4。

      五.心得體會(huì)

      從此次的課程設(shè)計(jì)中,我收獲很多。首先也是最重要的一點(diǎn)是對(duì)處理機(jī)調(diào)度與死鎖有了深入的理解;其次,再次鞏固了C語(yǔ)言編程。

      在用C語(yǔ)言設(shè)計(jì)和編寫銀行家算法和安全性檢查算法時(shí)遇到了一些困難都克服了。在使程序界面美觀、能夠持續(xù)循環(huán)運(yùn)行時(shí)用了很多方法,花了比較多的時(shí)間。最后選擇用goto語(yǔ)句控制,我覺得在此實(shí)驗(yàn)中比較好,代碼閱讀起來(lái)更加方便。

      下載計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法word格式文檔
      下載計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        頁(yè)面置換算法模擬實(shí)驗(yàn) 操作系統(tǒng)大作業(yè)(含源文件)(合集五篇)

        “計(jì)算機(jī)操作系統(tǒng)”課程設(shè)計(jì)大作業(yè) 頁(yè)面置換算法模擬實(shí)驗(yàn) (含完整資料,可直接提交) 一、題目: 頁(yè)面置換算法模擬實(shí)驗(yàn) 二、目的 分別采用最佳(Optimal)置換算法、先進(jìn)先出(FI......

        操作系統(tǒng)實(shí)驗(yàn)報(bào)告(clock算法)

        實(shí)驗(yàn)四 頁(yè)面置換算法 一、實(shí)驗(yàn)?zāi)康?本實(shí)驗(yàn)主要對(duì)操作系統(tǒng)中請(qǐng)求分頁(yè)式內(nèi)存管理及其應(yīng)用的一些關(guān)鍵算法進(jìn)行模擬。學(xué)生通過設(shè)計(jì)與實(shí)現(xiàn)Clock算法,能夠加強(qiáng)對(duì)相應(yīng)理論的理解,并對(duì)......

        操作系統(tǒng)銀行家算法實(shí)驗(yàn)報(bào)告

        實(shí)驗(yàn)四死鎖 一、 實(shí)驗(yàn)?zāi)康? 當(dāng)系統(tǒng)的總資源數(shù)m小于或等于所有進(jìn)程對(duì)對(duì)資源的最大需求時(shí),就可能產(chǎn)生 死鎖。死鎖會(huì)引起計(jì)算機(jī)系統(tǒng)的癱瘓。銀行家算法是在實(shí)現(xiàn)資源分配時(shí)避免......

        操作系統(tǒng)課程設(shè)計(jì)六種算法

        《計(jì)算機(jī)操作系統(tǒng)》 學(xué)號(hào):班級(jí):軟技姓名:張靖?jìng)?課 程 設(shè) 計(jì) 報(bào) 告 4班 1367003270 目錄 1 實(shí)驗(yàn):進(jìn)程調(diào)度算法——時(shí)間片輪轉(zhuǎn)算法 2 實(shí)驗(yàn):銀行家算法3 實(shí)驗(yàn):分區(qū)分配算法——4......

        《操作系統(tǒng)原理》算法總結(jié)

        《操作系統(tǒng)原理》算法總結(jié) 一、進(jìn)程(作業(yè))調(diào)度算法 ? 先來(lái)先服務(wù)調(diào)度算法(FCFS):每次調(diào)度是從就緒隊(duì)列中,選擇一個(gè)最先進(jìn)入就緒隊(duì)列的進(jìn)程,把處理器分配給該進(jìn)程,使之得到執(zhí)行。該......

        操作系統(tǒng)實(shí)驗(yàn)

        操作系統(tǒng)實(shí)驗(yàn) 實(shí)驗(yàn)一Linux常用命令實(shí)驗(yàn) 一.目的和要求 本實(shí)驗(yàn)的目的是熟悉Linux操作系統(tǒng)的命令接口、圖形接口和程序接口;了解Linux操作系統(tǒng)的啟動(dòng)過程;了解Linux操作系統(tǒng)的目......

        頁(yè)面置換算法模擬

        “計(jì)算機(jī)操作系統(tǒng)”課程設(shè)計(jì)大作業(yè) 一、題目: 頁(yè)面置換算法模擬實(shí)驗(yàn) 二、目的 分別采用最佳(Optimal)置換算法、先進(jìn)先出(FIFO)頁(yè)面置換算法和最近最少使用(LRU)置換算法對(duì)......

        頁(yè)面置換算法實(shí)驗(yàn)報(bào)告(精選)

        《操作系統(tǒng)--頁(yè)面置換算法》 實(shí)驗(yàn)報(bào)告 姓名: 范學(xué)升學(xué)號(hào):1001050903 班級(jí):電科10-1班專業(yè):電子信息科學(xué)與技術(shù) 一、實(shí)驗(yàn)?zāi)康?1.通過模擬實(shí)現(xiàn)幾種基本頁(yè)面置換的算法,了解虛擬存儲(chǔ)......