亚洲一区爱区精品无码_无码熟妇人妻AV_日本免费一区二区三区最新_国产AV寂寞骚妇

操作系統(tǒng)課程設(shè)計(jì),磁盤(pán)調(diào)度算法范文3篇(磁盤(pán)調(diào)度算法的模擬實(shí)現(xiàn)課程設(shè)計(jì))

時(shí)間:2022-11-01 12:54:22 綜合范文

  下面是范文網(wǎng)小編整理的操作系統(tǒng)課程設(shè)計(jì),磁盤(pán)調(diào)度算法范文3篇(磁盤(pán)調(diào)度算法的模擬實(shí)現(xiàn)課程設(shè)計(jì)),歡迎參閱。

操作系統(tǒng)課程設(shè)計(jì),磁盤(pán)調(diào)度算法范文3篇(磁盤(pán)調(diào)度算法的模擬實(shí)現(xiàn)課程設(shè)計(jì))

操作系統(tǒng)課程設(shè)計(jì),磁盤(pán)調(diào)度算法范文1

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

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

  姓名:劉道林

  一.

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

  熟悉磁盤(pán)的結(jié)構(gòu)以及磁盤(pán)的驅(qū)動(dòng)調(diào)度算法的模擬,編程實(shí)現(xiàn)簡(jiǎn)單常用的磁盤(pá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)畫(huà)模擬。

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

  二.

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

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

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

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

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

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

  常用的磁盤(pán)驅(qū)動(dòng)調(diào)度算法有:最簡(jiǎn)單的磁盤(pán)驅(qū)動(dòng)調(diào)度算法是先入先出(FIFO)法。這種算法的實(shí)質(zhì)是,總是嚴(yán)格按時(shí)間順序?qū)Υ疟P(pán)請(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(pán)驅(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)程名稱(chēng)*/

  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(“”);

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

  Printf(“ 0-199n”);

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

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

  Printf(“ 0-19n”);

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

  Printf(“ 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ì)稱(chēng)過(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<=:accept requestnnum>: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>&&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<=)

/*接受請(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ì),磁盤(pán)調(diào)度算法范文2

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

  學(xué)號(hào):班級(jí):軟技姓名:張靖?jìng)?課 程 設(shè) 計(jì) 報(bào) 告

  4班

  目錄 實(shí)驗(yàn):進(jìn)程調(diào)度算法——時(shí)間片輪轉(zhuǎn)算法 2 實(shí)驗(yàn):銀行家算法3 實(shí)驗(yàn):分區(qū)分配算法——4 實(shí)驗(yàn):頁(yè)面置換算法——5 實(shí)驗(yàn):磁盤(pán)調(diào)度算法——

  bF和FF

  fIFO和LRU SCAN和SSTF 1實(shí)驗(yàn):進(jìn)程調(diào)度算法——時(shí)間片輪轉(zhuǎn)算法

  1.實(shí)驗(yàn)設(shè)計(jì)說(shuō)明

  用時(shí)間片輪轉(zhuǎn)算法模擬單處理機(jī)調(diào)度。

(1)建立一個(gè)進(jìn)程控制塊PCB來(lái)代表。PCB包括:進(jìn)程名、到達(dá)時(shí)間、運(yùn)行時(shí)間和進(jìn)程后的狀態(tài)。

  進(jìn)程狀態(tài)分為就緒(R)和刪除(C)。

(2)為每個(gè)進(jìn)程任意確定一個(gè)要求運(yùn)行時(shí)間和到達(dá)時(shí)間。

(3)按照進(jìn)程到達(dá)的先后順序排成一個(gè)隊(duì)列。再設(shè)一個(gè)指針指向隊(duì)首和隊(duì)尾。(4)執(zhí)行處理機(jī)調(diào)度時(shí),開(kāi)始選擇對(duì)首的第一個(gè)進(jìn)程運(yùn)行。(5)執(zhí)行: a)輸出當(dāng)前運(yùn)行進(jìn)程的名字;

  b)運(yùn)行時(shí)間減去時(shí)間片的大小。

(6)進(jìn)程執(zhí)行一次后,若該進(jìn)程的剩余運(yùn)行時(shí)間為零,則刪除隊(duì)首,并將該進(jìn)程的狀態(tài)置為C;若不為空,則將向后找位置插入。繼續(xù)在運(yùn)行隊(duì)首的進(jìn)程。

(7)若進(jìn)程隊(duì)列不空,則重復(fù)上述的(5)和(6)步驟直到所有進(jìn)程都運(yùn)行完為止。

  2.實(shí)驗(yàn)代碼

/*****************時(shí)間片輪轉(zhuǎn)調(diào)度算法*******************/ #include <> #include <> #include <> #define N 10 int time=0;bool spe=false;typedef struct pcb /*進(jìn)程控制塊定義*/ {

  char pname[N];int runtime;/*進(jìn)程名*/ /*服務(wù)時(shí)間*/ int arrivetime;/*到達(dá)時(shí)間*/ char state;/*進(jìn)程狀態(tài)*/ struct pcb*next;/*連接指針*/ }PCB;typedef struct back_team/*后備隊(duì)列定義*/ { PCB*first,*tail;}BACK_TEAM;typedef struct pre_team/*就緒隊(duì)列定義*/ { PCB*first,*tail;}PRE_TEAM;PCB*creat()/*創(chuàng)建PCB*/ {

  char s[N];printf(“請(qǐng)輸入進(jìn)程名:n”);scanf(“%s”,s);printf(“請(qǐng)輸入進(jìn)程服務(wù)時(shí)間(/秒):n”);int t;scanf(“%d”,&t);PCB*p=(PCB*)malloc(sizeof(PCB));strcpy(p->pname,s);p->runtime=t;printf(“請(qǐng)輸入進(jìn)程到達(dá)時(shí)間(/秒):n”);scanf(“%d”,&t);p->arrivetime=t;p->state='R';p->next=NULL;getchar();return p;} PCB*copy(PCB*p)/*復(fù)制一個(gè)進(jìn)程*/ {

} PCB*getnext(PCB*p,BACK_TEAM*head)/*得到隊(duì)列中下一個(gè)進(jìn)程*/ {

} void del(BACK_TEAM*head,PRE_TEAM*S)/*釋放申請(qǐng)的空間*/ {

  PCB*p=head->first->next;while(p){ free(head->first);head->first=p;PCB*s=head->first;if(!p)return NULL;if(!p)return NULL;PCB*s=(PCB*)malloc(sizeof(PCB));strcpy(s->pname,p->pname);s->next=NULL;s->arrivetime=p->arrivetime;s->runtime=p->runtime;s->state=p->state;return s;while(strcmp(s->pname,p->pname))s=s->next;return s->next;

} } p=p->next;head->first=head->tail=NULL;free(head);free(S);BACK_TEAM*creatbt(BACK_TEAM*head)/*創(chuàng)建后備隊(duì)列*/ {

} bool recognize(PRE_TEAM*s1)/*判斷運(yùn)行是否結(jié)束*/ {

  if(!s1||!s1->first)return false;PCB*p=creat();if(!head->first)else head->tail->next=p;head->first=p;head->tail=p;return head;if(s1->first==s1->tail)

  if(s1->first->state!='C')else return false;return true;PCB*test=s1->first;while(test!=s1->tail&&(test->state!='C'))test=test->next;if(test==s1->tail)

} return true;else return false;PCB*run(PRE_TEAM*s)/*在CPU中運(yùn)行*/ {

  if(!s->first){

} printf(“%dt%st”,time,s->first);s->first->runtime--;time++;if(s->first->runtime<=0){

} PCB*p=s->first;s->first->state='C';printf(“%cn”,s->first->state);s->first=p->next;free(p);if(!s->first){

} goto next;s->tail=NULL;spe=false;return NULL;spe=false;return NULL;printf(“%cn”,s->first->state);next:PCB*head=s->first;

} int CREAT(PCB*HEAD,PRE_TEAM*head2,bool*test,PCB*c)/*創(chuàng)建就緒隊(duì)列*/ {

  int i=0;if(!head2->first)

  if(HEAD){

} if(c){

} head2->first=head2->tail=HEAD;return 1;head2->first=c;c->next=HEAD;head2->tail=HEAD;return 1;s->first=head->next;if(!s->first){

} head->next=NULL;return head;s->tail=NULL;spe=true;if(head2->first==head2->tail){

} else {

} if(*test){

} if(c){

} head2->tail->next=c;head2->tail=c;if(head2->first->arrivetime!=time)for(i=0;ifirst->arrivetime;i++,time++);*test=false;return 1;if(c){

} if(c->arrivetime!=time){

} head2->tail->next=c;head2->tail=c;time++;return 1;if(HEAD){ head2->tail->next=HEAD;

} } head2->tail=HEAD;return 1;int main(void){

  bACK_TEAM*head1=(BACK_TEAM*)malloc(sizeof(BACK_TEAM));head1->first=head1->tail=NULL;PRE_TEAM *head2=(PRE_TEAM*)malloc(sizeof(PRE_TEAM));head2->first=head2->tail=NULL;char ask;int num=0;bool test=true;do{

  Printf(“要?jiǎng)?chuàng)建進(jìn)程嗎(y/n):”);if((ask=getchar())=='y'||ask=='Y'){

} else if(ask=='n'||ask=='N')else return 1;break;head1=creatbt(head1);num++;}while(1);PCB*p=copy(head1->first);PCB*HEAD=NULL;head2->first=head2->tail=copy(head1->first);printf(“時(shí)刻t進(jìn)程名t狀態(tài)n”);

} while(spe||recognize(head2)){

} del(head1,head2);return 1;CREAT(HEAD,head2,&test,p);HEAD=run(head2);p=copy(getnext(p,head1));3.實(shí)驗(yàn)結(jié)果

  和不馬上運(yùn)行:

  當(dāng)有兩個(gè)進(jìn)程的時(shí)候

  當(dāng)有多個(gè)進(jìn)程的時(shí)候:

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

  rR算法:每次調(diào)度時(shí),把CPU分配給隊(duì)首進(jìn)程,并且令其執(zhí)行一個(gè)時(shí)間片,時(shí)間片的大小從幾個(gè)ms到幾百ms。當(dāng)執(zhí)行的時(shí)間片用完時(shí),由一個(gè)計(jì)時(shí)器發(fā)出時(shí)鐘中斷請(qǐng)求,調(diào)度程序便依據(jù)此信號(hào)來(lái)停止該進(jìn)程的執(zhí)行;并且把它送往就緒隊(duì)列的隊(duì)尾;然后,再把處理劑分配給就緒隊(duì)列中的新隊(duì)首進(jìn)程,同時(shí)也讓它執(zhí)行一個(gè)時(shí)間片。這樣就可以保證就緒隊(duì)列中的所有進(jìn)程在一個(gè)給定時(shí)間內(nèi)均能獲得一時(shí)間片的處理機(jī)執(zhí)行時(shí)間。換言之,系統(tǒng)能在給定的時(shí)間內(nèi)相應(yīng)所有用戶(hù)的請(qǐng)求.2實(shí)驗(yàn):銀行家算法

  1.實(shí)驗(yàn)設(shè)計(jì)說(shuō)明

  1.該算法通過(guò)建立幾個(gè)簡(jiǎn)單的二維數(shù)組Available,Max,Allocation,Need簡(jiǎn)單的模擬銀行家算法和安全性算法,每個(gè)二維數(shù)組默認(rèn)[][0]為A資源,[][1]為B資源,[][2]為C資源,默認(rèn)有5個(gè)進(jìn)程

  2.程序首先要輸入各個(gè)進(jìn)程的三種資源的情況,包括每個(gè)進(jìn)程最大的需求量,已經(jīng)分配的資源量和現(xiàn)在還需要的資源量,以及系統(tǒng)現(xiàn)在剩余的資源量。3.程序會(huì)判斷輸入的信息是否在程序的規(guī)定范圍內(nèi),正確才運(yùn)行。

  4.在執(zhí)行安全算法開(kāi)始時(shí),Work∶=Available;② Finish: 它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。開(kāi)始時(shí)先做Finish[i]∶=false;當(dāng)有足夠資源分配給進(jìn)程時(shí),再令Finish[i]∶=true 5.從進(jìn)程集合中找到一個(gè)能滿(mǎn)足下述條件的進(jìn)程: Finish[i]=false;并且 Need[i,j]≤Work[j]; 若找到,執(zhí)行6,否則,執(zhí)行7。

  6.當(dāng)進(jìn)程Pi獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:

  work[j]∶=Work[i]+Allocation[i,j];Finish[i]∶=true;然后繼續(xù)執(zhí)行5。

  7.如果所有進(jìn)程的Finish[i]=true都滿(mǎn)足,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。

  2.實(shí)驗(yàn)代碼

