第一篇:實(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
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離開(kāi)本程序*/ { } } } } main() /*主程序*/ { init(); PrintInit(); acceptnum();} 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)手能力和程序開(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;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ù)組。我最初嘗試了用鏈表,覺(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é) 操作系統(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 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ò)資源; 目錄 一、設(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] 圖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] 圖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] 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ì)心幫助。第二篇:操作系統(tǒng)課程設(shè)計(jì)-磁盤調(diào)度算法
第三篇:操作系統(tǒng)課程設(shè)計(jì),磁盤調(diào)度算法范文
第四篇:磁盤調(diào)度[推薦]
第五篇:模擬磁盤調(diào)度算法系統(tǒng)的設(shè)計(jì)畢業(yè)設(shè)計(jì)