第一篇:電梯調(diào)度算法總結(jié)
1.傳統(tǒng)電梯調(diào)度算法
1.1先來(lái)先服務(wù)算法(FCFS)
先來(lái)先服務(wù)(FCFS-First Come First Serve)算法,是一種隨即服務(wù)算法,它不僅僅沒(méi)有對(duì)尋找樓層進(jìn)行優(yōu)化,也沒(méi)有實(shí)時(shí)性的特征,它是一種最簡(jiǎn)單的電梯調(diào)度算法。它根據(jù)乘客請(qǐng)求乘坐電梯的先后次序進(jìn)行調(diào)度。此算法的優(yōu)點(diǎn)是公平、簡(jiǎn)單,且每個(gè)乘客的請(qǐng)求都能依次地得到處理,不會(huì)出現(xiàn)某一乘客的請(qǐng)求長(zhǎng)期得不到滿足的情況[12]。這種方法在載荷較輕松的環(huán)境下,性能尚可接受,但是在載荷較大的情況下,這種算法的性能就會(huì)嚴(yán)重下降,甚至惡化。人們之所以研究這種在載荷較大的情況下幾乎不可用的算法,有兩個(gè)原因:
(1)任何調(diào)度算法在請(qǐng)求隊(duì)列長(zhǎng)度為1時(shí),請(qǐng)求速率極低或相鄰請(qǐng)求的間隔為無(wú)窮大時(shí)使用先來(lái)先服務(wù)算法既對(duì)調(diào)度效率不會(huì)產(chǎn)生影響,而且實(shí)現(xiàn)這種算法極其簡(jiǎn)單。
(2)先來(lái)先服務(wù)算法可以作為衡量其他算法的標(biāo)準(zhǔn)。
1.2最短尋找樓層時(shí)間優(yōu)先算法(SSTF)
最短尋找樓層時(shí)間優(yōu)先(SSTF-Shortest Seek Time First)[14]算法,它注重電梯尋找樓層的優(yōu)化。最短尋找樓層時(shí)間優(yōu)先算法選擇下一個(gè)服務(wù)對(duì)象的原則是最短尋找樓層的時(shí)間。這樣請(qǐng)求隊(duì)列中距當(dāng)前能夠最先到達(dá)的樓層的請(qǐng)求信號(hào)就是下一個(gè)服務(wù)對(duì)象。在重載荷的情況下,最短尋找樓層時(shí)間優(yōu)先算法的平均響應(yīng)時(shí)間較短,但響應(yīng)時(shí)間的方差較大,原因是隊(duì)列中的某些請(qǐng)求可能長(zhǎng)時(shí)間得不到響應(yīng),出現(xiàn)所謂的“餓死”現(xiàn)象。
1.3掃描算法(SCAN)
掃描算法(SCAN)是一種按照樓層順序依次服務(wù)請(qǐng)求,它讓電梯在最底層和最頂層之間連續(xù)往返運(yùn)行,在運(yùn)行過(guò)程中響應(yīng)處在于電梯運(yùn)行方向相同的各樓層上的請(qǐng)求。它進(jìn)行尋找樓層的優(yōu)化,效率比較高,但它是一個(gè)非實(shí)時(shí)算法。掃描算法較好地解決了電梯移動(dòng)的問(wèn)題,在這個(gè)算法中,每個(gè)電梯響應(yīng)乘客請(qǐng)求使乘客獲得服務(wù)的次序是由其發(fā)出請(qǐng)求的乘客的位置與當(dāng)前電梯位置之間的距離來(lái)決定的,所有的與電梯運(yùn)行方向相同的乘客的請(qǐng)求在一次電向上運(yùn)行或向下運(yùn)行的過(guò)程中完成,免去了電梯頻繁的來(lái)回移動(dòng)[2]。掃描算法的平均響應(yīng)時(shí)間比最短尋找樓層時(shí)間優(yōu)先算法長(zhǎng),但是響應(yīng)時(shí)間方差比最短尋找樓層時(shí)間優(yōu)先算法小,從統(tǒng)計(jì)學(xué)角度來(lái)講,掃描算法要比最短尋找樓層時(shí)間優(yōu)先算法穩(wěn)定。
1.4 LOOK 算法
LOOK算法[18]是掃描算法的一種改進(jìn)。對(duì)LOOK算法而言,電梯同樣在最底層和最頂層之間運(yùn)行。但當(dāng)LOOK算法發(fā)現(xiàn)電梯所移動(dòng)的方向上不再有請(qǐng)求時(shí)立即改變運(yùn)行方向,而掃描算法則需要移動(dòng)到最底層或者最頂層時(shí)才改變運(yùn)行方向。
1.5 SAFT 算法
SATF(Shortest Access Time First)[15,19]算法與SSTF算法的思想類似,唯一的區(qū)別就是SATF算法將SSTF算法中的尋找樓層時(shí)間改成了訪問(wèn)時(shí)間。這是因?yàn)殡娞菁夹g(shù)發(fā)展到今天,尋找樓層的時(shí)間已經(jīng)有了很大地改進(jìn),但是電梯的運(yùn)行當(dāng)中等待乘客上梯時(shí)間卻不是人為可以控制。SATF算法考慮到了電梯運(yùn)行過(guò)程中乘客上梯時(shí)間的影響。實(shí)時(shí)電梯調(diào)度算法
2.1最早截止期優(yōu)先調(diào)度算法
最早截止期優(yōu)先(EDF-Earliest Deadline First)[16]調(diào)度算法是最簡(jiǎn)單的實(shí)時(shí)電梯調(diào)度算法,它的缺點(diǎn)就是造成電梯任意地尋找樓層,導(dǎo)致極低的電梯吞吐率。它與FCFS調(diào)度算法類似,EDF算法是電梯實(shí)時(shí)調(diào)度算法中最簡(jiǎn)單的調(diào)度算法。它響應(yīng)請(qǐng)求隊(duì)列中時(shí)限最早的請(qǐng)求,是其它實(shí)時(shí)電梯調(diào)度算法性能衡量的基準(zhǔn)和特例。
2.2 SCAN-EDF 算法
SCAN-EDF[16]算法是SCAN算法和EDF算法相結(jié)合的產(chǎn)物。SCAN-EDF算法先按照EDF算法選擇請(qǐng)求列隊(duì)中哪一個(gè)是下一個(gè)服務(wù)對(duì)象,而對(duì)于具有相同時(shí)限的請(qǐng)求,則按照SCAN算法服務(wù)每一個(gè)請(qǐng)求。它的效率取決于有相同deadline 的數(shù)目,因而效率是有限的。
2.3 PI 算法
PI(Priority Inversion)[16]算法將請(qǐng)求隊(duì)列中的請(qǐng)求分成兩個(gè)優(yōu)先級(jí),它首先保證高優(yōu)先級(jí)隊(duì)列中的請(qǐng)求得到及時(shí)響應(yīng),再搞優(yōu)先級(jí)隊(duì)列為空的情況下在相應(yīng)地優(yōu)先級(jí)隊(duì)列中的請(qǐng)求。
2.4 FD-SCAN 算法
FD-SCAN(Feasible Deadline SCAN)[17]算法首先從請(qǐng)求隊(duì)列中找出時(shí)限最早、從當(dāng)前位置開始移動(dòng)又可以買足其時(shí)限要求的請(qǐng)求,作為下一次SCAN的方向。并在電梯所在樓層向該請(qǐng)求信號(hào)運(yùn)行的過(guò)程中響應(yīng)處在與電梯運(yùn)行方向相同且電梯可以經(jīng)過(guò)的請(qǐng)求信號(hào)。這種算法忽略了用SCAN算法相應(yīng)其它請(qǐng)求的開銷,因此并不能確保服務(wù)對(duì)象時(shí)限最終得到滿足。電梯調(diào)度的高水平研究
以上兩個(gè)小結(jié)介紹了幾種在目前本人的能力上能進(jìn)行研究的、簡(jiǎn)單的電梯調(diào)度算法。但是并不是說(shuō)目前電梯調(diào)度只發(fā)展到這個(gè)層次。目前電梯的控制技術(shù)已經(jīng)進(jìn)入了電梯群控的時(shí)代。
隨著微機(jī)在電梯系統(tǒng)中的應(yīng)用和人工智能技術(shù)的發(fā)展,智能群控技術(shù)得以迅速發(fā)展起來(lái)。由此,電梯的群控方面陸續(xù)發(fā)展出了一批新方法,包括:基于專家系統(tǒng)的電梯群控方法、基于模糊邏輯的電梯群控方法、基于遺產(chǎn)算法的電梯群控方法、基于勝景網(wǎng)絡(luò)的電梯群控方法和基于模糊神經(jīng)網(wǎng)絡(luò)的電梯群控方法。4 電梯問(wèn)題的需求分析
4.1 電梯的初始狀態(tài)
本人設(shè)置的電梯的初始狀態(tài),是對(duì)住宅樓的電梯的設(shè)置。
(1)建筑共有21層,其中含有地下一層(地下一層為停車場(chǎng)及貨物運(yùn)送場(chǎng)所)。
(2)建筑內(nèi)部設(shè)有兩部電梯,編號(hào)分別為A梯、B梯。
(3)電梯內(nèi)部有23個(gè)按鈕,其中包括開門按鈕、關(guān)門按鈕和樓層按鈕,編號(hào)為-1,1,2,3,4……20。
(4)電梯外部含有兩個(gè)按鈕,即向上運(yùn)行按鈕和向下運(yùn)行按鈕。建筑頂層與地下一層例外,建筑頂層只設(shè)置有向下運(yùn)行按鈕,地下一層只設(shè)置有向上運(yùn)行按鈕。
(5)電梯開關(guān)門完成時(shí)間設(shè)定為1秒。電梯到達(dá)每層后上下人的時(shí)間設(shè)定為8秒。電梯從靜止開始運(yùn)行到下一層的時(shí)間設(shè)置為2秒,而運(yùn)行中通過(guò)一層的時(shí)間為1秒。
(6)在凌晨2:00——4:30之間,如若沒(méi)有請(qǐng)求信號(hào),A梯自動(dòng)停在14層,B梯自動(dòng)停在6層。
(7)當(dāng)電梯下到-1層后,如果沒(méi)有請(qǐng)求信號(hào),電梯自動(dòng)回到1層
4.2 電梯按鈕功能
電梯內(nèi)部的樓層按鈕:電梯內(nèi)部對(duì)應(yīng)每一個(gè)樓層的按鈕成為樓層按鈕,即本章第一結(jié)提到的編號(hào)為-1,1,2,3,4……20的按鈕。當(dāng)乘客進(jìn)入電梯后按下樓層按鈕,此按鈕顯示灰色,代表不可以用。這樣就表示乘客將要去往此層,電梯將開往相應(yīng)層。當(dāng)電梯到達(dá)該層后,按鈕恢復(fù)可以使用狀態(tài)。
電梯內(nèi)部開門按鈕:當(dāng)電梯達(dá)到乘客想要去往的某樓層后,乘客需要準(zhǔn)備離開電梯,當(dāng)電梯停穩(wěn)后,乘客可以按下開門按鈕,電梯門將打開,讓用戶離開。如若電梯到了乘客曾經(jīng)按下的樓層,但是無(wú)乘客按開門按鈕,電梯將自動(dòng)在停穩(wěn)后1秒后自動(dòng)開門。
電梯內(nèi)部關(guān)門按鈕:當(dāng)所有想要乘坐電梯的乘客都進(jìn)入電梯以后,準(zhǔn)備讓電梯開始運(yùn)行的時(shí)候,乘客需要按下關(guān)門按鈕,讓電梯門關(guān)閉,使電梯進(jìn)入運(yùn)行狀態(tài)。設(shè)置電梯的自動(dòng)關(guān)門時(shí)間為8秒。
電梯外部向上按鈕:此按鈕表示上樓請(qǐng)求,當(dāng)按下此按鈕時(shí),如果電梯到達(dá)按下此按鈕的樓層,且電梯運(yùn)行方向是向上的,那么電梯響將停下,并在電梯停穩(wěn)之后自動(dòng)開門,此請(qǐng)求被響應(yīng)后,取消此請(qǐng)求信號(hào)。電梯外部向下按鈕:此按鈕表示下樓請(qǐng)求,當(dāng)按下此按鈕時(shí),如果電梯到達(dá)按下此按鈕的樓層,且電梯運(yùn)行方向是向下的,那么電梯響將停下,并在電梯停穩(wěn)之后自動(dòng)開門,此請(qǐng)求被響應(yīng)后,取消此請(qǐng)求信號(hào)。
第二篇:電梯優(yōu)先調(diào)度算法
電梯優(yōu)先調(diào)度算法
電梯調(diào)度算法(ms InterView)
移臂調(diào)度算法包括以下四種:
1)先來(lái)先服務(wù)算法:根據(jù)訪問(wèn)者提出訪問(wèn)請(qǐng)求的先后次序來(lái)決定執(zhí)行次序。
2)最短尋找時(shí)間優(yōu)先調(diào)度算法:從等待的訪問(wèn)者中挑選尋找時(shí)間最短的那個(gè)請(qǐng)求執(zhí)行,而不管訪問(wèn)者的先后次序。
3)電梯調(diào)度掃描算法:從移動(dòng)臂當(dāng)前位置沿移動(dòng)方向選擇最近的那個(gè)柱面的訪問(wèn)者來(lái)執(zhí)行,若該方向上無(wú)請(qǐng)求訪問(wèn)時(shí),就改變移動(dòng)方向再選擇。
4)單向掃描調(diào)度算法:從0柱面開始往里單向掃描,掃到哪個(gè)執(zhí)行哪個(gè)。
*/
// t1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#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){ //先來(lái)先服務(wù) 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){ // 最短尋找時(shí)間優(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;} } //訪問(wèn) 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].nPosition if(nMinDistance>abs(pHead[i].nPosition-nCurrentPosition)){ nMinDistance=abs(pHead[i].nPosition-nCurrentPosition);nMinIndex=i;} } } if(nMinDistance==0xffff){ bOut=!bOut;continue;} //訪問(wèn) 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;} //訪問(wèn) 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;} 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 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(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)度算法***********”< /*=====================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)度算法***********”< -headstarts)){ cout< /*======================以下是SCAN算法====================*/ void SCAN(int queue[], int n, int diskrode, int headstarts){ int direction, i, fixi;cout<<“***********以下是SCAN調(diào)度算法*************”< /*======================以下是CSCAN算法====================*/ void CSCAN(int queue[],int n,int diskrode,int headstarts){ int direction,i,fixi;cout<<“***********以下是CSCAN調(diào)度算法*************”< 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ù):”< 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é)束,謝謝使用!”< 沈陽(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)手能力和程序開發(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;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 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;i 沈陽(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 //循環(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;i 沈陽(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ù)組。我最初嘗試了用鏈表,覺得方便易懂,但是在循環(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é) 實(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 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) (max 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離開本程序*/ { } } } } main() /*主程序*/ { init(); PrintInit(); acceptnum();}第三篇:操作系統(tǒng)課程設(shè)計(jì)-磁盤調(diào)度算法
第四篇:操作系統(tǒng)課程設(shè)計(jì),磁盤調(diào)度算法范文
第五篇:實(shí)驗(yàn)報(bào)告六 磁盤調(diào)度算法