#include <> int Available[3],Max[5][3],Allocation[5][3],Need[5][3];bool Safe(int p){ int Work[3]={Available[0],Available[1],Available[2]};int Finish[5]={0,0,0,0,0};int i=0,m,num=0;if(Need[p][0]||Need[p][1]||Need[p][2])

  return false;printf(“p%d可以運(yùn)行n”,p);Work[0]+=Allocation[p][0];Work[1]+=Allocation[p][1];Work[2]+=Allocation[p][2];Finish[p]=1;while(num<=25){

  if(!Finish[i]&&(Need[i][0]<=Work[0])&&(Need[i][1]<=Work[1])&&(Need[i][2]<=Work[2]))

{

  Printf(“p%d可以運(yùn)行n”,i);

  work[0]+=Allocation[i][0];

  work[1]+=Allocation[i][1];

  work[2]+=Allocation[i][2];

  finish[i]=1;

}

  num++;

  i=(i+1)%5;

  if(i==p)

  i++;} for(m=0;m<5;m++)

  if(Finish[m]==0)

  break;if(m==5)

  return true;else {

  Printf(“系統(tǒng)處于不安全狀態(tài)!n”);

  return false;} } void Banker(int p,int i,int j,int k){ int able[3]={Available[0],Available[1],Available[2]};int need[3]={Need[p][0],Need[p][1],Need[p][2]};int allocation[3]={Allocation[p][0],Allocation[p][1],Allocation[p][2]};if(i<=Need[p][0]&&j<=Need[p][1]&&k<=Need[p][2])

  if(i<=Available[0]&&j<=Available[1]&&k<=Available[2])

{

  available[0]-=i;

  available[1]-=j;

  available[2]-=k;

  allocation[p][0]+=i;

  allocation[p][1]+=j;

  allocation[p][2]+=k;

  need[p][0]-=i;

  need[p][1]-=j;

  need[p][2]-=k;

  if(!Safe(p))

{

  available[0]=able[0],Available[1]=able[1],Available[2]=able[2];

  need[p][0]=need[0],Need[p][1]=need[1],Need[p][2]=need[2];

  allocation[p][0]=allocation[0],Allocation[p][1]=allocation[1],Allocation[p][2]=allocation[2];

  Printf(“系統(tǒng)可能發(fā)生死鎖!n”);

}

}

  else

  Printf(“等待!系統(tǒng)資源不足!n”);else

  Printf(“錯(cuò)誤!申請(qǐng)的資源錯(cuò)誤!n”);} int main(void){ int i,j,k=0,p;printf(“請(qǐng)輸入進(jìn)程的三種資源的情況max{a,b,c} allocation{a,b,c} need{a,b,c}:n”);for(i=0;i<5;i++){

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

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

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

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

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

  scanf(“%d”,&Need[i][j]);} printf(“請(qǐng)輸入Available{a,b,c}情況:”);for(i=0;i<3;i++)

  scanf(“%d”,&Available[i]);printf(“MaxtAllotNeedtAvain”);for(i=0;i<5;i++){

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

  Printf(“%d ”,Max[i][j]);

  Printf(“t”);

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

  Printf(“%d ”,Allocation[i][j]);

  Printf(“t”);

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

  Printf(“%d ”,Need[i][j]);

  Printf(“t”);

  if(k!=4)

  Printf(“n”);

  k++;} for(i=0;i<3;i++)printf(“%d ”,Available[i]);printf(“n請(qǐng)輸入要申請(qǐng)的進(jìn)程和資源<0~4>:”);scanf(“%d %d %d %d”,&p,&i,&j,&k);if(p>=0&&p<=4)Banker(p,i,j,k);else printf(“沒(méi)有此進(jìn)程!”);return 1;} 3.實(shí)驗(yàn)結(jié)果

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

  這個(gè)實(shí)驗(yàn)只是簡(jiǎn)單的演示了進(jìn)程申請(qǐng)資源之后的進(jìn)程運(yùn)行的其中一個(gè)運(yùn)行序列,因?yàn)檫@個(gè)算法課本上已經(jīng)有詳細(xì)的解說(shuō),所以這個(gè)程序并沒(méi)有把算法的過(guò)程展現(xiàn)出來(lái),只展現(xiàn)了進(jìn)程的運(yùn)行序列結(jié)果,另外,如果申請(qǐng)錯(cuò)誤的話(huà)程序會(huì)有不同的結(jié)果

  有時(shí)會(huì)發(fā)生死鎖 實(shí)驗(yàn):分區(qū)分配算法——BF和FF 1.實(shí)驗(yàn)設(shè)計(jì)說(shuō)明

  1.這個(gè)算法模擬的是對(duì)內(nèi)存空間的管理,這個(gè)程序用了一個(gè)簡(jiǎn)單的二維數(shù)組模擬分區(qū)表。2.程序首先要輸入固定的五個(gè)分區(qū)的大小和始址,其次要輸入作業(yè)的大小和實(shí)現(xiàn)的算法,由于這個(gè)程序把FF和BF放到一個(gè)程序中,便于比較兩個(gè)算法。

  首次適應(yīng)算法FF(First Fit)把分區(qū)大于等于請(qǐng)求作業(yè)請(qǐng)求的分區(qū)分給請(qǐng)求者,余下部分仍留在空閑區(qū)中,然后修改分區(qū)表。然后打印出分配后的分區(qū)表 最佳適應(yīng)算法BF(Best Fit)

  首先把分區(qū)表按空間大小從小到大排序。然后把分區(qū)大于等于請(qǐng)求作業(yè)請(qǐng)求的分區(qū)分給請(qǐng)求者,余下部分仍留在空閑區(qū)中,然后修改分區(qū)表。然后打印出分配后的分區(qū)表

  2.實(shí)驗(yàn)代碼 #include <> int table[5][3];void FirstFit(int job[3],int ta[5][3]){

  int i,j;for(j=0;j<3;j++)

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

  if(ta[i][1]>=job[j]){

} ta[i][1]-=job[j];ta[i][2]+=job[j];break;if(i==5)printf(“內(nèi)存不足!請(qǐng)等待!n”);

} printf(“空閑區(qū)t大小t始址n”);for(j=0;j<5;j++){

} for(i=0;i<3;i++)printf(“%dt”,ta[j][i]);printf(“n”);void BestFit(int job[3]){

  int j1,temp1,temp2,temp3,i,j;for(j1=0;j1<3;j1++){

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

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

  if(table[j][1]>table[j+1][1]){ temp1=table[j][0];temp2=table[j][1];temp3=table[j][2];

  table[j][0]=table[j+1][0];table[j][1]=table[j+1][1];table[j][2]=table[j+1][2];

}

  table[j+1][0]=temp1;table[j+1][1]=temp2;table[j+1][2]=temp3;

} if(i==5)printf(“內(nèi)存不足!請(qǐng)等待!n”);printf(“空閑區(qū)t大小t始址n”);for(j=0;j<5;j++){

} for(i=0;i<3;i++)printf(“%dt”,table[j][i]);

} for(i=0;i<5;i++)

  if(table[i][1]>=job[j1]){

} table[i][1]-=job[j1];table[i][2]+=job[j1];break;printf(“n”);void main(){

  int table1[5][3],job[3],j,i;printf(“請(qǐng)輸入5個(gè)空分區(qū)的大小和始址:”);for(i=0;i<5;i++){

} for(j=0;j<5;j++){

} printf(“請(qǐng)輸入3個(gè)要運(yùn)行作業(yè)的大?。骸?;for(i=0;i<3;i++)scanf(“%d”,&job[i]);for(i=0;i<3;i++)printf(“%dt”,table[j][i]);table[i][0]=i+1;table1[i][0]=i+1;for(j=1;j<3;j++){

} scanf(“%d”,&table[i][j]);table1[i][j]=table[i][j];printf(“n”);printf(“請(qǐng)輸入要實(shí)現(xiàn)的算法1(FF)2(BF):”);

} char c;scanf(“%d”,&i);getchar();if(i==1){

} else

  if(i==2){

} BestFit(job);printf(“還要實(shí)現(xiàn)FF嗎(y/n)”);if((c=getchar())=='y')FirstFit(job,table1);FirstFit(job,table1);printf(“還要實(shí)現(xiàn)BF嗎(y/n)”);if((c=getchar())=='y')BestFit(job);3.實(shí)驗(yàn)結(jié)果

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

  首先輸入分區(qū)表的分區(qū)情況,然后輸入運(yùn)行作業(yè)的大小,選擇要實(shí)現(xiàn)的算法。第一個(gè)作業(yè)是96,所以找到第四個(gè)分區(qū),第四個(gè)分區(qū)變?yōu)?22,316,接著到第二個(gè)作業(yè)20,然后把第一個(gè)分區(qū)分給第二個(gè)作業(yè),則第一個(gè)分區(qū)信息變?yōu)?22,316,到第三個(gè)作業(yè)時(shí),由于內(nèi)存表中沒(méi)有比第三個(gè)請(qǐng)求的分區(qū)還大的分區(qū),所以會(huì)提示內(nèi)存不足;

  然后到BF算法,因?yàn)槭前纯臻g大小排序的,所以第一個(gè)作業(yè)96被分配給了已經(jīng)排好序的內(nèi)存為96的第五個(gè)分區(qū),第二個(gè)作業(yè)被分配給大小為36的分區(qū),第三個(gè)作業(yè)被分配給內(nèi)存大小為218的分區(qū),然后又對(duì)剩余空間再次排隊(duì),用來(lái)給下一批作業(yè)分配。實(shí)驗(yàn):頁(yè)面置換算法——FIFO和LRU 1實(shí)驗(yàn)設(shè)計(jì)說(shuō)明

  程序設(shè)置了兩個(gè)結(jié)構(gòu)體,freeBlock和jobQueue,其中freeBlock代表物理塊,初次創(chuàng)建物理塊時(shí),物理塊的計(jì)時(shí)器time=0,還有代表作業(yè)的index=-1;物理塊有添加和刪除的功能,每一次添加或刪除都要初始化物理塊。并且可以重復(fù)添加和刪除,這樣可以很好的測(cè)試算法的性能。2.算法設(shè)計(jì)的思想是:進(jìn)入物理塊時(shí)間越長(zhǎng)的則物理塊的計(jì)時(shí)器數(shù)值越大,如果物理塊中有要訪(fǎng)問(wèn)的頁(yè)面,則那個(gè)含頁(yè)面的物理塊的計(jì)數(shù)器變成1;并且物理塊要滿(mǎn)才會(huì)發(fā)生置換,于是設(shè)置了物理塊計(jì)數(shù)器Time;

  2.實(shí)驗(yàn)代碼 #include<> #include<> typedef struct freeBlock { int index,time;struct freeBlock*next;}freeBlock;typedef struct jobQueue { int index;struct jobQueue*next;}jobQueue;jobQueue*creat(jobQueue*head,int num){

  jobQueue*job=(jobQueue*)malloc(sizeof(jobQueue));job->index=num;job->next=NULL;if(!head){

  jobQueue*j=head;while(j->next)j=j->next;j->next=job;head=job;else

} } return head;freeBlock*creat(freeBlock*head){

} freeBlock*inse(freeBlock*head){

} freeBlock*dele(freeBlock*head){ freeBlock*test=head;while(test){

} freeBlock*free=(freeBlock*)malloc(sizeof(freeBlock));free->index=-1;free->time=0;free->next=head;head=free;return head;test->index=-1;test->time=0;test=test->next;freeBlock*free=(freeBlock*)malloc(sizeof(freeBlock));free->index=-1;free->time=0;free->next=NULL;if(head)free->next=head;head=free;return head;

} freeBlock*test=head;while(test){

} freeBlock*f=head;head=f->next;free(f);return head;test->index=-1;test->time=0;test=test->next;bool check(freeBlock*free,int j){

} void LRU(freeBlock*free,jobQueue*job){

  int size=0,Time=0,time=0;jobQueue*jtest=job;freeBlock*ftest=free;while(ftest){ freeBlock*f=free;while(f){

} return false;if(f->index==j)return true;f=f->next;

} size++;ftest=ftest->next;printf(“LRU置換頁(yè)面為:”);while(jtest){

  ftest=free;while(ftest){

} ftest=free;while((time==size)&&ftest){ if(check(free,jtest->index)){ if(ftest->index==jtest->index){

} ftest->time++;if(Timetime)Time=ftest->time;time++;ftest=ftest->next;ftest->index=jtest->index;ftest->time++;time=0;break;ftest->time=0;if(ftest->index==-1)

}

}

}

} time=0;Time=0;break;if(ftest->time==Time){

} ftest=ftest->next;printf(“%d ”,ftest->index);ftest->index=jtest->index;ftest->time=1;time=0;Time=0;break;jtest=jtest->next;printf(“n”);void FIFU(freeBlock*free,jobQueue*job){

  int size=0,Time=0,time=0;jobQueue*jtest=job;freeBlock*ftest=free;while(ftest){

} size++;ftest=ftest->next;

  Printf(“FIFU置換頁(yè)面為:”);while(jtest){

  ftest=free;while(ftest){

} ftest=free;while((time==size)&&ftest){

  if(check(free,jtest->index)){

} if(ftest->time==Time)time=0;Time=0;break;if(ftest->index==-1){

} ftest->time++;if(Timetime)Time=ftest->time;time++;ftest=ftest->next;ftest->index=jtest->index;ftest->time++;time=0;break;

}

}

} {

} ftest=ftest->next;printf(“%d ”,ftest->index);ftest->index=jtest->index;ftest->time=1;time=0;Time=0;break;jtest=jtest->next;printf(“n”);void main(){

  int num,ch,p;freeBlock*block=NULL;jobQueue*job=NULL;printf(“請(qǐng)輸入物理塊數(shù)目:”);scanf(“%d”,&p);for(int i=0;i

} job=creat(job,ch);FIFU(block,job);LRU(block,job);while(true){

  Printf(“增加物理塊(1)減少物理塊(2),否則按任意鍵scanf(”%d“,&num);if(num==1){

} else if(num==2){

  Printf(”要減少幾塊:“);scanf(”%d“,&ch);if(ch>=p){

} for(i=0;i

}

}

} FIFU(block,job);LRU(block,job);else ;break;3.實(shí)驗(yàn)結(jié)果

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

  程序開(kāi)始要輸入物理塊數(shù)目和作業(yè)個(gè)數(shù),然后再輸入作業(yè).在測(cè)試后可以隨意添加或刪除物理塊來(lái)測(cè)試算法的性能。實(shí)驗(yàn):磁盤(pán)調(diào)度算法——SCAN和SSTF 1.實(shí)驗(yàn)設(shè)計(jì)說(shuō)明

  算法定義了一個(gè)雙向鏈表,利用雙向鏈表可以很好的進(jìn)行方向的轉(zhuǎn)換,且雙向鏈表的中有代表磁盤(pán)號(hào)的標(biāo)識(shí)符index;兩個(gè)算法均采用訪(fǎng)問(wèn)完一個(gè)磁盤(pán)序列時(shí)刪除該序列,其中scan算法實(shí)現(xiàn)時(shí)有點(diǎn)麻煩,首先要找到當(dāng)前磁盤(pán)號(hào)序列的Max最大值和最小值Min及指向他們的指針pmax,pmin,另外還要找到當(dāng)前磁頭的相鄰的兩個(gè)訪(fǎng)問(wèn)序列信息psmax,psmin;還有一個(gè)重要的標(biāo)志,那就是訪(fǎng)問(wèn)的方向test;當(dāng)遇到最大值或最小值時(shí),便會(huì)反置test的值,也就是訪(fǎng)問(wèn)的方向

  2.實(shí)驗(yàn)代碼 #include <> #include <> #include <> typedef struct memory { int index;struct memory*left,*right;}memory;memory*creat(){

  Printf(“請(qǐng)輸入磁道隊(duì)列以-1結(jié)束!n”);int ch;memory*head=NULL,*tail,*p;scanf(“%d”,&ch);while(ch!=-1){

  P=(memory*)malloc(sizeof(memory));p->index=ch;p->left=p->right=NULL;

}

} if(!head)head=p;else {

} tail=p;scanf(“%d”,&ch);tail->right=p;p->left=tail;return head;void SSTF(memory*head,int index){

  int index1=index,num;memory*p1=head,*p,*p2=NULL;while(true){

  num=abs(p1->index-index1);p=p1;while(p){

} if((abs(p->index-index1))<=num){

} p=p->right;num=abs(p->index-index1);if(p!=p1)p2=p;p=p1->right;if(p2){

} else { printf(“%d ”,p1->index);index1=p2->index;printf(“%d ”,p2->index);p2->left->right=p2->right;if(p2->right)p2->right->left=p2->left;free(p2);p2=NULL;

}

}

} index1=p1->index;if(!p){

} else {

} p=p1;p1=p1->right;free(p);continue;free(p1);break;void SCAN(memory*head,int index){

  int index1=index,num,test,max=0,min=199,Max,Min;printf(“請(qǐng)輸入磁頭查詢(xún)方向<0正向><1負(fù)向>!n”);scanf(“%d”,&test);memory*p1=head,*p,*p2=NULL,*pmax,*pmin,*psmax=NULL,*psmin=NULL;

  while(p1){

} p1=head;while(p1){ if(!test){ if(!test){

} else {

} p1=p1->right;pmin=p1;if(p1->index<=min)Min=min=p1->index;pmax=p1;if(p1->index>=max)Max=max=p1->index;

}

} pmin=p1;if(p1->index<=min)Min=min=p1->index;

  else {

} p1=p1->right;pmax=p1;if(p1->index>=max)Max=max=p1->index;p1=head;while(true){

  num=abs(p1->index-index1);p=p1;while(p){

  if(!test){ if(p->index>=index1&&p->index<=max)

}

}

  if((abs(p->index-index1))<=num){

}

  Psmin=p;

  num=abs(p->index-index1);if(p->left&&p->right)p2=p;else {

} p=p->right;if(p->index<=index1&&p->index>=min)

  if(abs(p->index-index1)<=num){

}

  Psmax=p;

  num=abs(p->index-index1);if(p->left&&p->right)p2=p;if(p2)

{

  if(!test){

} else {

  index1=psmax->index;p=psmax;if(index1==Min){

} test=0;Max=Min=-1;p1=pmin;index1=psmin->index;p=psmin;if(index1==Max){

} test=1;Min=Max=-1;p1=pmax;

} printf(“%d ”,index1);if(!test){

} else { if(psmax)if(psmin){

} else {

} psmax->right->left=psmax->left;if(psmax->left)

  Psmax->left->right=psmax->right;psmin->left->right=psmin->right;if(psmin->right)

  Psmin->right->left=psmin->left;free(psmin);free(psmax);

}

} {

} else {

} psmin->right->left=psmin->left;if(psmin->left)

  Psmin->left->right=psmin->right;psmax->left->right=psmax->right;if(psmax->right)

  Psmax->right->left=psmax->left;free(psmax);free(psmin);else {

  if(!test){

  if(p1->index==Max){ test=1;

} } Min=Max=-1;else {

} if(psmax){

} else {

} printf(“%d ”,index1);index1=psmin->index;p=psmin;index1=psmax->index;p=psmax;if(p1->index==Min){

} test=0;Max=Min=-1;

}

}

} if(p->left&&!p->right){

} else if(p->right&&!p->left){

} else if(!p->right&&!p->left){

} free(p);free(p);break;p1=p->right;p1->left=NULL;p1=p->left;p1->right=NULL;p2=psmax=psmin=NULL;void main(){

  int p,t;memory*head=creat();printf(“請(qǐng)輸入磁頭當(dāng)前的位置(0-199)”);scanf(“%d”,&p);printf(“要進(jìn)行的算法:<0:SCAN><1:SSTF>”);scanf(“%d”,&t);if(!t)SCAN(head,p);else SSTF(head,p);} 3.實(shí)驗(yàn)結(jié)果

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

  輸入要訪(fǎng)問(wèn)的磁盤(pán)號(hào),然后選擇要實(shí)現(xiàn)的算法就可以看到結(jié)果,當(dāng)選0(正向)的時(shí)候由于當(dāng)前的磁頭在143處,所以要訪(fǎng)問(wèn)的磁盤(pán)號(hào)就必須大于143,當(dāng)最大的磁盤(pán)號(hào)訪(fǎng)問(wèn)完時(shí),就轉(zhuǎn)向小于143的磁盤(pán)開(kāi)始由大向小訪(fǎng)問(wèn),選1的話(huà)則相反。最短尋道時(shí)間算法是從整個(gè)隊(duì)列中選擇距離磁頭最近的訪(fǎng)問(wèn),算法的實(shí)現(xiàn)運(yùn)用了絕對(duì)值的概念

操作系統(tǒng)課程設(shè)計(jì),磁盤(pán)調(diào)度算法范文3

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

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

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

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

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

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

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

  3.任務(wù)及要求

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

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

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

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

  3、掃描算法(SCAN)

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

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

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

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

  算法的總體思想

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

①先來(lái)先服務(wù)算法(FCFS)按queue[n]數(shù)組的順序進(jìn)行磁盤(pá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)值再加上磁盤(pá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)大于磁盤(pán)請(qǐng)求序列中的所有磁道 if(i==0)return-1;//當(dāng)前磁道號(hào)小于磁盤(pán)請(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<<“排序后的磁盤(pán)序列為:”;for(i=0;i

/* ====================以下是FCFS算法==================*/ void FCFS(int queue[],int n,int diskrode,int headstarts)//queue是請(qǐng)求調(diào)度序列,n為其個(gè)數(shù),diskroad為磁盤(pán)磁道數(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<<“磁盤(pán)掃描序列為: ”;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)度磁盤(pán)請(qǐng)求序列queue的長(zhǎng)度,diskrode表示磁盤(pán)磁道的個(gè)數(shù),headstarts表示目前正在調(diào)度的磁道; cout<<“請(qǐng)輸入磁盤(pán)的總磁道數(shù):”<> diskrode;cout<<“請(qǐng)輸入磁盤(pán)調(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ì),磁盤(pán)調(diào)度算法范文3篇(磁盤(pán)調(diào)度算法的模擬實(shí)現(xiàn)課程設(shè)計(jì))相關(guān)文章:

新課程學(xué)習(xí)體會(huì)12篇(新課程心得體會(huì))

淺談新課程改革背景下的高中物理教學(xué)[材料]3篇 新課程改革下的高中物理教學(xué)痛點(diǎn)

課程體系構(gòu)建調(diào)研論證報(bào)告3篇 課程建設(shè)調(diào)研報(bào)告

三年級(jí)作文課程標(biāo)準(zhǔn)3篇 小學(xué)三年級(jí)作文課程標(biāo)準(zhǔn)

印刷設(shè)計(jì)與工藝課程教學(xué)大綱3篇(印刷設(shè)計(jì)與工藝課程教學(xué)大綱論文)

地方課程教研計(jì)劃3篇 小學(xué)地方課程教研計(jì)劃

小學(xué)科學(xué)課程教學(xué)反思4篇 小學(xué)科學(xué)課教學(xué)反思簡(jiǎn)短

課程設(shè)計(jì)心得體會(huì)12篇 課程設(shè)計(jì)心得總結(jié)

蔬菜技術(shù)課程總結(jié)3篇 蔬菜種植技術(shù)總結(jié)

體育課教案模板2篇(體育課程教案模板)