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

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

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

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

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

      電梯優(yōu)先調(diào)度算法

      時間:2019-05-13 07:59:16下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關的《電梯優(yōu)先調(diào)度算法》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《電梯優(yōu)先調(diào)度算法》。

      第一篇:電梯優(yōu)先調(diào)度算法

      電梯優(yōu)先調(diào)度算法

      電梯調(diào)度算法(ms InterView)

      移臂調(diào)度算法包括以下四種:

      1)先來先服務算法:根據(jù)訪問者提出訪問請求的先后次序來決定執(zhí)行次序。

      2)最短尋找時間優(yōu)先調(diào)度算法:從等待的訪問者中挑選尋找時間最短的那個請求執(zhí)行,而不管訪問者的先后次序。

      3)電梯調(diào)度掃描算法:從移動臂當前位置沿移動方向選擇最近的那個柱面的訪問者來執(zhí)行,若該方向上無請求訪問時,就改變移動方向再選擇。

      4)單向掃描調(diào)度算法:從0柱面開始往里單向掃描,掃到哪個執(zhí)行哪個。

      */

      // t1.cpp : 定義控制臺應用程序的入口點。

      //

      #include “stdafx.h” #include“math.h” #include“stdlib.h” #include“string.h” struct Head {

      int nPosition;bool bVisited;};

      void Visit(struct Head *pHead){

      printf(“visite cy:%dn”,pHead->nPosition);pHead->bVisited=true;} int ReadInputKeyboard(struct Head *pHead,int *pCurrentPosition,int nMaxNumber){ int i;

      printf(“please input Current position:”);scanf(“%d”,pCurrentPosition);

      printf(“please input will visit position:”);for(i=0;i

      scanf(“%d”,&pHead[i].nPosition);pHead[i].bVisited=false;if(pHead[i].nPosition<0)break;} return i;} int ReadInputFile(struct

      Head

      *pHead,int

      *pCurrentPosition,int nMaxNumber){ int i;

      char szFileName[256],*q,*p,szTemp[20];printf(“please input filename:”);scanf(“%s”,szFileName);

      FILE *pFile=fopen(szFileName,“r”);if(pFile==NULL){

      printf(“open file %s error”,szFileName);return-1;}

      for(i=0;!feof(pFile)&&i

      p=szFileName;fgets(p,256,pFile);

      while(q=strchr(p,',')){

      memset(szTemp,0,sizeof(szTemp)*sizeof(char));strncpy(szTemp,p,q-p);p=q+1;if(i==0)

      *pCurrentPosition=atoi(szTemp);else { pHead[i-1].nPosition=atoi(szTemp);pHead[i-1].bVisited=false;} i++;}

      memset(szTemp,0,sizeof(szTemp)*sizeof(char));pHead[i-1].nPosition=atoi(p);pHead[i-1].bVisited=false;//i++;

      }

      fclose(pFile);return i;}

      int FifoVisit(int nCurrentPosition,struct Head *pHead,int nNumber){

      //先來先服務

      int nHaveVisited=0;int nMoveDistance=0;int i;while(nHaveVisited

      for(i=0;i

      if(pHead[i].bVisited)continue;

      Visit(&pHead[i]);nHaveVisited++;

      nMoveDistance+=abs(nCurrentPosition-pHead[i].nPosition);nCurrentPosition=pHead[i].nPosition;} }

      printf(“the sum of move distance:%dn”,nMoveDistance);return nMoveDistance;}

      int SsfoVisit(int nCurrentPosition,struct Head *pHead,int nNumber){ // 最短尋找時間優(yōu)先

      int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;

      while(nHaveVisited

      nMinDistance=0xffff;nMinIndex=0;//找最小值

      for(i=0;i

      if(pHead[i].bVisited)continue;

      if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)){

      nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);nMinIndex=i;} } //訪問

      Visit(&pHead[nMinIndex]);nHaveVisited++;

      nMoveDistance+=nMinDistance;

      nCurrentPosition=pHead[nMinIndex].nPosition;}

      printf(“the sum of move distance:%dn”,nMoveDistance);return nMoveDistance;}

      int DtVisit(int nCurrentPosition,bool bOut,struct Head *pHead,int nNumber){

      //電梯調(diào)度算法

      int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;

      while(nHaveVisited

      nMinDistance=0xffff;nMinIndex=0;//找最小值

      for(i=0;i

      if(pHead[i].bVisited)continue;

      if(bOut&&pHead[i].nPositionnCurrentPosition){

      if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)){

      nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);nMinIndex=i;} } }

      if(nMinDistance==0xffff){

      bOut=!bOut;continue;}

      //訪問

      Visit(&pHead[nMinIndex]);nHaveVisited++;

      nMoveDistance+=nMinDistance;

      nCurrentPosition=pHead[nMinIndex].nPosition;}

      printf(“the sum of move distance:%dn”,nMoveDistance);return nMoveDistance;}

      int DxVisit(int nCurrentPosition,struct Head *pHead,int nNumber){

      //單向調(diào)度算法

      int nHaveVisited=0;int nMoveDistance=0;int nMinDistance=0;int nMinIndex=0;int i;while(nHaveVisited

      nMinDistance=0xffff;nMinIndex=0;//找最小值

      for(i=0;i

      if(pHead[i].bVisited)continue;

      if(pHead[i].nPosition>nCurrentPosition){

      if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)){

      nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);nMinIndex=i;} } }

      if(nMinDistance==0xffff){

      nMoveDistance+=199-nCurrentPosition;nCurrentPosition=0;continue;}

      //訪問

      Visit(&pHead[nMinIndex]);nHaveVisited++;

      nMoveDistance+=nMinDistance;

      nCurrentPosition=pHead[nMinIndex].nPosition;}

      printf(“the sum of move distance:%dn”,nMoveDistance);return nMoveDistance;}

      int main(int argc, char* argv[]){ //p114 struct Head mylist[20];//={98,false,183,false,37,false,122,false,14,false,124,false,65,false,67,false};

      //int nCurrentPosition=53;

      //int nRealNumber=8;

      int nCurrentPosition=0;

      int nRealNumber=ReadInputFile(mylist,&nCurrentPosition,20);// FifoVisit(nCurrentPosition,mylist,nRealNumber);

      // SsfoVisit(nCurrentPosition,mylist,nRealNumber);

      //DtVisit(nCurrentPosition,false,mylist,nRealNumber);

      DxVisit(nCurrentPosition,mylist,nRealNumber);

      return 0;}

      第二篇:短作業(yè)優(yōu)先調(diào)度算法

      《操作系統(tǒng)》課程實驗報告

      姓名:陳凱

      學號:541413430202

      地點:四教樓301

      指導老師:張旭

      專業(yè)班級:嵌入式軟件14-02

      實驗名稱:短作業(yè)優(yōu)先調(diào)度算法

      一、實驗目的:

      測試數(shù)據(jù)可以隨即輸入或從文件中讀入。必須要考慮到作業(yè)的到達時間

      最終能夠計算每一個作業(yè)的周轉(zhuǎn)時間。

      二、實驗內(nèi)容:

      模擬實現(xiàn)短作業(yè)調(diào)度算法,具體如下:

      設置作業(yè)體:作業(yè)名,作業(yè)的到達時間,服務時間,作業(yè)間的鏈接指針 進程初始化:由用戶輸入作業(yè)名、作業(yè)的到達時間和服務時間進行初始化。顯示函數(shù):

      1、顯示當前調(diào)度的是哪個作業(yè),后備隊列中有哪些作業(yè)

      2、最終顯示每個作業(yè)的作業(yè)名、到達時間、服務時間、完成時間和周轉(zhuǎn)時間

      排序函數(shù):對就已到達的作業(yè)按照服務時間進行排序。注意考慮到達時間 調(diào)度函數(shù):每次從已到達的作業(yè)隊列隊首調(diào)度優(yōu)一個作業(yè)執(zhí)行。刪除函數(shù):作業(yè)結束后撤銷。

      三、實驗代碼

      #include structsjf //定義進程的結構體 {

      char name[10];//進程名

      floatarrivetime;//到達時間

      floatservicetime;//服務時間

      floatstarttime;

      //開始時間

      floatfinishtime;//完成時間 floatzztime;//周轉(zhuǎn)時間 floatdqzztime;

      //帶權周轉(zhuǎn)時間 };

      sjf b[100];

      //定義短作業(yè)優(yōu)先算法進程的最大數(shù)量 voidSinput(sjf *p,int N)

      //輸入函數(shù) { int i;

      printf(“輸入進程的名稱、到達時間、服務時間:n”);for(i=0;i<=N-1;i++){

      printf(“輸入第%d進程的名稱、到達時間、服務時間:”,i+1);scanf(“%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} }

      //輸出函數(shù) voidSPrint(sjf *p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,int N){ int k;

      printf(“n執(zhí)行順序:n”);printf(“%s”,p[0].name);

      for(k=1;k

      {

      printf(“-%s”,p[k].name);}

      printf(“n進程名tarrivetservicetstarttfinishtzztdqzzn”);

      for(k=0;k<=N-1;k++)

      {

      printf(“%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft%-.2ftnn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);

      } }

      voidSsort(sjf *p,int N)

      //按短作業(yè)優(yōu)先算法排序 {

      for(int i=1;i<=N-1;i++)for(int j=1;j<=i;j++)

      if(p[i].servicetime

      sjf temp;temp=p[i];

      p[i]=p[j];

      p[j]=temp;} }

      //運行結果 voidSdeal(sjf *p, float arrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,int N){

      int k;

      for(k=0;k<=N-1;k++)

      {

      if(k==0){

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+p[k].servicetime;

      } else {

      p[k].starttime=p[k-1].finishtime;//開始時間=前一個進程的完成時間

      p[k].finishtime=p[k-1].finishtime+p[k].servicetime;

      //結束時間=前一個進程的完成時間+現(xiàn)在進程的服務時間 }

      }

      for(k=0;k<=N-1;k++){

      p[k].zztime=p[k].finishtime-p[k].arrivetime;

      //周轉(zhuǎn)時間=完成時間-到達時間

      p[k].dqzztime=p[k].zztime/p[k].servicetime;

      //帶權周轉(zhuǎn)時間=周轉(zhuǎn)時間/服務時間 } }

      void SJF(sjf *p,int N){

      float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;

      Ssort(p,N);

      Sdeal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      SPrint(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);}

      void main()//主函數(shù) { int M;printf(“------------短作業(yè)優(yōu)先調(diào)度算法-----------n”);printf(“輸入作業(yè)數(shù):”);scanf(“%d”,&M);

      Sinput(b,M);SJF(b,M);}

      四、實驗結果

      五、實驗總結

      通過本次實驗讓我學到了很多關于作業(yè)與作業(yè)調(diào)度的知識,今后我會好好努力學習。

      第三篇:電梯調(diào)度算法總結

      1.傳統(tǒng)電梯調(diào)度算法

      1.1先來先服務算法(FCFS)

      先來先服務(FCFS-First Come First Serve)算法,是一種隨即服務算法,它不僅僅沒有對尋找樓層進行優(yōu)化,也沒有實時性的特征,它是一種最簡單的電梯調(diào)度算法。它根據(jù)乘客請求乘坐電梯的先后次序進行調(diào)度。此算法的優(yōu)點是公平、簡單,且每個乘客的請求都能依次地得到處理,不會出現(xiàn)某一乘客的請求長期得不到滿足的情況[12]。這種方法在載荷較輕松的環(huán)境下,性能尚可接受,但是在載荷較大的情況下,這種算法的性能就會嚴重下降,甚至惡化。人們之所以研究這種在載荷較大的情況下幾乎不可用的算法,有兩個原因:

      (1)任何調(diào)度算法在請求隊列長度為1時,請求速率極低或相鄰請求的間隔為無窮大時使用先來先服務算法既對調(diào)度效率不會產(chǎn)生影響,而且實現(xiàn)這種算法極其簡單。

      (2)先來先服務算法可以作為衡量其他算法的標準。

      1.2最短尋找樓層時間優(yōu)先算法(SSTF)

      最短尋找樓層時間優(yōu)先(SSTF-Shortest Seek Time First)[14]算法,它注重電梯尋找樓層的優(yōu)化。最短尋找樓層時間優(yōu)先算法選擇下一個服務對象的原則是最短尋找樓層的時間。這樣請求隊列中距當前能夠最先到達的樓層的請求信號就是下一個服務對象。在重載荷的情況下,最短尋找樓層時間優(yōu)先算法的平均響應時間較短,但響應時間的方差較大,原因是隊列中的某些請求可能長時間得不到響應,出現(xiàn)所謂的“餓死”現(xiàn)象。

      1.3掃描算法(SCAN)

      掃描算法(SCAN)是一種按照樓層順序依次服務請求,它讓電梯在最底層和最頂層之間連續(xù)往返運行,在運行過程中響應處在于電梯運行方向相同的各樓層上的請求。它進行尋找樓層的優(yōu)化,效率比較高,但它是一個非實時算法。掃描算法較好地解決了電梯移動的問題,在這個算法中,每個電梯響應乘客請求使乘客獲得服務的次序是由其發(fā)出請求的乘客的位置與當前電梯位置之間的距離來決定的,所有的與電梯運行方向相同的乘客的請求在一次電向上運行或向下運行的過程中完成,免去了電梯頻繁的來回移動[2]。掃描算法的平均響應時間比最短尋找樓層時間優(yōu)先算法長,但是響應時間方差比最短尋找樓層時間優(yōu)先算法小,從統(tǒng)計學角度來講,掃描算法要比最短尋找樓層時間優(yōu)先算法穩(wěn)定。

      1.4 LOOK 算法

      LOOK算法[18]是掃描算法的一種改進。對LOOK算法而言,電梯同樣在最底層和最頂層之間運行。但當LOOK算法發(fā)現(xiàn)電梯所移動的方向上不再有請求時立即改變運行方向,而掃描算法則需要移動到最底層或者最頂層時才改變運行方向。

      1.5 SAFT 算法

      SATF(Shortest Access Time First)[15,19]算法與SSTF算法的思想類似,唯一的區(qū)別就是SATF算法將SSTF算法中的尋找樓層時間改成了訪問時間。這是因為電梯技術發(fā)展到今天,尋找樓層的時間已經(jīng)有了很大地改進,但是電梯的運行當中等待乘客上梯時間卻不是人為可以控制。SATF算法考慮到了電梯運行過程中乘客上梯時間的影響。實時電梯調(diào)度算法

      2.1最早截止期優(yōu)先調(diào)度算法

      最早截止期優(yōu)先(EDF-Earliest Deadline First)[16]調(diào)度算法是最簡單的實時電梯調(diào)度算法,它的缺點就是造成電梯任意地尋找樓層,導致極低的電梯吞吐率。它與FCFS調(diào)度算法類似,EDF算法是電梯實時調(diào)度算法中最簡單的調(diào)度算法。它響應請求隊列中時限最早的請求,是其它實時電梯調(diào)度算法性能衡量的基準和特例。

      2.2 SCAN-EDF 算法

      SCAN-EDF[16]算法是SCAN算法和EDF算法相結合的產(chǎn)物。SCAN-EDF算法先按照EDF算法選擇請求列隊中哪一個是下一個服務對象,而對于具有相同時限的請求,則按照SCAN算法服務每一個請求。它的效率取決于有相同deadline 的數(shù)目,因而效率是有限的。

      2.3 PI 算法

      PI(Priority Inversion)[16]算法將請求隊列中的請求分成兩個優(yōu)先級,它首先保證高優(yōu)先級隊列中的請求得到及時響應,再搞優(yōu)先級隊列為空的情況下在相應地優(yōu)先級隊列中的請求。

      2.4 FD-SCAN 算法

      FD-SCAN(Feasible Deadline SCAN)[17]算法首先從請求隊列中找出時限最早、從當前位置開始移動又可以買足其時限要求的請求,作為下一次SCAN的方向。并在電梯所在樓層向該請求信號運行的過程中響應處在與電梯運行方向相同且電梯可以經(jīng)過的請求信號。這種算法忽略了用SCAN算法相應其它請求的開銷,因此并不能確保服務對象時限最終得到滿足。電梯調(diào)度的高水平研究

      以上兩個小結介紹了幾種在目前本人的能力上能進行研究的、簡單的電梯調(diào)度算法。但是并不是說目前電梯調(diào)度只發(fā)展到這個層次。目前電梯的控制技術已經(jīng)進入了電梯群控的時代。

      隨著微機在電梯系統(tǒng)中的應用和人工智能技術的發(fā)展,智能群控技術得以迅速發(fā)展起來。由此,電梯的群控方面陸續(xù)發(fā)展出了一批新方法,包括:基于專家系統(tǒng)的電梯群控方法、基于模糊邏輯的電梯群控方法、基于遺產(chǎn)算法的電梯群控方法、基于勝景網(wǎng)絡的電梯群控方法和基于模糊神經(jīng)網(wǎng)絡的電梯群控方法。4 電梯問題的需求分析

      4.1 電梯的初始狀態(tài)

      本人設置的電梯的初始狀態(tài),是對住宅樓的電梯的設置。

      (1)建筑共有21層,其中含有地下一層(地下一層為停車場及貨物運送場所)。

      (2)建筑內(nèi)部設有兩部電梯,編號分別為A梯、B梯。

      (3)電梯內(nèi)部有23個按鈕,其中包括開門按鈕、關門按鈕和樓層按鈕,編號為-1,1,2,3,4……20。

      (4)電梯外部含有兩個按鈕,即向上運行按鈕和向下運行按鈕。建筑頂層與地下一層例外,建筑頂層只設置有向下運行按鈕,地下一層只設置有向上運行按鈕。

      (5)電梯開關門完成時間設定為1秒。電梯到達每層后上下人的時間設定為8秒。電梯從靜止開始運行到下一層的時間設置為2秒,而運行中通過一層的時間為1秒。

      (6)在凌晨2:00——4:30之間,如若沒有請求信號,A梯自動停在14層,B梯自動停在6層。

      (7)當電梯下到-1層后,如果沒有請求信號,電梯自動回到1層

      4.2 電梯按鈕功能

      電梯內(nèi)部的樓層按鈕:電梯內(nèi)部對應每一個樓層的按鈕成為樓層按鈕,即本章第一結提到的編號為-1,1,2,3,4……20的按鈕。當乘客進入電梯后按下樓層按鈕,此按鈕顯示灰色,代表不可以用。這樣就表示乘客將要去往此層,電梯將開往相應層。當電梯到達該層后,按鈕恢復可以使用狀態(tài)。

      電梯內(nèi)部開門按鈕:當電梯達到乘客想要去往的某樓層后,乘客需要準備離開電梯,當電梯停穩(wěn)后,乘客可以按下開門按鈕,電梯門將打開,讓用戶離開。如若電梯到了乘客曾經(jīng)按下的樓層,但是無乘客按開門按鈕,電梯將自動在停穩(wěn)后1秒后自動開門。

      電梯內(nèi)部關門按鈕:當所有想要乘坐電梯的乘客都進入電梯以后,準備讓電梯開始運行的時候,乘客需要按下關門按鈕,讓電梯門關閉,使電梯進入運行狀態(tài)。設置電梯的自動關門時間為8秒。

      電梯外部向上按鈕:此按鈕表示上樓請求,當按下此按鈕時,如果電梯到達按下此按鈕的樓層,且電梯運行方向是向上的,那么電梯響將停下,并在電梯停穩(wěn)之后自動開門,此請求被響應后,取消此請求信號。電梯外部向下按鈕:此按鈕表示下樓請求,當按下此按鈕時,如果電梯到達按下此按鈕的樓層,且電梯運行方向是向下的,那么電梯響將停下,并在電梯停穩(wěn)之后自動開門,此請求被響應后,取消此請求信號。

      第四篇:短作業(yè)優(yōu)先調(diào)度和時間片輪轉(zhuǎn)調(diào)度算法

      學生姓名:

      學 號:

      指導教師:

      一、實驗室名稱:

      二、實驗項目名稱:進程調(diào)度算法的設計

      三、實驗原理:

      短作業(yè)(進程)優(yōu)先調(diào)度算法:短作業(yè)調(diào)度算法是從后備隊列中選擇一個或者若干個估計運行時間最短的作業(yè),將他們調(diào)入內(nèi)存運行。而短進程優(yōu)先調(diào)度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執(zhí)行并一直執(zhí)行到完成,或者發(fā)生某事件而被阻塞放棄處理機時再重新調(diào)度。

      時間片輪轉(zhuǎn)法:系統(tǒng)將所有的就緒進程按先來先服務的原則排成一個隊列,每次調(diào)度時,把CPU分配給隊首進程,并令其執(zhí)行一個時間片。當執(zhí)行的時間片用完時,由一個計時器發(fā)出時鐘中斷請求,調(diào)度程序便據(jù)此信號來停止該進程的執(zhí)行,并將它送往就緒隊列的隊尾;然后,再把處理機分配給就緒隊列中的新的隊首進程,同時也讓它執(zhí)行一個時間片。這樣就可以保證就緒隊列中的所有進程在一個給定的時間內(nèi)均能獲得一時間片的處理機執(zhí)行時間。

      四、實驗目的:

      通過對進程調(diào)度算法的設計,深入理解進程調(diào)度的原理

      五、實驗內(nèi)容:

      1.編寫程序?qū)崿F(xiàn)SJ(P)F算法 2.編寫程序?qū)崿F(xiàn)RR算法

      六、實驗器材(設備、元器件):

      裝有VC++6.0的PC機一臺

      七、實驗步驟:

      1.打開VC,設計編寫程序的源代碼 2.編譯運行程序的源代碼

      3.分析檢驗程序的結果是否正確 4.總結實驗結果及結論

      短進程優(yōu)先調(diào)度源代碼: #include “stdio.h” struct sjf{ char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;};sjf a[100];void input(sjf *p,int N){ int i;printf(“intput the process's name & arrivetime & servicetime:nfor exmple: a 0 100n”);for(i=0;i<=N-1;i++){ printf(“input the %dth process's information:n”,i+1);scanf(“%s%f%f”,&p[i].name,&p[i].arrivetime,&p[i].servicetime);} } void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N){int k;

      printf(“run order:”);

      printf(“%s”,p[0].name);for(k=1;k%s”,p[k].name);}

      printf(“nthe process's information:n”);

      printf(“nnametarrivetservicetstarttfinishtzztdqzzn”);

      for(k=0;k<=N-1;k++){ printf(“%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft%-.2ftn”,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);} } //排序

      void sort(sjf *p,int N){

      for(int i=0;i<=N-1;i++)

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

      if(p[i].arrivetime

      {

      sjf temp;

      temp=p[i];

      p[i]=p[j];

      p[j]=temp;

      } } //運行階段

      void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N){ int k;

      for(k=0;k<=N-1;k++)

      {

      if(k==0)

      {

      p[k].starttime=p[k].arrivetime;

      p[k].finishtime=p[k].arrivetime+p[k].servicetime;}

      else

      {

      p[k].starttime=p[k-1].finishtime;

      p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}

      }

      for(k=0;k<=N-1;k++)

      {

      p[k].zztime=p[k].finishtime-p[k].arrivetime;

      p[k].dqzztime=p[k].zztime/p[k].servicetime;

      } } void sjff(sjf *p,int N){float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;//對結構進行初始化 sort(p,N);

      for(int m=0;m

      {if(m==0)

      p[m].finishtime=p[m].arrivetime+p[m].servicetime;

      else

      p[m].finishtime=p[m-1].finishtime+p[m].servicetime;

      int i=0;

      for(int n=m+1;n<=N-1;n++)

      {if(p[n].arrivetime<=p[m].finishtime)//判斷內(nèi)存中每次完成之后有多少到達的進程

      i++;

      }

      float min=p[m+1].servicetime;

      int next=m+1;//m+1=n

      for(int k=m+1;k

      {

      if(p[k+1].servicetime

      {min=p[k+1].servicetime;

      next=k+1;}

      }

      sjf temp;

      temp=p[m+1];

      p[m+1]=p[next];

      p[next]=temp;

      }

      deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);

      Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);} void main(){ int N;

      printf(“------短作業(yè)優(yōu)先調(diào)度算法------n”);

      printf(“input the process's number:n”);

      scanf(“%d”,&N);

      input(a,N);

      sjf *b=a;

      sjf *c=a;

      sjff(b,N);}

      時間片輪轉(zhuǎn)法源代碼: #include #define M 5

      //物理頁數(shù) #define printf(“|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|n”)typedef struct PCB { int ID;int ReachTime;int TotalTime;}PCB;//進程號,到達時間和服務時間 typedef struct NOTE //備份 {

      Myprintf int ID;int TotalTime;}NOTE;

      PCB A[M];//5個進程 PCB a[M];NOTE temp;int queue[50];//記錄調(diào)度的進程 int K=0;//調(diào)度進程數(shù)組的標識 void INIT()//初始化 { int i;for(i=0;i

      A[i].ID=-1;} } int GetNum()//計算進程數(shù) { int i,j=0;for(i=0;i

      if(A[i].ID!=-1)

      {

      j++;

      } } return j;} int GetReach(int time)//找出到達進程號 { int i;for(i=0;i

      if(a[i].ReachTime<=time)

      {

      a[i].ReachTime=100;

      return i;

      } } return-1;} int GetInsert()//找出插入位置 { int i;for(i=0;i

      if(A[i].ID==-1)

      return i;} return-1;} void Forward(int num)//前移 { int i;for(i=0;i

      A[i].ID=A[i+1].ID;

      A[i].TotalTime=A[i+1].TotalTime;} A[num-1].ID=-1;} void Process()//執(zhí)行進程 { queue[K]=A[0].ID;K++;A[0].TotalTime--;temp.ID=A[0].ID;temp.TotalTime=A[0].TotalTime;} void main(){ int i;int time;int t=0;int reach;int insert;int num;printf(“RR算法nn”);INIT();for(i=0;i

      printf(“請輸入進程ID:”);

      scanf(“%d”,&a[i].ID);

      printf(“請輸入到達時間:”);

      scanf(“%d”,&a[i].ReachTime);

      printf(“請輸入服務時間:”);

      scanf(“%d”,&a[i].TotalTime);

      } for(i=0;i

      {

      insert=GetInsert();

      A[insert].ID=a[reach].ID;

      A[insert].TotalTime=a[reach].TotalTime;

      num=GetNum();

      if(num==1)

      continue;//進程數(shù)為1

      else

      {

      //進程數(shù)不為1

      Process();

      Forward(num);

      if(temp.TotalTime!=0)

      {

      A[num-1].ID=temp.ID;

      A[num-1].TotalTime=temp.TotalTime;

      }

      } } else//沒有進程到達

      {

      num=GetNum();

      if(num==1)

      {//進程數(shù)為1

      Process();

      if(temp.TotalTime==0)

      {

      A[0].ID=-1;

      }

      }

      else if(num==0)

      }

      continue;//進程數(shù)為0

      else

      {

      Process();

      Forward(num);

      if(temp.TotalTime!=0)

      {

      A[num-1].ID=temp.ID;

      A[num-1].TotalTime=temp.TotalTime;

      }

      } } } printf(“n”);printf(“調(diào)度順序為:n”);Myprintf;for(i=0;i<50;i++){ if(queue[i]!=-1)

      printf(“|%2d ”,queue[i]);} printf(“|n”);Myprintf;printf(“n”);

      八、實驗數(shù)據(jù)及結果分析:

      短作業(yè)優(yōu)先調(diào)度算法的實驗結果:

      時間片輪轉(zhuǎn)調(diào)度算法結果:

      九、實驗結論:

      本次實驗成功的完成了短作業(yè)優(yōu)先調(diào)度算法和輪轉(zhuǎn)時間片調(diào)度算法的模擬,通過本次實驗我們了解到短作業(yè)優(yōu)先調(diào)度算法不利于長作業(yè)的處理,因為長作業(yè)將長期得不到處理,而輪轉(zhuǎn)時間片調(diào)度算法則解決了這一問題。短長作業(yè)均能在每一個周期內(nèi)分得一個時間片處理自己的任務。

      十、總結及心得體會:

      通過本次實驗對短作業(yè)優(yōu)先調(diào)度算法和時間片輪轉(zhuǎn)調(diào)度算法有了更深入的理解,同時,對程序算法能力有了進一步的提高,同時對模塊化編程有了更深入得理解,代碼的模塊化會使程序的代碼復用率提高,提高編程的效率。

      十一、對本實驗過程及方法、手段的改進建議:

      本次實驗的時間片輪轉(zhuǎn)調(diào)度算法由于教材版本不一樣有兩種結果,本次實驗本人采取的新教材的版本,新版本的難度較老教材要大很多,實驗時候可以根據(jù)具體情況選擇一個適合自己的來做。

      報告評分:

      指導教師簽字:

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

      1.實驗題目:

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

      建立相應的數(shù)據(jù)結構;

      在屏幕上顯示磁盤請求的服務狀況;

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

      2.設計目的:

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

      3.任務及要求

      3.1 設計任務

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

      1、先來先服務算法(FCFS)

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

      3、掃描算法(SCAN)

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

      3.2 設計要求

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

      4.算法及數(shù)據(jù)結構

      4.1算法的總體思想

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

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

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

      ③掃描算法(SCAN)

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

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

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

      5、源代碼:

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

      1、先來先服務算法(FCFS)**********”<

      cout<<“******

      2、最短尋道時間優(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

      //對當前正在執(zhí)行的磁道號進行定位,返回磁道號小于當前磁道中最大的一個 int fix(int queue[], int n, int headstarts){ int i =0;while(iqueue[i]){ i++;} if(i>n-1)return n-1;//當前磁道號大于磁盤請求序列中的所有磁道 if(i==0)return-1;//當前磁道號小于磁盤請求序列中的所有磁道 else return i-1;//返回小于當前磁道號中最大的一個 } /*=================使用冒泡算法從小到大排序==============*/ 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是請求調(diào)度序列,n為其個數(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)//若當前磁道號小于請求序列中最小者,則直接由內(nèi)向外依次給予各請求服務 { 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表示磁道移動的長度 *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)度磁盤請求序列queue的長度,diskrode表示磁盤磁道的個數(shù),headstarts表示目前正在調(diào)度的磁道; cout<<“請輸入磁盤的總磁道數(shù):”<> diskrode;cout<<“請輸入磁盤調(diào)度請求序列個數(shù):”<>n;int *queue;queue =(int*)malloc(n*sizeof(int));//給quneue數(shù)組分配空間...int *queue_copy;queue_copy =(int*)malloc(n*sizeof(int));cout<<“請依次輸入該序列的值:”<>queue[i];for(i=0;i>headstarts;int menux;menu();cout<<“請按菜單選擇,輸入相應的數(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<<“程序結束,謝謝使用!”<>menux;cout<

      下載電梯優(yōu)先調(diào)度算法word格式文檔
      下載電梯優(yōu)先調(diào)度算法.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


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

      相關范文推薦

        操作系統(tǒng)課程設計,磁盤調(diào)度算法范文

        沈陽理工大學課程設計專用紙 Noi 目 錄 1 課程設計目的及要求……………………………………………………錯誤!未定義書簽。 2 相關知識…………………………………......

        實驗報告六 磁盤調(diào)度算法

        實驗報告六磁盤調(diào)度算法 班級:軟技2班學號:201467003084 姓名:劉道林 一.實驗內(nèi)容:熟悉磁盤的結構以及磁盤的驅(qū)動調(diào)度算法的模擬,編程實現(xiàn)簡單常用的磁盤驅(qū)動調(diào)度算法先來先服......

        多級反饋隊列調(diào)度算法

        多級反饋隊列調(diào)度算法 一實驗內(nèi)容 以鏈式結構組成空閑PCB棧,以雙向鏈式結構組成進程的就緒隊列和睡眠隊列,模擬UNIX的進程管理程序,實現(xiàn)以下操作(可用鍵盤命令、命令文件或由產(chǎn)......

        操作系統(tǒng)進程調(diào)度算法模擬實驗報告

        進程調(diào)度算法模擬 專業(yè):XXXXX 學號:XXXXX 姓名:XXX 實驗日期:20XX年XX月XX日 一、實驗目的 通過對進程調(diào)度算法的模擬加深對進程概念和進程調(diào)度算法的理解。 二、實驗要求 編寫......

        單核與多核的CPU調(diào)度算法

        1. 多核CPU調(diào)度算法 1.1全局隊列調(diào)度算法 操作系統(tǒng)維護一個全局的任務等待隊列,每個進程在執(zhí)行階段可以使用全部的處理器資源。當系統(tǒng)中有一個CPU核心空閑時,操作系統(tǒng)就從全局......

        常用進程調(diào)度算法的分析與評價

        常用進程調(diào)度算法的分析與評價(一) 2009-10-31 22:48 進程調(diào)度是按照某種調(diào)度算法從就緒狀態(tài)的進程中選擇一個進程到處理機上運行。 進程調(diào)度的兩種方式 : (1)非搶占調(diào)度方式......

        基于NSGA算法的公交車輛調(diào)度優(yōu)化模型

        基于NSGA算法的公交車輛調(diào)度優(yōu)化模型 宋曉鵬,韓印,姚佼 (上海理工大學 管理學院,上海200093) 摘要:公交車輛調(diào)度方案的優(yōu)化對于提高公交服務水平,促進公交事業(yè)的快速發(fā)展至關重要。......

        模擬磁盤調(diào)度算法系統(tǒng)的設計畢業(yè)設計

        目錄一、設計任務及主要技術 .................................................................... 3 二、設計方案及論證結果 ............................................