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

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

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

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

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

      實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法

      時(shí)間:2019-05-11 22:42:37下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法》。

      第一篇:實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法

      實(shí)驗(yàn)報(bào)告六磁盤調(diào)度算法

      班級(jí):軟技2班學(xué)號(hào):201467003084

      姓名:劉道林

      一.

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

      熟悉磁盤的結(jié)構(gòu)以及磁盤的驅(qū)動(dòng)調(diào)度算法的模擬,編程實(shí)現(xiàn)簡(jiǎn)單常用的磁盤驅(qū)動(dòng)調(diào)度算法先來(lái)先服務(wù)(FIFO)、電梯調(diào)度算法、最短尋找時(shí)間優(yōu)先算法、掃描(雙向掃描)算法、單向掃描(循環(huán)掃描)算法等。編程只需實(shí)現(xiàn)兩個(gè)算法。

      題目可

      以選取教材或習(xí)題中的相關(guān)編程實(shí)例。

      編程語(yǔ)言建議采用c/c++或Java。模擬程序鼓勵(lì)采用隨機(jī)數(shù)技術(shù)、動(dòng)態(tài)空間分配技術(shù),有條件 的最好能用圖形界面展現(xiàn)甚至用動(dòng)畫模擬。

      實(shí)驗(yàn)性質(zhì):驗(yàn)證型。

      二.

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

      1)掌握使用一門語(yǔ)言進(jìn)行磁盤驅(qū)動(dòng)調(diào)度算法的模擬;

      2)編寫程序?qū)⒋疟P驅(qū)動(dòng)調(diào)度算法的過(guò)程和結(jié)果能以 較簡(jiǎn)明直觀的方式展現(xiàn) 出來(lái)。

      三. 實(shí)驗(yàn)原理、方法和步驟

      1.實(shí)驗(yàn)原理

      磁盤驅(qū)動(dòng)調(diào)度對(duì)磁盤的效率有重要影響。磁盤驅(qū)動(dòng)調(diào)度算法的好壞直接影響輔助存儲(chǔ)器的效率,從而影響計(jì)算機(jī)系統(tǒng)的整體效率。

      常用的磁盤驅(qū)動(dòng)調(diào)度算法有:最簡(jiǎn)單的磁盤驅(qū)動(dòng)調(diào)度算法是先入先出(FIFO)法。這種算法的實(shí)質(zhì)是,總是嚴(yán)格按時(shí)間順序?qū)Υ疟P請(qǐng)

      求予以處理。算法實(shí)現(xiàn)簡(jiǎn)單、易于理解并且相對(duì)公平,不會(huì)發(fā)生進(jìn)程餓死現(xiàn)象。但該算法可能會(huì)移動(dòng)的柱面數(shù)較多并且會(huì)經(jīng)常更換移

      動(dòng)方向,效率有待提高。

      最短尋找時(shí)間優(yōu)先算法:總是優(yōu)先處理最靠近的請(qǐng)求。該算法移動(dòng)的柱面距離較小,但可能會(huì)經(jīng)常改變

      移動(dòng)方向,并且可能會(huì)發(fā)生進(jìn)程饑餓現(xiàn)象。

      電梯調(diào)度:總是將一個(gè)方向上的請(qǐng)求全部處理完后,才改變方向繼續(xù)處理其他請(qǐng)求。

      掃描(雙向掃描):總是從最外向最里進(jìn)行掃描,然后在從最里向最外掃描。該算法與電梯調(diào)度算法的區(qū)別是電梯調(diào)度在沒(méi)有最外或

      最里的請(qǐng)求時(shí)不會(huì)移動(dòng)到最外或最里柱面,二掃描算法總是移到最外、最里柱面。兩端的請(qǐng)求有優(yōu)先服被務(wù)的跡象。

      循環(huán)掃描(單 向掃描):從最外向最里進(jìn)行柱面請(qǐng)求處理,到最里柱面后,直接跳到最外柱面然后繼續(xù)向里進(jìn)行處理。該算法與掃描算法的區(qū)別是,回來(lái)過(guò)程不處理請(qǐng)求,基于這樣的事實(shí),因?yàn)槔锒藙偙惶幚怼?/p>

      2.實(shí)驗(yàn)方法

      1)使用流程圖描述演示程序的設(shè)計(jì)思想;

      2)選取c/c++、Java等計(jì)算機(jī)語(yǔ)言,編程調(diào)試,最終給出運(yùn)行正確的程序。

      四.

      實(shí)驗(yàn)結(jié)果分析

      能夠?qū)⒋疟P驅(qū)動(dòng)調(diào)度算法在各種情況下都能得出正確的結(jié)論。對(duì)FIFO、最短尋找時(shí)間優(yōu)先或電梯調(diào)度算法能夠

      在多次模擬數(shù)據(jù)下得出平均移動(dòng)柱面數(shù),并進(jìn)行效率比較分析

      五.源程序代碼 #include #include #include #include typedef struct _proc {

      char name[32];

      /*定義進(jìn)程名稱*/

      int team;

      /*定義柱面號(hào)*/

      int ci;

      /*定義磁道面號(hào)*/

      int rec;

      /*定義記錄號(hào)*/

      struct _proc *prior;

      struct _proc *next;}

      PROC;

      PROC *g_head=NULL,*g_curr=NULL,*local;

      int record=0;

      int yi=1;void init(){

      PROC *p;

      鏈表(初始I/O表)*/

      g_head =(PROC*)malloc(sizeof(PROC));

      g_head->next = NULL;

      g_head->prior = NULL;

      p =(PROC*)malloc(sizeof(PROC));

      strcpy(p->name, “P1”);

      p->team=100;

      p->ci=10;

      p->rec=1;

      p->next = NULL;

      p->prior = g_head;

      g_head->next = p;

      g_curr=g_head->next;

      p =(PROC*)malloc(sizeof(PROC));

      strcpy(p->name, “P2”);

      p->team=30;

      p->ci=5;

      p->rec=5;

      /*初始化

      p->next = NULL;

      p->prior = g_curr;

      g_curr->next = p;

      g_curr=p;

      p =(PROC*)malloc(sizeof(PROC));

      strcpy(p->name, “P3”);

      p->team=40;

      p->ci=2;

      p->rec=4;

      } void PrintInit()

      {

      p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=p;p =(PROC*)malloc(sizeof(PROC));strcpy(p->name, “P4”);p->team=85;p->ci=7;p->rec=3;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=p;p =(PROC*)malloc(sizeof(PROC));strcpy(p->name, “P5”);p->team=60;p->ci=8;p->rec=4;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=g_head->next;local =(PROC*)malloc(sizeof(PROC));

      /*選中進(jìn)程*/ strcpy(local->name, “P0”);local->team=0;local->ci=0;local->rec=0;local->next=NULL;local->prior=NULL;

      /*打印I/O表*/ PROC *t = g_head->next;printf(“------n”);printf(“

      ---------I/O LIST---------n”);printf(“ process

      team

      ci

      rec

      n”);while(t!=NULL)

      {

      printf(“%4s %8d %8d %5dn”, t->name, t->team, t->ci, t->rec);

      t = t->next;

      }

      printf(“nnCurrent process is :n”);

      printf(“------------------------------nn”);

      printf(“ process

      team

      ci

      rec

      n”);

      printf(“%4s %8d %8d %5dn”, local->name, local->team, local->ci, local->rec);

      switch(yi)

      {

      case 1:

      {

      printf(“current direction is UPn”);

      break;

      }

      case 0:

      {

      printf(“current direction is downn”);

      break;

      }

      } } void acceptreq()

      /*接受請(qǐng)求函數(shù)*/

      {

      PROC *p;

      p =(PROC*)malloc(sizeof(PROC));

      printf(“please input the information of the new processnprocess-name:nprocess-teamnprocess-cinprocess-recn”);

      printf(“1.namen”);

      scanf(“%s”,p->name);

      printf(“2.team 0-199n”);

      scanf(“%d”,&p->team);

      /*輸入請(qǐng)求進(jìn)程信息*/

      printf(“3.ci 0-19n”);

      scanf(“%d”,&p->ci);

      printf(“4.rec 0-7n”);

      scanf(“%d”,&p->rec);

      getchar();

      g_curr=g_head;

      /*將此節(jié)點(diǎn)鏈入I/O請(qǐng)求表*/

      while(g_curr->next!=NULL)g_curr=g_curr->next;

      p->next=NULL;

      p->prior=g_curr;

      g_curr->next=p;

      g_curr=g_head->next;

      printf(“NEW I/O LISTnn”);

      PrintInit();

      /*將新的I/O請(qǐng)求表輸出*/ } void qddd()

      /*驅(qū)動(dòng)調(diào)度函數(shù)*/

      {

      PROC *out;

      int min;

      int max=g_head->next->team;

      if(g_head->next==NULL);

      /*若已全部調(diào)度,則空操作*/

      else

      {

      switch(yi)

      {

      case 1:

      {

      min=g_head->next->team;

      out=g_head->next;

      /*選出最小的team進(jìn)程,模擬啟動(dòng)此進(jìn)程*/

      strcpy(local->name,out->name);

      local->team=out->team;

      local->ci=out->ci;

      local->rec=out->rec;

      for(g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

      {

      if(g_curr->team > record)

      {

      min = g_curr->team;

      break;

      }

      }

      for(g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

      {

      if(min>=g_curr->team&&g_curr->team>record)

      {

      min=g_curr->team;out=g_curr;

      strcpy(local->name,out->name);

      local->team=out->team;local->ci=out->ci;local->rec=out->rec;

      }

      }

      printf(“n-----------------------n”);

      printf(“the process choosed :n”);

      printf(“ process

      team

      ci

      rec

      n”);

      printf(“%4s %8d %8d %5dn”, out->name, out->team, out->ci,out->rec);

      (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

      (maxteam)max=g_curr->team;

      if(max==record)

      yi=0;

      record=1000;

      break;

      break;

      }/*case 1*/

      case /*case 1 的對(duì)稱過(guò)程*/

      {

      max=g_head->next->team;

      strcpy(local->name,out->name);

      local->team=out->team;

      record = local->team;printf(“%d”,record);for

      {

      if

      }

      {

      }

      0:

      out=g_head->next;

      local->ci=out->ci;

      local->rec=out->rec;

      for(g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

      {

      if(g_curr->team < record)

      {

      max = g_curr->team;

      break;

      }

      (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

      {

      if(max<=g_curr->team&&g_curr->team

      {

      max=g_curr->team;out=g_curr;

      strcpy(local->name,out->name);

      local->team=out->team;

      local->ci=out->ci;local->rec=out->rec;

      }

      }

      printf(“n-----------------------n”);

      printf(“the process choosed :n”);

      printf(“ process

      team

      ci

      rec

      n”);

      printf(“%4s %8d %8d %5dn”, out->name, out->team, out->ci,out->rec);

      }

      for

      min=g_head->next->team;

      for(g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next)

      {

      if(min>g_curr->team)min=g_curr->team;

      }

      record = local->team;

      if(min==record)

      {

      yi=1;record=0;

      break;

      }

      break;

      }

      default : return-1;

      }/*switch*/

      if(out->next==NULL)

      /*將選中的進(jìn)程從I/O請(qǐng)求表中刪除*/

      {

      out->prior->next=NULL;free(out);

      }

      else

      {

      out->prior->next=out->next;

      out->next->prior=out->prior;

      free(out);

      }

      }/*else*/ } void acceptnum()

      /*通過(guò)輸入0~1選擇‘驅(qū)動(dòng)調(diào)度’或是‘接受請(qǐng)求’*/

      {

      float num;

      char c;

      while(1)

      {

      printf(“---------------n”);

      printf(“please input a number between 0 and 1nnum<=0.5:accept requestnnum>0.5:qudong diaodunnnum==2:I/O LISTnnnum=?n”);

      scanf(“%f”,&num);

      getchar();

      while((num<0||num>1)&&num!=2)

      /*過(guò)濾不合法數(shù)據(jù) 注意:本程序其他輸入數(shù)據(jù)可能未過(guò)濾*/

      {

      printf(“number ERROR!Input again please!nnum=?n ”);

      scanf(“%f”,&num);

      getchar();

      }

      if(num>0.5&&num!=2)

      /*驅(qū)動(dòng)調(diào)度*/

      {

      if(g_head->next==NULL)

      {

      printf(“nn”);

      printf(“---------------------n”);

      printf(“I/O list is empty!!n”);

      /*請(qǐng)求表為空 無(wú)需調(diào)度*/

      }

      else

      {

      printf(“qudong diaodun”);

      qddd();

      /*調(diào)用函數(shù)進(jìn)行調(diào)度*/

      }

      }

      else if(num<=0.5)

      /*接受請(qǐng)求*/

      {

      printf(“accept requestnn”);

      acceptreq();

      }

      else if(num==2)

      /*通過(guò)輸入2顯示當(dāng)前請(qǐng)求I/O表*/

      {

      printf(“I/O LIST;”);

      printf(“-------------------n”);

      PrintInit();

      printf(“n”);

      printf(“-----------------------n”);

      printf(“choose 'n' to quit else to continuen”);

      if(strcmp(c=getchar(),'n')==0||strcmp(c=getchar(),'N')==0)

      clrscr();

      printf(“nnnnnn”);

      printf(“thank you for testing my program!n”);

      printf(“

      ---by

      01n”);

      sleep(2);

      printf(“nnBYEbye!”);

      sleep(2);

      return-1;

      else

      {

      clrscr();

      }

      /*輸入n離開(kāi)本程序*/

      {

      }

      }

      } } main()

      /*主程序*/ {

      init();

      PrintInit();

      acceptnum();}

      第二篇:操作系統(tǒng)課程設(shè)計(jì)-磁盤調(diào)度算法

      1.實(shí)驗(yàn)題目:

      磁盤調(diào)度算法。

      建立相應(yīng)的數(shù)據(jù)結(jié)構(gòu);

      在屏幕上顯示磁盤請(qǐng)求的服務(wù)狀況;

      將一批磁盤請(qǐng)求的情況存磁盤文件,以后可以讀出并重放; 計(jì)算磁頭移動(dòng)的總距離及平均移動(dòng)距離; 支持算法:FIFO、SSTF、SCAN、CSCAN;

      2.設(shè)計(jì)目的:

      調(diào)度磁盤I/O請(qǐng)求服務(wù),采用好的方式能提高訪問(wèn)時(shí)間和帶寬。本實(shí)驗(yàn)通過(guò)編程對(duì)磁盤調(diào)度算法的實(shí)現(xiàn),加深對(duì)算法的理解,同時(shí)通過(guò)用C++語(yǔ)言編寫程序?qū)崿F(xiàn)這些算法,并在windos平臺(tái)上實(shí)現(xiàn),更好的掌握操作系統(tǒng)的原理以及實(shí)現(xiàn)方法,提高綜合運(yùn)用專業(yè)課知識(shí)的能力。

      3.任務(wù)及要求

      3.1 設(shè)計(jì)任務(wù)

      編程實(shí)現(xiàn)下述磁盤調(diào)度算法,并求出每種算法的平均尋道長(zhǎng)度:

      1、先來(lái)先服務(wù)算法(FCFS)

      2、最短尋道時(shí)間算法(SSTF)

      3、掃描算法(SCAN)

      4、循環(huán)掃描算法(CSCAN)

      3.2 設(shè)計(jì)要求

      對(duì)用戶指定的磁盤調(diào)度請(qǐng)求序列,基于以上四種算法,實(shí)現(xiàn)各自的調(diào)度順序并輸出,同時(shí)計(jì)算出各種算法下的平均尋道長(zhǎng)度。

      4.算法及數(shù)據(jù)結(jié)構(gòu)

      4.1算法的總體思想

      queue[n] 為請(qǐng)求調(diào)度序列,diskrode為磁盤磁道數(shù),headstarts為正在調(diào)度的磁道

      ①先來(lái)先服務(wù)算法(FCFS)按queue[n]數(shù)組的順序進(jìn)行磁盤調(diào)度,將前一個(gè)調(diào)度磁道與下一個(gè)調(diào)度磁道的差值累加起來(lái),得到總的尋道長(zhǎng)度,再除以n得到平均尋道長(zhǎng)度。

      ②最短尋道時(shí)間優(yōu)先算法(SSTF)將queue[n]進(jìn)行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,通過(guò)循環(huán)語(yǔ)句找出離起始磁頭最短的位置。

      ③掃描算法(SCAN)

      將queue[n]進(jìn)行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當(dāng)?shù)蓝它c(diǎn)(queue[0]或queue[n-1])時(shí),再在定位處反向遍歷到另一端。當(dāng)調(diào)度磁道不在queue端點(diǎn)時(shí),總的尋道長(zhǎng)度為為前一個(gè)磁道與后一個(gè)磁

      道差值的累加,當(dāng)?shù)竭_(dá)端點(diǎn)且queue[n]未全調(diào)度時(shí),總尋道長(zhǎng)度加上端點(diǎn)值再加上下一個(gè)調(diào)度磁道的值,再按前面的算法進(jìn)行,直到磁道全部都調(diào)度完畢,得到總的尋道長(zhǎng)度,除以n得到平均尋道長(zhǎng)度。

      ④循環(huán)掃描算法(CSCAN)將queue[n]進(jìn)行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當(dāng)?shù)蓝它c(diǎn)(queue[0]或queue[n-1])時(shí),反向到另一端點(diǎn)再以此方向進(jìn)行遍歷,直到queue[n]中所有都調(diào)度完。當(dāng)調(diào)度磁道不在queue端點(diǎn)時(shí),總的尋道長(zhǎng)度為為前一個(gè)磁道與后一個(gè)磁道差值的累加,當(dāng)?shù)竭_(dá)端點(diǎn)且queue[n]未全調(diào)度時(shí),總尋道長(zhǎng)度加上端點(diǎn)值再加上磁盤磁道總長(zhǎng)度,再加上下一個(gè)調(diào)度磁道的值,再按前面的算法進(jìn)行,直到磁道全部都調(diào)度完畢,得到總的尋道長(zhǎng)度,除以n得到平均尋道長(zhǎng)度。

      5、源代碼:

      #include #include #include void menu(){ cout<<“*********************菜單*********************”<

      1、先來(lái)先服務(wù)算法(FCFS)**********”<

      cout<<“******

      2、最短尋道時(shí)間優(yōu)先算法(SSTF)**********”<

      cout<<“******

      3、掃描算法(SCAN)**********”<

      cout<<“******

      4、循環(huán)掃描算法(CSCAN)**********”<

      cout<<“******

      5、退出 **********”<

      /*======================初始化序列=======================*/ void init(int queue[],int queue_copy[],int n){ int i;for(i=0;i

      //對(duì)當(dāng)前正在執(zhí)行的磁道號(hào)進(jìn)行定位,返回磁道號(hào)小于當(dāng)前磁道中最大的一個(gè) int fix(int queue[], int n, int headstarts){ int i =0;while(iqueue[i]){ i++;} if(i>n-1)return n-1;//當(dāng)前磁道號(hào)大于磁盤請(qǐng)求序列中的所有磁道 if(i==0)return-1;//當(dāng)前磁道號(hào)小于磁盤請(qǐng)求序列中的所有磁道 else return i-1;//返回小于當(dāng)前磁道號(hào)中最大的一個(gè) } /*=================使用冒泡算法從小到大排序==============*/ int *bubble(int queue[],int m){ int i,j;int temp;for(i=0;i queue[j]){ temp=queue[i];queue[i]=queue[j];queue[j]=temp;} } cout<<“排序后的磁盤序列為:”;for(i=0;i

      /* ====================以下是FCFS算法==================*/ void FCFS(int queue[],int n,int diskrode,int headstarts)//queue是請(qǐng)求調(diào)度序列,n為其個(gè)數(shù),diskroad為磁盤磁道數(shù),headstarts為正在調(diào)度的磁道 { cout<<“************以下為FCFS調(diào)度算法***********”<queue[0])count +=headstarts-queue[0];else count+=queue[0]-headstarts;cout<<“調(diào)度序列為: ”;cout<queue[i+1])count +=queue[i]-queue[i+1];else count +=queue[i+1]-queue[i];} cout<

      /*=====================SSTF算法====================*/ void SSTF(int queue[], int n, int diskrode, int headstarts){ int k=1;int l,r;int i,j,count=0;queue =bubble(queue,n);cout<<“************以下為SSTF調(diào)度算法***********”<=0;i--)cout<=headstarts)//若當(dāng)前磁道號(hào)小于請(qǐng)求序列中最小者,則直接由內(nèi)向外依次給予各請(qǐng)求服務(wù) { cout<<“磁盤掃描序列為: ”;cout<queue[0] && headstarts =0)&&(r

      -headstarts)){ cout<=0;j--){ cout<

      /*======================以下是SCAN算法====================*/ void SCAN(int queue[], int n, int diskrode, int headstarts){ int direction, i, fixi;cout<<“***********以下是SCAN調(diào)度算法*************”<>direction;double count=0;*bubble(queue,n);fixi = fix(queue,n,headstarts);cout<=0;i--){ cout<=0;i--)//從大到小 { cout<-1;i--){ cout<-1;i--)//從大到小 { cout<

      /*======================以下是CSCAN算法====================*/ void CSCAN(int queue[],int n,int diskrode,int headstarts){ int direction,i,fixi;cout<<“***********以下是CSCAN調(diào)度算法*************”<>direction;int count=0;//count表示磁道移動(dòng)的長(zhǎng)度 *bubble(queue,n);fixi=fix(queue,n,headstarts);cout<<“調(diào)度序列為: ”<-1;--i){ cout<-1;--i){ cout<-1;i--){ cout<fixi;i--){ cout<

      void main(){ int n, i, diskrode, headstarts;//n表示調(diào)度磁盤請(qǐng)求序列queue的長(zhǎng)度,diskrode表示磁盤磁道的個(gè)數(shù),headstarts表示目前正在調(diào)度的磁道; cout<<“請(qǐng)輸入磁盤的總磁道數(shù):”<> diskrode;cout<<“請(qǐng)輸入磁盤調(diào)度請(qǐng)求序列個(gè)數(shù):”<>n;int *queue;queue =(int*)malloc(n*sizeof(int));//給quneue數(shù)組分配空間...int *queue_copy;queue_copy =(int*)malloc(n*sizeof(int));cout<<“請(qǐng)依次輸入該序列的值:”<>queue[i];for(i=0;i>headstarts;int menux;menu();cout<<“請(qǐng)按菜單選擇,輸入相應(yīng)的數(shù)字: ”;cin>>menux;while(menux!=0){ if(menux ==1)FCFS(queue,n,diskrode,headstarts);

      if(menux ==2)SSTF(queue,n,diskrode,headstarts);

      if(menux ==3)SCAN(queue,n,diskrode,headstarts);if(menux ==4)CSCAN(queue,n,diskrode,headstarts);if(menux ==5)cout<<“程序結(jié)束,謝謝使用!”<>menux;cout<

      第三篇:操作系統(tǒng)課程設(shè)計(jì),磁盤調(diào)度算法范文

      沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 Noi

      目 錄 1 課程設(shè)計(jì)目的及要求……………………………………………………錯(cuò)誤!未定義書簽。2 相關(guān)知識(shí)…………………………………………………………………錯(cuò)誤!未定義書簽。3 題目分析…………………………………………………………………2 4 概要設(shè)計(jì)…………………………………………………………………2 4.1 先來(lái)先服務(wù)(FCFS)的設(shè)計(jì)思想……………………………….2 4.2 最短尋道時(shí)間優(yōu)先調(diào)度(SSTF)的設(shè)計(jì)思想…………………..2 4.3 掃描算法(SCAN)的設(shè)計(jì)思想…………………………………2 4.4 循環(huán)掃描(CSCAN)的設(shè)計(jì)思想………………………………..2 5 代碼及流程………………………………………………………………3 5.1 流程圖……………………………………………………………...3 5.2 源代碼……………………………………………………………...8 6 運(yùn)行結(jié)果…………………………………………………………………16 7 設(shè)計(jì)心得…………………………………………………………………19 參考文獻(xiàn)…………………………………………………………………………19

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No1 1 課程設(shè)計(jì)目的及要求

      設(shè)計(jì)目的:加深對(duì)操作系統(tǒng)原理的進(jìn)一步認(rèn)識(shí),加強(qiáng)實(shí)踐動(dòng)手能力和程序開(kāi)發(fā)能力的培養(yǎng),提高分析問(wèn)題解決問(wèn)題的能力,培養(yǎng)合作精神,以鞏固和加深磁盤調(diào)度的概念。操作系統(tǒng)是一門工程性很強(qiáng)的課程,它不僅要求學(xué)生掌握操作系統(tǒng)的工作原理和理論知識(shí),也要求學(xué)生的實(shí)際動(dòng)手能力,以加深對(duì)所學(xué)習(xí)內(nèi)容的理解,使學(xué)生熟練地掌握計(jì)算機(jī)的操作方法,使用各種軟件工具,加強(qiáng)對(duì)課程內(nèi)容的理解。這次課程設(shè)計(jì),就是通過(guò)模擬磁臂調(diào)度來(lái)加深對(duì)操作系統(tǒng)中磁臂調(diào)度概念的理解。使學(xué)生熟悉磁盤管理系統(tǒng)的設(shè)計(jì)方法;加深對(duì)所學(xué)各種磁盤調(diào)度算法的了解及其算法的特點(diǎn)。

      設(shè)計(jì)要求:編程序?qū)崿F(xiàn)下述磁盤調(diào)度算法,并求出每種算法的平均尋道長(zhǎng)度;要求設(shè)計(jì)主界面可以靈活選擇某算法,且以下算法都要實(shí)現(xiàn)

      1、先來(lái)先服務(wù)算法(FCFS)

      2、最短尋道時(shí)間優(yōu)先算法(SSTF)

      3、掃描算法(SCAN)

      4、循環(huán)掃描算法(CSCAN)相關(guān)知識(shí)

      數(shù)據(jù)結(jié)構(gòu):數(shù)組 now:當(dāng)前磁道號(hào);

      array[]:放置磁道號(hào)的數(shù)組;

      void FCFS(int array[],int m)先來(lái)先服務(wù)算法(FCFS)void SSTF(int array[],int m)最短尋道時(shí)間優(yōu)先算法(SSTF)void SCAN(int array[],int m)掃描算法(SCAN)void CSCAN(int array[],int m)循環(huán)掃描算法(CSCAN)磁盤調(diào)度:當(dāng)有多個(gè)進(jìn)程都請(qǐng)求訪問(wèn)磁盤時(shí),采用一種適當(dāng)?shù)尿?qū)動(dòng)調(diào)度算法,使各進(jìn)程對(duì)磁盤的平均訪問(wèn)(主要是尋道)時(shí)間最小。目前常用的磁盤調(diào)度算法有:1)閑來(lái)先服務(wù)2)最短尋道時(shí)間優(yōu)先3)掃描算法4)循環(huán)掃描算法等

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No2 3 題目分析

      選擇一個(gè)自己熟悉的計(jì)算機(jī)系統(tǒng)和程序設(shè)計(jì)語(yǔ)言模擬操作系統(tǒng)基本功能的設(shè)計(jì)方法及其實(shí)現(xiàn)過(guò)程

      完成各分項(xiàng)功能。在算法的實(shí)現(xiàn)過(guò)程中,要求可決定變量應(yīng)是動(dòng)態(tài)可變的;同時(shí)模塊應(yīng)該有一個(gè)合理的輸出結(jié)果。具體可參照實(shí)驗(yàn)的程序模擬.各功能程序要求自行編寫程序?qū)崿F(xiàn),不得調(diào)用現(xiàn)有操作系統(tǒng)提供的模塊或功能函數(shù)。磁盤調(diào)度程序模擬。先來(lái)先服務(wù)調(diào)度算法.最短尋道時(shí)間優(yōu)先調(diào)度,循環(huán)(SCAN)調(diào)度算法。程序設(shè)計(jì)語(yǔ)言自選,最終以軟件(含源代碼以及執(zhí)行程序)和設(shè)計(jì)報(bào)告的形式提交課程設(shè)計(jì)結(jié)果.。磁盤調(diào)度讓有限的資源發(fā)揮更大的作用。在多道程序設(shè)計(jì)的計(jì)算機(jī)系統(tǒng)中,各個(gè)進(jìn)程可能會(huì)不斷提出不同的對(duì)磁盤進(jìn)行讀/寫操作的請(qǐng)求。由于有時(shí)候這些進(jìn)程的發(fā)送請(qǐng)求的速度比磁盤響應(yīng)的還要快,因此我們有必要為每個(gè)磁盤設(shè)備建立一個(gè)等待隊(duì)列。概要設(shè)計(jì)

      1.先來(lái)先服務(wù)(FCFS)的設(shè)計(jì)思想

      即先來(lái)的請(qǐng)求先被響應(yīng)。FCFS策略看起來(lái)似乎是相當(dāng)“公平”的,但是當(dāng)請(qǐng)求的頻率過(guò)高的時(shí)候FCFS策略的響應(yīng)時(shí)間就會(huì)大大延長(zhǎng)。FCFS策略為我們建立起一個(gè)隨機(jī)訪問(wèn)機(jī)制的模型,但是假如用這個(gè)策略反復(fù)響應(yīng)從里到外的請(qǐng)求,那么將會(huì)消耗大量的時(shí)間。為了盡量降低尋道時(shí)間,看來(lái)我們需要對(duì)等待著的請(qǐng)求進(jìn)行適當(dāng)?shù)呐判颍皇呛?jiǎn)單的使用FCFS策略。這個(gè)過(guò)程就叫做磁盤調(diào)度管理。有時(shí)候fcfs也被看作是最簡(jiǎn)單的磁盤調(diào)度算法。

      2.最短尋道時(shí)間優(yōu)先調(diào)度(SSTF)的設(shè)計(jì)思想

      最短時(shí)間優(yōu)先算法選擇這樣的進(jìn)程。要求訪問(wèn)的磁道,與當(dāng)前磁頭所在的磁道距離最近,以使每次的尋道時(shí)間最短。

      3.掃描算法(SCAN)的設(shè)計(jì)思想

      掃描(SCAN)調(diào)度算法:該算法不僅考慮到欲訪問(wèn) 的磁道與當(dāng)前磁道間的距離,更優(yōu)先考慮的是磁頭當(dāng)前的移動(dòng)方向。例如,當(dāng)磁頭正在自里向外移動(dòng)時(shí),SCAN算法所考慮的下一個(gè)訪問(wèn)對(duì)象,應(yīng)是其欲訪問(wèn)的磁道,既在當(dāng)前磁道之外,又是距離最近的。這樣自里向外的訪問(wèn),直至再無(wú)更外的磁道需要訪問(wèn)時(shí),才將磁道換向自外向里移動(dòng)。這時(shí),同樣也是每次選擇這樣的進(jìn)程來(lái)調(diào)度,也就是要訪問(wèn)的當(dāng)前位置內(nèi)距離最近者,這樣,磁頭又逐步地從外向里移動(dòng),直至再無(wú)更里面的磁道要訪問(wèn),從而避免了出現(xiàn)“饑餓”現(xiàn)像。

      4.循環(huán)掃描(CSACN)的設(shè)計(jì)思想

      循環(huán)掃描(CSCAN)算法:當(dāng)磁頭剛從里向外移動(dòng)而越過(guò)了某一磁道時(shí),恰好又有一進(jìn)程請(qǐng)求訪問(wèn)此磁道,這時(shí),該里程就必須等待,為了減少這種延遲,CSCAN算法規(guī)定磁頭單向移動(dòng),而本實(shí)驗(yàn)過(guò)程中我們所設(shè)計(jì)的是磁頭從里向外移動(dòng),而從外向里移動(dòng)時(shí)只須改方向而已,本實(shí)驗(yàn)未實(shí)現(xiàn)。但本實(shí)驗(yàn)已完全能演示循環(huán)掃描的全過(guò)程。

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No3 5 代碼及流程

      1.先來(lái)先服務(wù)(FCFS)

      圖 1—1 FCFS的流程圖

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No4 2.最短尋道時(shí)間優(yōu)先調(diào)度(SSTF)

      圖1—2 SSTF的流程圖

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No5 3.掃描算法(SCAN)

      圖1—3 SCAN的流程圖

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No6 4.循環(huán)掃描(CSCAN)

      圖1—4 CSCAN的流程圖

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No7

      圖1—5 主函數(shù)的流程圖

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No8 源代碼:

      #include“stdio.h” #include“stdlib.h” //#include“iostream.h” #define maxsize 100 //定義最大數(shù)組域

      //先來(lái)先服務(wù)調(diào)度算法 void FCFS(int array[],int m){ int sum=0,j,i;int avg;printf(“n FCFS調(diào)度結(jié)果: ”);for(i=0;i

      } avg=sum/(m-1);//計(jì)算平均尋道長(zhǎng)度 printf(“n 移動(dòng)的總道數(shù): %d n”,sum);printf(“平均尋道長(zhǎng)度: %d n”,avg);}

      //最短尋道時(shí)間優(yōu)先調(diào)度算法 void SSTF(int array[],int m){ int temp;int k=1;int now,l,r;int i,j,sum=0;int avg;for(i=0;iarray[j])//兩磁道號(hào)之間比較 { temp=array[i];

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No9 array[i]=array[j];array[j]=temp;} } } for(i=0;i

      for(i=m-1;i>=0;i--)//將數(shù)組磁道號(hào)從大到小輸出 printf(“%d ”,array[i]);sum=now-array[0];//計(jì)算移動(dòng)距離 } else if(array[0]>=now)//判斷整個(gè)數(shù)組里的數(shù)是否都大于當(dāng)前磁道號(hào) {

      for(i=0;i=0)&&(r

      printf(“%d ”,array[l]);sum+=now-array[l];//計(jì)算移動(dòng)距離 now=array[l];l=l-1;} else

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No10 {

      printf(“%d ”,array[r]);sum+=array[r]-now;//計(jì)算移動(dòng)距離 now=array[r];r=r+1;} } if(l=-1){

      for(j=r;j

      printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//計(jì)算移動(dòng)距離 } else {

      for(j=l;j>=0;j--){

      printf(“%d ”,array[j]);} sum+=array[m-1]-array[0];//計(jì)算移動(dòng)距離 } } avg=sum/m;printf(“n 移動(dòng)的總道數(shù): %d n”,sum);printf(“平均尋道長(zhǎng)度: %d n”,avg);} //掃描算法

      void SCAN(int array[],int m)//先要給出當(dāng)前磁道號(hào)和移動(dòng)臂的移動(dòng)方向 { int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;iarray[j])//對(duì)磁道號(hào)進(jìn)行從小到大排列

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No11 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i

      printf(“n SCAN調(diào)度結(jié)果: ”);for(i=m-1;i>=0;i--){ printf(“%d ”,array[i]);//將數(shù)組磁道號(hào)從大到小輸出 } sum=now-array[0];//計(jì)算移動(dòng)距離 } else if(array[0]>=now)//判斷整個(gè)數(shù)組里的數(shù)是否都大于當(dāng)前磁道號(hào) {

      printf(“n SCAN調(diào)度結(jié)果: ”);for(i=0;i

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No12 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=r;j=0;j--){ printf(“%d ”,array[j]);} sum=-now-array[0]+2*array[m-1];//計(jì)算移動(dòng)距離 }//磁道號(hào)增加方向 } avg=sum/m;printf(“n 移動(dòng)的總道數(shù): %d n”,sum);printf(“平均尋道長(zhǎng)度: %d n”,avg);}

      //循環(huán)掃描算法

      void CSCAN(int array[],int m){ int temp;int k=1;int now,l,r,d;int i,j,sum=0;int avg;for(i=0;iarray[j])//對(duì)磁道號(hào)進(jìn)行從小到大排列

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No13 { temp=array[i];array[i]=array[j];array[j]=temp;} } } for(i=0;i

      printf(“n CSCAN調(diào)度結(jié)果: ”);for(i=0;i

      printf(“%d ”,array[i]);//將磁道號(hào)從小到大輸出 } sum=now-array[0]+array[m-1];//計(jì)算移動(dòng)距離 } else if(array[0]>=now)//判斷整個(gè)數(shù)組里的數(shù)是否都大于當(dāng)前磁道號(hào) {

      printf(“n CSCAN調(diào)度結(jié)果: ”);for(i=0;i

      printf(“%d ”,array[i]);//將磁道號(hào)從小到大輸出 } sum=array[m-1]-now;//計(jì)算移動(dòng)距離 } else { while(array[k]

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No14 { for(j=l;j>=0;j--){ printf(“%d ”,array[j]);} for(j=m-1;j>=r;j--){ printf(“%d ”,array[j]);} sum=2*(array[m-1]-array[0])-array[r]+now;//計(jì)算移動(dòng)距離 }//磁道號(hào)減小方向 else { for(j=r;j

      // 操作界面 int main(){ int c;FILE *fp;//定義指針文件

      int cidao[maxsize];//定義磁道號(hào)數(shù)組 int i=0,count;fp=fopen(“cidao.txt”,“r+”);//讀取cidao.txt文件 if(fp==NULL)//判斷文件是否存在 { printf(“n 請(qǐng) 先 設(shè) 置 磁 道!n”);exit(0);} while(!feof(fp))//如果磁道文件存在

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No15 { fscanf(fp,“%d”,&cidao[i]);//調(diào)入磁道號(hào) i++;} count=i-1;printf(“n-------------------n”);printf(“ 10-11OS課程設(shè)計(jì)--磁盤調(diào)度算法系統(tǒng)n”);printf(“

      計(jì)算機(jī)科學(xué)與技術(shù)二班n”);printf(“

      姓名:宋思揚(yáng)n”);printf(“

      學(xué)號(hào):0803050203n”);printf(“

      電話:************n”);printf(“

      2010年12月29日n”);printf(“n-------------------n”);printf(“n 磁道讀取結(jié)果:n”);for(i=0;i

      1、先來(lái)先服務(wù)算法(FCFS)n”);printf(“

      2、最短尋道時(shí)間優(yōu)先算法(SSTF)n”);printf(“

      3、掃描算法(SCAN)n”);printf(“

      4、循環(huán)掃描算法(CSCAN)n”);printf(“ 5.退出n”);printf(“n”);printf(“請(qǐng)選擇:”);scanf(“%d”,&c);if(c>5)break;switch(c)//算法選擇 { case 1: FCFS(cidao,count);//先來(lái)先服務(wù)算法 printf(“n”);break;case 2: SSTF(cidao,count);//最短尋道時(shí)間優(yōu)先算法 printf(“n”);break;case 3:

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No16 SCAN(cidao,count);//掃描算法 printf(“n”);break;case 4: CSCAN(cidao,count);//循環(huán)掃描算法 printf(“n”);break;case 5: exit(0);} } return 0;} 6 運(yùn)行結(jié)果

      圖2—1 運(yùn)行界面

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No17

      圖2—2 運(yùn)行FCFS的界面

      圖2—3 運(yùn)行SSTF的界面

      圖2—4 運(yùn)行SCAN的界面

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No18

      圖2—5 運(yùn)行SCAN的界面

      圖2—6 運(yùn)行CSCAN的界面

      圖2—7 運(yùn)行CSCAN的界面

      沈陽(yáng)理工大學(xué) 沈陽(yáng)理工大學(xué)課程設(shè)計(jì)專用紙 No19 運(yùn)行結(jié)果: 四種磁盤調(diào)度運(yùn)行結(jié)果正確,與預(yù)期的相符。設(shè)計(jì)心得

      此次操作系統(tǒng)的課程設(shè)計(jì),從理論到實(shí)踐,在兩個(gè)星期的日子里,可以說(shuō)是苦多于甜,但是可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書本上所沒(méi)有學(xué)到過(guò)的知識(shí)。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。

      本次實(shí)驗(yàn)首先要了解磁盤調(diào)度的工作原理及四種調(diào)度方法的工作原理。在課程設(shè)計(jì)前的準(zhǔn)備工作時(shí),先把這部分工作做完了。在設(shè)計(jì)總的程序框架的時(shí)候,要注意各功能模塊的位置,盡量做到簡(jiǎn)潔、有序;各功能模塊與主程序要正確銜接。

      在設(shè)計(jì)的過(guò)程中遇到許多問(wèn)題,我設(shè)計(jì)的是四種調(diào)度算法中的后兩種。例如:在最初程序設(shè)計(jì)時(shí)主要有兩種構(gòu)思:1)選用數(shù)據(jù)結(jié)構(gòu)是鏈表的。2)選用數(shù)組。我最初嘗試了用鏈表,覺(jué)得方便易懂,但是在循環(huán)掃描處出現(xiàn)了些問(wèn)題,后來(lái)又轉(zhuǎn)變了設(shè)計(jì)思路,選用了數(shù)組,直接進(jìn)行排序,然后再聯(lián)系到各功能模塊。

      同時(shí)在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固,自身知識(shí)的很多漏洞,看到了自己的實(shí)踐經(jīng)驗(yàn)還是比較缺乏,理論聯(lián)系實(shí)際的能力還急需提高。比如說(shuō)編語(yǔ)言掌握得不好,應(yīng)用程序編寫不太會(huì)……通過(guò)這次課程設(shè)計(jì)之后,一定把以前所學(xué)過(guò)的知識(shí)重新溫故。在此,也感謝在課程設(shè)計(jì)過(guò)程中幫我解惑的老師和同學(xué)。參考文獻(xiàn)

      [1] 《操作系統(tǒng)》

      人民郵電出版社

      宗大華 宗濤 陳吉人 編著

      [2] 《C語(yǔ)言程序設(shè)計(jì)》

      清華大學(xué)出版社

      馬秀麗 劉志嫵 李筠 編著 [3] 《操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書》 沈陽(yáng)理工大學(xué)

      唐巍 菀勛 編著

      沈陽(yáng)理工大學(xué)

      第四篇:磁盤調(diào)度[推薦]

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

      磁 盤 調(diào) 度 實(shí) 踐 報(bào) 告

      姓名: 董宇超 班級(jí):計(jì)算機(jī)一班 學(xué)號(hào):0906010124

      目錄:

      ? 實(shí)踐內(nèi)容 ? 實(shí)踐目的及意義 ? 功能設(shè)計(jì)及數(shù)據(jù)結(jié)構(gòu) ? 調(diào)試運(yùn)行及測(cè)設(shè)分析 ? 存在的問(wèn)題及改進(jìn)設(shè)想 ? 實(shí)踐體會(huì) ? 總結(jié) ? 參考文獻(xiàn)

      正文:

      1.實(shí)踐內(nèi)容:

      ? 假設(shè)磁盤只有一個(gè)盤面,并且磁盤是可移動(dòng)頭磁盤。? 磁盤是可供多個(gè)進(jìn)程共 享的存儲(chǔ)設(shè)備,但一個(gè)磁盤每個(gè)時(shí)刻只能為一個(gè)進(jìn)程服務(wù)。當(dāng)有進(jìn)程在訪問(wèn) 某個(gè)磁盤時(shí),其它想訪問(wèn)該磁盤的進(jìn)程必須等待,直到磁盤一次工作結(jié)束。當(dāng)有多個(gè)進(jìn)程提出輸入輸出請(qǐng)求而處于等待狀態(tài)時(shí),可用電梯調(diào)度算法從若 干個(gè)等待訪問(wèn)者中選擇一個(gè)進(jìn)程,讓它訪問(wèn)磁盤。為此設(shè)置“驅(qū)動(dòng)調(diào)度”進(jìn) 程。

      ? 由于磁盤與處理器是并行工作的,所以當(dāng)磁盤在為一個(gè)進(jìn)程服務(wù)時(shí),占有處理器的其它進(jìn)程可以提出使用磁盤(這里我們只要求訪問(wèn)磁道),即動(dòng) 態(tài)申請(qǐng)?jiān)L問(wèn)磁道,為此設(shè)置“接受請(qǐng)求”進(jìn)程。

      要求模擬電梯調(diào)度算法,對(duì)磁盤進(jìn)行移臂操作,編程實(shí)現(xiàn)。

      2.實(shí)踐目的:

      磁盤是高速、大容量、旋轉(zhuǎn)型、可直接存取的存儲(chǔ)設(shè)備。它作為計(jì)算機(jī) 系統(tǒng)的輔助存儲(chǔ)器,擔(dān)負(fù)著繁重的輸入輸出工作,在現(xiàn)代計(jì)算機(jī)系統(tǒng)中往往 同時(shí)會(huì)有若干個(gè)要求訪問(wèn)磁盤的輸入輸出要求。

      系統(tǒng)可采用一種策略,盡可能按最佳次序執(zhí)行訪問(wèn)磁盤的請(qǐng)求。由于磁 盤訪問(wèn)時(shí)間主要受尋道時(shí)間T的影響,為此需要采用合適的尋道算法,以降 低尋道時(shí)間。

      本實(shí)驗(yàn)要求模擬設(shè)計(jì)一個(gè)磁盤調(diào)度程序,觀察調(diào)度程序的動(dòng)態(tài)運(yùn) 行過(guò)程。通過(guò)實(shí)驗(yàn)理解和掌握磁盤調(diào)度的職能。

      3.功能設(shè)計(jì):

      由于程序簡(jiǎn)單,沒(méi)有設(shè)計(jì)結(jié)構(gòu)體,只定義了一下變量:

      int m=0;//記錄磁道數(shù)目

      int n;//接受輸入的磁道號(hào)

      int disk[1000];//保存磁道序列

      int currenttrack;//當(dāng)前磁道號(hào)

      int t;

      int i=0,j=0,k=0;//循環(huán)參數(shù)

      int option;//記錄尋到方向

      int sum=0;//統(tǒng)計(jì)尋道長(zhǎng)度

      源代碼: #include void main(){ int m=0;//記錄磁道數(shù)目

      int n;//接受輸入的磁道號(hào)

      int disk[1000];//保存磁道序列

      int currenttrack;//當(dāng)前磁道號(hào)

      int t;int i=0,j=0,k=0;//循環(huán)參數(shù)

      int option;//記錄尋到方向

      int sum=0;//統(tǒng)計(jì)尋道長(zhǎng)度

      printf(“請(qǐng)輸入當(dāng)前的磁道號(hào):”);scanf(“%d”,¤ttrack);

      printf(“n--------------------1.向磁道號(hào)增加的方向訪問(wèn)--------------------”);printf(“n--------------------2.向磁道號(hào)減少的方向訪問(wèn)--------------------”);printf(“n請(qǐng)選擇的當(dāng)前磁頭移動(dòng)方向(1/2):”);scanf(“%d”,&option);

      printf(“n請(qǐng)輸入磁道請(qǐng)求序列(0~999并以<-1>結(jié)束):n”);scanf(“%d”,&n);while(n!=-1){

      disk[i]=n;

      m++;i++;

      scanf(“%d”,&n);}

      /* 冒泡排序 使磁道請(qǐng)求序列從小到大排序 */ for(j=0;j

      for(i=0;i

      {

      if(disk[i]>disk[i+1])

      {

      t=disk[i];

      disk[i]=disk[i+1];

      disk[i+1]=t;

      }

      } }

      /* 找到當(dāng)前磁道號(hào)在磁道請(qǐng)求序列中的排序位置 */

      k=0;for(i=0;i

      k++;else

      break;} printf(“n--------------電梯算法調(diào)度后的磁盤調(diào)度序列-------------n”);/* 第一種: 當(dāng)前磁道號(hào)先向外再向里讀 */ if(option==1){ for(i=k;i

      printf(“%5d”,disk[i]);} for(i=k-1;i>=0;i--){

      printf(“%5d”,disk[i]);} sum=2*(disk[m-1]-disk[k])+disk[k]-disk[0];printf(“n尋道長(zhǎng)度為:%5d”,sum);} /* 第二種: 當(dāng)前磁道號(hào)先向里再向外讀 */ if(option==2){

      for(i=k-1;i>=0;i--){

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

      sum+=disk[i];}

      for(i=k;i

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

      sum+=disk[i];} sum=disk[m-1]-disk[k]+2*(disk[k]-disk[0]);printf(“n尋道長(zhǎng)度為:%5d”,sum);

      } printf(“n”);}

      4.調(diào)試運(yùn)行:

      運(yùn)行開(kāi)始后出現(xiàn)如下界面,舉例輸入5:

      然后出現(xiàn):

      1.先選擇1(按按磁道號(hào)增加的方向?qū)さ溃?/p>

      接著輸入磁道序列,若要結(jié)束輸入,輸入-1即可:

      然后出現(xiàn)如下尋道結(jié)果:

      2.再選擇2(按按磁道號(hào)減少的方向?qū)さ溃?/p>

      接著輸入磁道序列,若要結(jié)束輸入,輸入-1即可:

      然后出現(xiàn)如下尋道結(jié)果:

      5.存在的問(wèn)題:

      由于初次做操作系統(tǒng)模擬實(shí)驗(yàn),所以程序設(shè)計(jì)中存在很多問(wèn)題,例如:由于電梯算法是從當(dāng)前的磁道號(hào)開(kāi)始沿著預(yù)定的方向?qū)さ?,?dāng)本方向上的請(qǐng)求全部滿足時(shí),再反向?qū)さ溃浅绦蚰M過(guò)程中,進(jìn)程不能隨著尋道的同時(shí)添加新的進(jìn)程,使得電梯調(diào)度算法不能更好的體現(xiàn)。只能預(yù)先輸入一串請(qǐng)求,然后只對(duì)這一段請(qǐng)求尋道。

      改進(jìn)之處:添加更高級(jí)的算法,使得請(qǐng)求能在尋道的同時(shí)加進(jìn)來(lái)。

      還有一些簡(jiǎn)單的已解決的問(wèn)題,不一一列舉了。

      6.實(shí)踐心得體會(huì):

      通過(guò)這次實(shí)踐學(xué)會(huì)了不少內(nèi)容,更深的理解了磁道調(diào)度的幾種算法,而且學(xué) 會(huì)了系統(tǒng)的編寫程序。在編程過(guò)程中,需要 查閱各種資料,并且學(xué)習(xí)前人的 編寫方法,找出優(yōu)劣,然后形成自己的思想,最終完成程序的編寫。

      通過(guò)模擬磁盤調(diào)度的電梯調(diào)度算法,并比較與其他調(diào)度算法的不同,懂得了 各種算法在不同情況下的作用。選擇一個(gè)好的調(diào)度算法可以節(jié)約很多時(shí)間。

      在模擬過(guò)程中出現(xiàn)過(guò)好多問(wèn)題,有的解決了,有的還未解決,不管如何都是 一種收獲。

      在最初的時(shí)候,由于程序編寫隱藏的錯(cuò)誤,編譯沒(méi)有發(fā)現(xiàn),卻執(zhí)行不下 去,然后改正錯(cuò)誤,修復(fù)漏洞,最終滿足實(shí)驗(yàn)要求。

      7.總結(jié):

      為期一周的操作系統(tǒng)實(shí)踐課結(jié)束了,編寫了電梯調(diào)度算法的磁盤調(diào)度模 擬程序。電梯調(diào)度尋道方式就像電梯運(yùn)行一樣,就是沿一個(gè)方向?qū)さ溃钡?滿足這一方向的所有請(qǐng)求,便反向?qū)さ馈T诔绦蛑刑砑恿藢さ篱L(zhǎng)度的顯示,以便將電梯調(diào)度的效率與其他磁盤調(diào)度算法比較。

      8.參考文獻(xiàn):

      1.操作系統(tǒng)教程(第4版)????孫鐘秀 主編 高等教育出版社;

      2.算法與數(shù)據(jù)結(jié)構(gòu)-C語(yǔ)言描述(第2版)??張乃孝 主編 高等教育出版社; 3.網(wǎng)絡(luò)資源;

      第五篇:模擬磁盤調(diào)度算法系統(tǒng)的設(shè)計(jì)畢業(yè)設(shè)計(jì)

      目錄

      一、設(shè)計(jì)任務(wù)及主要技術(shù)....................................................................3

      二、設(shè)計(jì)方案及論證結(jié)果....................................................................4

      三、系統(tǒng)的原理框圖..................................................................................5

      四、設(shè)計(jì)程序....................................................................................................12

      五、實(shí)驗(yàn)結(jié)果....................................................................................................20

      六、調(diào)試分析及故障處理..................................................................24

      七、設(shè)計(jì)結(jié)論....................................................................................................25

      八、心得體會(huì)....................................................................................................26

      一、設(shè)計(jì)任務(wù)及主要技術(shù)

      1.整體功能概述(設(shè)計(jì)任務(wù)):

      磁盤是外設(shè)中一個(gè)很常用的部分,所以,對(duì)磁盤數(shù)據(jù)的尋道時(shí)間的長(zhǎng)短可以直接影響機(jī)器的整體運(yùn)行速度的快慢。本設(shè)計(jì)為一個(gè)模擬磁盤調(diào)度算法的磁盤調(diào)度模擬系統(tǒng),能夠模擬先來(lái)先服務(wù)(FCFS)算法、最短尋道時(shí)間(SSTF)算法、電梯(SCAN)算法、環(huán)形掃描(C_SCAN)算法及N_SCAN算法五個(gè)磁盤調(diào)度算法,輸入為一組作業(yè)的磁道請(qǐng)求,輸出為按選擇的算法執(zhí)行時(shí)的磁頭移動(dòng)軌跡。其中,先來(lái)先服務(wù)(FCFS)算法、最短尋道時(shí)間(SSTF)算法、電梯(SCAN)算法為基本算法,環(huán)形掃描(C_SCAN)算法及N_SCAN算法為擴(kuò)展算法。

      2.運(yùn)行環(huán)境:

      (1)硬件環(huán)境

      Intel core i5 CPU

      (2)軟件環(huán)境

      Windows 7

      Microsoft Visual C++ 6.0

      3.主要技術(shù):

      (1)用C語(yǔ)言編寫程序;

      (2)對(duì)編程軟件Microsoft Visual C++ 6.0的了解和使用;

      (3)操作系統(tǒng)基礎(chǔ)知識(shí)(主要是對(duì)先來(lái)先服務(wù)(FCFS)算法、最短尋道時(shí)間(SSTF)算法、電梯(SCAN)算法的了解);

      (4)操作系統(tǒng)擴(kuò)展知識(shí)(通過(guò)網(wǎng)絡(luò)自學(xué)環(huán)形掃描(C_SCAN)算法及N_SCAN算法)。

      二、設(shè)計(jì)方案及論證結(jié)果

      1.設(shè)計(jì)方案:

      (1)先來(lái)先服務(wù)算法(First-Come,F(xiàn)irst-Served,F(xiàn)CFS)

      此算法為一種最簡(jiǎn)單的磁盤調(diào)度算法。它直接根據(jù)作業(yè)請(qǐng)求磁盤的先后順序?qū)Υ疟P進(jìn)行尋訪。此算法公平、簡(jiǎn)單,每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,不會(huì)出現(xiàn)某個(gè)作業(yè)的請(qǐng)求長(zhǎng)期得不到滿足的情況。但此算法未對(duì)尋道方案進(jìn)行優(yōu)化,故平均周轉(zhuǎn)時(shí)間及帶權(quán)周轉(zhuǎn)時(shí)間都會(huì)較長(zhǎng)。

      (2)最短尋道時(shí)間優(yōu)先算法(Shortest Seek Time First,SSTF)

      此算法優(yōu)先選擇距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。此算法可以使得每次尋道時(shí)所用的時(shí)間都最短,但不能保證平均周轉(zhuǎn)時(shí)間及帶權(quán)周轉(zhuǎn)時(shí)間最短。

      (3)電梯算法(SCAN)

      此算法同時(shí)考慮下一個(gè)作業(yè)磁道請(qǐng)求與當(dāng)前磁頭位置的距離和當(dāng)前磁頭移動(dòng)方向。本設(shè)計(jì)默認(rèn)磁頭當(dāng)前移動(dòng)方向?yàn)樽詢?nèi)向外,故SCAN算法先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再將磁臂換向,訪問(wèn)磁頭內(nèi)側(cè)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。此算法避免了饑餓現(xiàn)象的出現(xiàn),每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,且使每次尋道時(shí)間相對(duì)較短。

      (4)環(huán)形掃描算法(C_SCAN)

      此算法磁頭移動(dòng)方向一直為自內(nèi)向外,同時(shí)考慮下一個(gè)作業(yè)磁道請(qǐng)求與當(dāng)前磁頭位置的距離最短。先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再直接將磁頭移到最內(nèi)側(cè)磁道(此過(guò)程快速移動(dòng),并不訪問(wèn)任何磁道),再由內(nèi)向外順次訪問(wèn)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。此算法每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,且使每次尋道時(shí)間相對(duì)較短。由于該方法一直保持磁頭移動(dòng)尋訪方向不變,對(duì)兩端磁道請(qǐng)求比較有利。

      (5)N_SCAN算法

      此算法同時(shí)考慮下一個(gè)作業(yè)磁道請(qǐng)求與當(dāng)前磁頭位置的距離和當(dāng)前磁頭移動(dòng)方向,但每次磁臂調(diào)轉(zhuǎn)方向時(shí),將同時(shí)處理在磁頭向一側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求。本設(shè)計(jì)默認(rèn)磁頭當(dāng)前移動(dòng)方向?yàn)樽詢?nèi)向外,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,接下來(lái)一并考慮在磁頭向外側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求與磁頭內(nèi)側(cè)未被處理的作業(yè)磁道請(qǐng)求。此算法對(duì)中間磁道請(qǐng)求比較有利。

      2.論證結(jié)果:

      本設(shè)計(jì)輸入當(dāng)前磁頭位置及一組作業(yè)磁道請(qǐng)求。選擇所需的算法,輸出相應(yīng)結(jié)果:(1)先來(lái)先服務(wù)算法(FCFS)

      按輸入順序輸出訪問(wèn)序列。

      (2)最短尋道時(shí)間優(yōu)先算法(SSTF)

      依次輸出距離當(dāng)前磁頭位置最近的磁道請(qǐng)求。

      (3)電梯算法(SCAN)

      先按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置外側(cè)的磁道請(qǐng)求,再按照從大到小的順序輸出所輸入的當(dāng)前磁頭位置內(nèi)側(cè)的磁道請(qǐng)求。

      (4)環(huán)形掃描算法(C_SCAN)

      先按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置外側(cè)的磁道請(qǐng)求,再按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置內(nèi)側(cè)的磁道請(qǐng)求。

      (5)N_SCAN算法

      先按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置外側(cè)的磁道請(qǐng)求,再按照從大到小的順序輸出在磁頭向外側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求與所輸入的當(dāng)前磁頭位置內(nèi)側(cè)的磁道請(qǐng)求。

      三、系統(tǒng)的原理框圖

      1.總體框圖:

      本系統(tǒng)劃分為五個(gè)模塊:先來(lái)先服務(wù)算法模塊FCFS(int track[])、最短尋道時(shí)間算法模塊SSTF(int correnttrack,int track[])、電梯算法模塊SCAN(int correnttrack,int track[])、環(huán)形掃描算法模塊C_SCAN(int correnttrack,int track[])及N_SCAN算法模塊N_SCAN(int correnttrack,int track[])。

      總體框圖:

      磁盤調(diào)度模擬系統(tǒng)先來(lái)先服務(wù)算法最短尋道時(shí)間優(yōu)先算法電梯算法環(huán)形掃描算法N_SCAN算法 圖1 總體框圖 2.模塊框圖:

      (1)先來(lái)先服務(wù)算法模塊void FCFS(int track[])直接根據(jù)作業(yè)請(qǐng)求磁盤的先后順序?qū)Υ疟P進(jìn)行尋訪。此算法公平、簡(jiǎn)單,每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,不會(huì)出現(xiàn)某個(gè)作業(yè)的請(qǐng)求長(zhǎng)期得不到滿足的情況。

      先來(lái)先服務(wù)算法流程圖:

      FCFS輸入當(dāng)前磁頭位置 輸入一組作業(yè)磁道請(qǐng)求i=1i<10是輸出track[i]否i=i+1結(jié)束

      圖2 先來(lái)先服務(wù)算法模塊流程圖

      (2)最短尋道時(shí)間優(yōu)先算法模塊void SSTF(int correnttrack,int track[])優(yōu)先選擇距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求,可以使得每次尋道時(shí)所用的時(shí)間都最短。

      最短尋道時(shí)間優(yōu)先算法流程圖:

      SSTF輸入當(dāng)前磁頭位置及 一組作業(yè)磁道請(qǐng)求Min=|corrent-track[0]|i=0i<10是j=0j<10是track[j]!=-1d=|corrent-track[j]j++d

      圖3最短尋道時(shí)間優(yōu)先算法模塊流程圖

      (3)電梯算法模塊void SCAN(int correnttrack,int track[])默認(rèn)磁頭當(dāng)前移動(dòng)方向?yàn)樽詢?nèi)向外,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),6 直到再無(wú)更外的磁道請(qǐng)求,再將磁臂換向,訪問(wèn)磁頭內(nèi)側(cè)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。

      電梯算法流程圖:

      C_SCANk=0;min=track[0]i=0i<10是j=0j<10是i++j++Track[j]!=-1&&track[j]dLine[i]是k=k+1;否否i++j=k;i=0;i<10-ki++是Line[i]=dLine[j]j=j+1;否j=k-1;i=10-k;i<10i++是Line[i]=dLine[j]j=j-1;否Print(Line);結(jié)束

      圖4 電梯算法模塊流程圖

      (4)環(huán)形掃描算法模塊void C_SCAN(int correnttrack,int track[])先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再直接將 7 磁頭移到最內(nèi)側(cè)磁道(此過(guò)程快速移動(dòng),并不訪問(wèn)任何磁道),再由內(nèi)向外順次訪問(wèn)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。一直保持磁頭移動(dòng)尋訪方向不變,對(duì)兩端磁道請(qǐng)求比較有利。

      環(huán)形掃描算法流程圖:

      C_SCANk=0;min=track[0]i=0i<10是j=0j<10是i++j++Track[j]!=-1&&track[j]dLine[i]是k=k+1;否否i++j=k;i=0;i<10-ki++是Line[i]=dLine[j]j=j+1;否j=0;i=10-k;i<10i++是Line[i]=dLine[j]j=j+1;否Print(Line);結(jié)束

      圖5 環(huán)形掃描算法模塊流程圖

      (5)N_SCAN算法模塊void N_SCAN(int correnttrack,int track[])本設(shè)計(jì)默認(rèn)磁頭當(dāng)前移動(dòng)方向?yàn)樽詢?nèi)向外,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,接下來(lái)一并考慮在磁頭向外側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求與磁頭內(nèi)側(cè)未被處理的作業(yè)磁道請(qǐng)求。此算法對(duì)中間磁道請(qǐng)求比較有利。

      N_SCAN算法流程圖:

      N_SCANk=0;min=track[0]i=0i<10是j=0j<10是i++j++Track[j]!=-1&&track[j]dLine[i]是k=k+1;否否i++j=k;i=0;i<10-ki++是Line[i]=dLine[j]j=j+1;否1圖6 N_SCAN算法模塊流程圖(1)

      1j=k-1;i=10-k;i<10i++是Line[i]=dLine[j]j=j-1;否k=9-k;是否還有作業(yè)請(qǐng)求是輸入作業(yè)請(qǐng)求k=k-1;否K=9;max=Line[9];i=0;lLine[.]=-1i<10是j=0j<10是i++j++Line[j]>maxmax=Line[j];k=j否否lLine[i]=Line[k];Line[k]=-1;max=0;Print(lLine);結(jié)束

      圖7 N_SCAN算法模塊流程圖(2)

      四、設(shè)計(jì)程序

      1.主要模塊代碼:

      (1)先來(lái)先服務(wù)算法void FCFS(int track[])直接根據(jù)作業(yè)請(qǐng)求磁盤的先后順序?qū)Υ疟P進(jìn)行尋訪。先來(lái)先服務(wù)算法代碼: void FCFS(int track[]){ int k;for(k=0;k<9;k++){

      printf(“%d->”,track[k]);

      } printf(“%d”,track[9]);}

      (2)最短尋道時(shí)間優(yōu)先算法void SSTF(int correnttrack,int track[])優(yōu)先選擇距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。最短尋道時(shí)間優(yōu)先算法代碼: void SSTF(int correnttrack,int track[]){ int Line[10];int i;int j;int d;int min_d;int k;int corrent;

      min_d=abs(correnttrack-track[0]);

      k=0;corrent=correnttrack;

      for(i=0;i<10;i++){

      for(j=0;j<10;j++)

      {

      if(track[j]!=-1)

      {

      d=abs(corrent-track[j]);

      if(d

      {

      min_d=d;

      k=j;

      }

      }

      }

      Line[i]=track[k];

      corrent=Line[i];

      track[k]=-1;

      min_d=65536;

      } printf(“%d->”,correnttrack);Print(Line);}

      (3)電梯算法void SCAN(int correnttrack,int track[])默認(rèn)磁頭當(dāng)前移動(dòng)方向?yàn)樽詢?nèi)向外,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再將磁臂換向,訪問(wèn)磁頭內(nèi)側(cè)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。

      電梯算法代碼:

      void SCAN(int correnttrack,int track[]){ int Line[10];int dLine[10];int i;int j;int k;

      int min;

      k=0;

      min=track[0];for(i=0;i<10;i++){

      for(j=0;j<10;j++)

      {

      if(track[j]!=-1)

      {

      if(track[j]

      {

      min=track[j];

      k=j;

      }

      }

      }

      dLine[i]=track[k];

      track[k]=-1;

      min=65536;}

      k=0;for(i=0;i<10;i++){

      if(correnttrack>dLine[i])

      {

      k=k+1;

      } }

      j=k;for(i=0;i<10-k;i++){

      Line[i]=dLine[j];

      j=j+1;

      }

      j=k-1;for(i=10-k;i<10;i++){

      Line[i]=dLine[j];

      j=j-1;

      }

      Print(Line);}(4)環(huán)形掃描算法void C_SCAN(int correnttrack,int track[])先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再直接將磁頭移到最內(nèi)側(cè)磁道(此過(guò)程快速移動(dòng),并不訪問(wèn)任何磁道),再由內(nèi)向外順次訪問(wèn)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求。

      環(huán)形掃描算法代碼:

      void C_SCAN(int correnttrack,int track[]){ int Line[10];int dLine[10];int i;int j;int k;int min;k=0;min=track[0];for(i=0;i<10;i++){

      for(j=0;j<10;j++)

      {

      if(track[j]!=-1)

      {

      if(track[j]

      {

      min=track[j];

      k=j;

      }

      }

      }

      dLine[i]=track[k];

      track[k]=-1;

      min=65536;}

      k=0;for(i=0;i<10;i++){

      if(correnttrack>dLine[i])

      {

      k=k+1;

      }

      }

      j=k;for(i=0;i<10-k;i++){

      Line[i]=dLine[j];

      j=j+1;

      }

      j=0;for(i=10-k;i<10;i++){

      Line[i]=dLine[j];

      j=j+1;

      }

      Print(Line);}

      (5)N_SCAN算法void N_SCAN(int correnttrack,int track[])默認(rèn)磁頭當(dāng)前移動(dòng)方向?yàn)樽詢?nèi)向外,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,接下來(lái)一并考慮在磁頭向外側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求與磁頭內(nèi)側(cè)未被處理的作業(yè)磁道請(qǐng)求。

      N_SCAN算法

      void N_SCAN(int correnttrack,int track[]){ int Line[10];int dLine[10];int lLine[10];int i;int j;int k;

      int min,max;int choice;

      for(k=0;k<10;k++){

      lLine[k]=-1;

      }

      k=0;min=track[0];for(i=0;i<10;i++){ for(j=0;j<10;j++){

      if(track[j]!=-1)

      {

      if(track[j]

      {

      min=track[j];

      k=j;

      }

      } } dLine[i]=track[k];track[k]=-1;min=65536;} k=0;for(i=0;i<10;i++){ if(correnttrack>dLine[i]){

      k=k+1;} } j=k;for(i=0;i<10-k;i++){ Line[i]=dLine[j];printf(“%d->”,Line[i]);Line[i]=-1;j=j+1;} j=k-1;for(i=10-k;i<10;i++){ Line[i]=dLine[j];j=j-1;} printf(“n是否還有作業(yè)請(qǐng)求(1-是;0-否):n”);scanf(“%d”,&choice);

      k=9-k;while(choice==1){

      printf(“n請(qǐng)輸入作業(yè)的磁道請(qǐng)求:n”);

      scanf(“%d”,&Line[k]);

      k=k-1;

      printf(“n是否還有作業(yè)請(qǐng)求(1-是;0-否):n”);

      scanf(“%d”,&choice);

      } printf(“n磁頭繼續(xù)移動(dòng)軌跡為:n”);

      k=9;

      max=Line[9];for(i=0;i<10;i++){

      for(j=0;j<10;j++)

      {

      if(Line[j]>max)

      {

      max=Line[j];

      k=j;

      }

      }

      lLine[i]=Line[k];

      Line[k]=-1;

      max=0;}

      for(i=0;i<9;i++){

      if(lLine[i]!=-1)

      {

      printf(“%d->”,lLine[i]);

      } } printf(“%d”,lLine[9]);} 2.總模塊代碼:

      void main(){ int track[10];int n;int correnttrack;int choice=1;printf(“n******磁盤調(diào)度模擬系統(tǒng)******”);while(choice==1){

      printf(“n請(qǐng)輸入當(dāng)前磁道號(hào):”);

      scanf(“%d”,&correnttrack);

      printf(“n請(qǐng)輸入一組作業(yè)的磁道請(qǐng)求<以回車分隔>:n”);

      scanf(“%d %d %d %d %d %d %d %d %d %d”,&track[0],&track[1],&track[2],&track[3],&track[4],&track[5],&track[6],&track[7],&track[8],&track[9]);

      printf(“n請(qǐng)選擇算法:n”);

      printf(“t1.先來(lái)先服務(wù)算法(FCFS)n”);

      printf(“t2.最短尋道時(shí)間優(yōu)先算法(SSTF)n”);

      printf(“t3.電梯算法(SCAN)n”);

      printf(“t4.環(huán)形掃描算法(C_SCAN)n”);

      printf(“t5.(N_SCAN)n”);

      scanf(“%d”,&n);

      printf(“nn”);

      switch(n)

      {

      case 1:

      printf(“********先來(lái)先服務(wù)算法(FCFS)*********n磁頭移動(dòng)軌跡為:n”);

      FCFS(track);

      break;

      case 2:

      printf(“*****最短尋道時(shí)間優(yōu)先算法(SSTF)******n磁頭移動(dòng)軌跡為:n”);

      SSTF(correnttrack,track);

      break;

      case 3:

      printf(“************電梯算法(SCAN)***********n磁頭移動(dòng)軌跡為:n”);

      SCAN(correnttrack,track);

      break;

      case 4:

      printf(“*********環(huán)形掃描算法(C_SCAN)********n磁頭移動(dòng)軌跡為:n”);

      C_SCAN(correnttrack,track);

      break;

      case 5:

      printf(“****************N_SCAN***************n磁頭移動(dòng)軌跡為:n”);

      N_SCAN(correnttrack,track);

      break;

      } }

      printf(“n請(qǐng)問(wèn)是否繼續(xù)?(1-繼續(xù);0-退出)n”);

      scanf(“%d”,&choice);}

      五、實(shí)驗(yàn)結(jié)果

      1.總模塊實(shí)驗(yàn)結(jié)果:

      程序開(kāi)始運(yùn)行,將出現(xiàn)輸入選擇界面;

      圖8 主界面

      2.基礎(chǔ)模塊實(shí)驗(yàn)結(jié)果:

      (1)先來(lái)先服務(wù)算法(First-Come,F(xiàn)irst-Served,F(xiàn)CFS)

      按輸入順序輸出訪問(wèn)序列。

      選擇該算法后,將輸出相應(yīng)磁頭移動(dòng)軌跡:

      圖9 先來(lái)先服務(wù)算法0

      輸出結(jié)果為69-> 23-> 120-> 45-> 77-> 31-> 55-> 99-> 150-> 2 滿足要求。

      (2)最短尋道時(shí)間優(yōu)先算法(Shortest Seek Time First,SSTF)

      依次輸出距離當(dāng)前磁頭位置最近的磁道請(qǐng)求。選擇該算法后,將輸出相應(yīng)磁頭移動(dòng)軌跡:

      圖10 最短尋道優(yōu)先算法

      輸出結(jié)果為45-> 55-> 69-> 77-> 99-> 120-> 150-> 31-> 23-> 2 滿足要求。(3)電梯算法(SCAN)

      先按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置外側(cè)的磁道請(qǐng)求,再按照從大到小的順序輸出所輸入的當(dāng)前磁頭位置內(nèi)側(cè)的磁道請(qǐng)求。

      選擇該算法后,將輸出相應(yīng)磁頭移動(dòng)軌跡:

      圖11 電梯算法

      輸出結(jié)果為55-> 69-> 77-> 99-> 120-> 150-> 45-> 31-> 23-> 2 滿足要求。

      3.?dāng)U展模塊實(shí)驗(yàn)結(jié)果:

      (1)環(huán)形掃描算法(C_SCAN)

      先按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置外側(cè)的磁道請(qǐng)求,再按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置內(nèi)側(cè)的磁道請(qǐng)求。

      選擇該算法后,將輸出相應(yīng)磁頭移動(dòng)軌跡:

      圖12 環(huán)形掃描算法

      輸出結(jié)果為55-> 69-> 77-> 99-> 120-> 150-> 2-> 23-> 31-> 45 滿足要求。

      (2)N_SCAN算法

      先按照從小到大的順序輸出所輸入的當(dāng)前磁頭位置外側(cè)的磁道請(qǐng)求,再按照從大到小的順序輸出在磁頭向外側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求與所輸入的當(dāng)前磁頭位置內(nèi)側(cè)的磁道請(qǐng)求。

      選擇該算法后,將輸出相應(yīng)磁頭移動(dòng)軌跡:

      圖13 N_SCAN算法

      輸出結(jié)果為55-> 69-> 77-> 99-> 120-> 150-> 88-> 45-> 31-> 23-> 8-> 2-> 1 滿足要求。

      六、調(diào)試分析及故障處理

      1.調(diào)試分析:

      (1)在代碼中錯(cuò)誤的使用了中文括號(hào)“)”,導(dǎo)致程序出錯(cuò)。

      圖14 錯(cuò)誤報(bào)告(2)在定義函數(shù)時(shí)誤在結(jié)尾處加分號(hào)“;”,導(dǎo)致調(diào)試過(guò)程中出錯(cuò)。

      圖15 錯(cuò)誤報(bào)告

      (3)由于未對(duì)變量初始化,導(dǎo)致錯(cuò)誤:

      圖16 錯(cuò)誤警告

      未對(duì)k初始化,如下圖:

      圖17 變量表

      2.故障處理:

      重新檢查代碼,發(fā)現(xiàn)錯(cuò)誤,并及時(shí)修正。調(diào)試后無(wú)誤:

      圖18 無(wú)錯(cuò)誤及警告

      發(fā)生故障時(shí),可采取單步調(diào)試的方法,逐條語(yǔ)句檢查,修正錯(cuò)誤。

      圖19 故障處理過(guò)程

      七、設(shè)計(jì)結(jié)論

      磁盤,是一種很重要也很常用的外設(shè),其分配也有一定的分配策略。在操作系統(tǒng)中,作業(yè)對(duì)磁盤的請(qǐng)求常常要排隊(duì),由此需要一些高效率的磁盤分配策略算法。本系統(tǒng)設(shè)計(jì)了五種尋道策略,其中先來(lái)先服務(wù)算法為一種最簡(jiǎn)單的磁盤調(diào)度算法,它直接根據(jù)作業(yè)請(qǐng)求磁盤的先后順序?qū)Υ疟P進(jìn)行尋訪,公平、簡(jiǎn)單,每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,不會(huì)出現(xiàn)某個(gè)作業(yè)的請(qǐng)求長(zhǎng)期得不到滿足的情況,但未對(duì)尋道方案進(jìn)行優(yōu)化,故平均周轉(zhuǎn)時(shí)間及帶權(quán)周轉(zhuǎn)時(shí)間都會(huì)較長(zhǎng);最短尋道時(shí)間優(yōu)先算法優(yōu)先選擇距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求,可以使得每次尋道時(shí)所用的時(shí)間都最短,但不能保證平均周轉(zhuǎn)時(shí)間及帶權(quán)周轉(zhuǎn)時(shí)間最短;電 梯算法同時(shí)考慮下一個(gè)作業(yè)磁道請(qǐng)求與當(dāng)前磁頭位置的距離和當(dāng)前磁頭移動(dòng)方向先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再將磁臂換向,訪問(wèn)磁頭內(nèi)側(cè)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求,避免了饑餓現(xiàn)象的出現(xiàn),每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,且使每次尋道時(shí)間相對(duì)較短;環(huán)形掃描算法的磁頭移動(dòng)方向一直為自內(nèi)向外,同時(shí)考慮下一個(gè)作業(yè)磁道請(qǐng)求與當(dāng)前磁頭位置的距離最短,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,再直接將磁頭移到最內(nèi)側(cè)磁道(此過(guò)程快速移動(dòng),并不訪問(wèn)任何磁道),再由內(nèi)向外順次訪問(wèn)距離當(dāng)前磁頭位置最近的作業(yè)磁道請(qǐng)求,使每個(gè)作業(yè)的磁盤請(qǐng)求都可以得到處理,且使每次尋道時(shí)間相對(duì)較短,由于該方法一直保持磁頭移動(dòng)尋訪方向不變,對(duì)兩端磁道請(qǐng)求比較有利; N_SCAN算法同時(shí)考慮下一個(gè)作業(yè)磁道請(qǐng)求與當(dāng)前磁頭位置的距離和當(dāng)前磁頭移動(dòng)方向,但每次磁臂調(diào)轉(zhuǎn)方向時(shí),將同時(shí)處理在磁頭向一側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求,先選擇當(dāng)前磁頭之外距離其最近的磁道進(jìn)行訪問(wèn),直到再無(wú)更外的磁道請(qǐng)求,接下來(lái)一并考慮在磁頭向外側(cè)移動(dòng)過(guò)程當(dāng)中輸入的作業(yè)請(qǐng)求與磁頭內(nèi)側(cè)未被處理的作業(yè)磁道請(qǐng)求,此算法對(duì)中間磁道請(qǐng)求比較有利??傊?,各種算法都有其長(zhǎng)處,也各有不足,需要在實(shí)際應(yīng)用中權(quán)衡利弊,擇優(yōu)使用。

      八、心得體會(huì)

      本次操作系統(tǒng)課程設(shè)計(jì),我不僅完成了課程要求中的任務(wù),更在中期檢查后聽(tīng)取了老師的建議,自己上網(wǎng)查找了其他兩種磁盤調(diào)度算法加入了程序當(dāng)中,使系統(tǒng)更加完善和完整。在這過(guò)程中,我不僅加深了對(duì)操作系統(tǒng)的了解,進(jìn)一步熟悉了C語(yǔ)言編程和Microsoft Visual C++ 6.0的使用,更加了解了很多之前在課本中和課程學(xué)習(xí)中并不了解和知道的知識(shí),擴(kuò)展了視野,豐富了體驗(yàn)。

      由于自己的知識(shí)和能力還不到位,在這兩周的時(shí)間里也經(jīng)歷了很多困難和挑戰(zhàn),但我認(rèn)為,在這過(guò)程中的每一次的錯(cuò)誤和故障,都使我收獲頗豐,使我成長(zhǎng)了很多。

      當(dāng)然,這個(gè)磁盤調(diào)度系統(tǒng)的設(shè)計(jì)遠(yuǎn)非完美,還有很多地方可以改進(jìn),例如界面可以更加友好,資源可以更加節(jié)約,算法也還有優(yōu)化的余地,但是時(shí)間有限,本人經(jīng)歷也有限,在課程設(shè)計(jì)時(shí)間允許的范圍內(nèi)只能做到這樣,我會(huì)在課余時(shí)間自行完善該磁盤調(diào)度算法程序。

      最后,這次課設(shè)給我?guī)?lái)了很多的收獲,非常感謝在課設(shè)過(guò)程中老師不厭其煩的講解指導(dǎo)和身邊各位同學(xué)的細(xì)心幫助。

      下載實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法word格式文檔
      下載實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法.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)范文推薦

        操作系統(tǒng)進(jìn)程調(diào)度算法模擬實(shí)驗(yàn)報(bào)告

        進(jìn)程調(diào)度算法模擬 專業(yè):XXXXX 學(xué)號(hào):XXXXX 姓名:XXX 實(shí)驗(yàn)日期:20XX年XX月XX日 一、實(shí)驗(yàn)?zāi)康?通過(guò)對(duì)進(jìn)程調(diào)度算法的模擬加深對(duì)進(jìn)程概念和進(jìn)程調(diào)度算法的理解。 二、實(shí)驗(yàn)要求 編寫......

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

        《算法設(shè)計(jì)與分析》 實(shí)驗(yàn)報(bào)告 班級(jí)姓名學(xué)號(hào)年 月日 目錄 實(shí)驗(yàn)一二分查找程序?qū)崿F(xiàn)…………………………………………………………………03頁(yè) 實(shí)驗(yàn)二棋盤覆蓋問(wèn)題(分治法).…......

        RSA算法實(shí)驗(yàn)報(bào)告

        信息安全實(shí)驗(yàn)報(bào)告 題 目 RSA算法 姓 名 學(xué) 號(hào) 專業(yè)年級(jí) 計(jì)算機(jī)科學(xué)與技術(shù)2014級(jí)(1)班 指導(dǎo)教師 2016年 12 月 10日 一、 實(shí)驗(yàn)?zāi)康?了解非對(duì)稱加密機(jī)制 理解RSA算法的加解密原......

        銀行家算法實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 何美西109253030212 一、 實(shí)驗(yàn)名稱:銀行家算法 二、 實(shí)驗(yàn)?zāi)康模恒y行家算法是避免死鎖的一種重要方法,通過(guò)編寫一個(gè)簡(jiǎn)單的銀行家算法程序,加深了解有關(guān)資......

        銀行家算法實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告 一、 實(shí)驗(yàn)名稱:銀行家算法 二、 實(shí)驗(yàn)?zāi)康模恒y行家算法是避免死鎖的一種重要方法,通過(guò)編寫一個(gè)簡(jiǎn)單的銀行家算法程序,加深了解有關(guān)資源申請(qǐng)、避免死鎖等概......

        PRIM算法實(shí)驗(yàn)報(bào)告

        篇一:prim算法實(shí)驗(yàn)報(bào)告算法實(shí)驗(yàn)報(bào)告學(xué)院:xxx 班級(jí):xxx 學(xué)號(hào):xxx 姓名:xxx prim 篇二:prim最小生成樹(shù)算法實(shí)驗(yàn)報(bào)告 算法分析與設(shè)計(jì)之prim 學(xué)院:軟件學(xué)院 學(xué)號(hào):201421031059 姓名:呂呂......

        銀行家算法_實(shí)驗(yàn)報(bào)告

        課程設(shè)計(jì)報(bào)告 課程設(shè)計(jì)名稱 共享資源分配與銀行家算法 系(部)專業(yè)班級(jí)姓 名學(xué) 號(hào)指導(dǎo)教師 年 月 日 第 1 頁(yè) 共 1 頁(yè) 、 目 錄 一、課程設(shè)計(jì)目的和意義 ........................

        《計(jì)算機(jī)算法》實(shí)驗(yàn)報(bào)告

        1. 實(shí)驗(yàn)名稱 本次實(shí)驗(yàn)的名稱。 2. 問(wèn)題描述 對(duì)本次實(shí)驗(yàn)要解決的問(wèn)題的描述。 例子:處理漢諾塔問(wèn)題時(shí),描述什么是漢諾塔問(wèn)題。 3. 解決思路 采用什么方法;為什么可以采用這個(gè)方......