下面是范文網(wǎng)小編整理的操作系統(tǒng)課程設(shè)計,磁盤調(diào)度算法范文3篇(磁盤調(diào)度算法的模擬實現(xiàn)課程設(shè)計),歡迎參閱。
操作系統(tǒng)課程設(shè)計,磁盤調(diào)度算法范文1
實驗報告六磁盤調(diào)度算法
班級:軟技2班學(xué)號:
姓名:劉道林
一.
實驗內(nèi)容:
熟悉磁盤的結(jié)構(gòu)以及磁盤的驅(qū)動調(diào)度算法的模擬,編程實現(xiàn)簡單常用的磁盤驅(qū)動調(diào)度算法先來先服務(wù)(FIFO)、電梯調(diào)度算法、最短尋找時間優(yōu)先算法、掃描(雙向掃描)算法、單向掃描(循環(huán)掃描)算法等。編程只需實現(xiàn)兩個算法。
題目可
以選取教材或習(xí)題中的相關(guān)編程實例。
編程語言建議采用c/c++或Java。模擬程序鼓勵采用隨機數(shù)技術(shù)、動態(tài)空間分配技術(shù),有條件 的最好能用圖形界面展現(xiàn)甚至用動畫模擬。
實驗性質(zhì):驗證型。
二.
實驗?zāi)康暮鸵?/p>
1)掌握使用一門語言進行磁盤驅(qū)動調(diào)度算法的模擬;
2)編寫程序?qū)⒋疟P驅(qū)動調(diào)度算法的過程和結(jié)果能以 較簡明直觀的方式展現(xiàn) 出來。
三. 實驗原理、方法和步驟
1.實驗原理
磁盤驅(qū)動調(diào)度對磁盤的效率有重要影響。磁盤驅(qū)動調(diào)度算法的好壞直接影響輔助存儲器的效率,從而影響計算機系統(tǒng)的整體效率。
常用的磁盤驅(qū)動調(diào)度算法有:最簡單的磁盤驅(qū)動調(diào)度算法是先入先出(FIFO)法。這種算法的實質(zhì)是,總是嚴(yán)格按時間順序?qū)Υ疟P請
求予以處理。算法實現(xiàn)簡單、易于理解并且相對公平,不會發(fā)生進程餓死現(xiàn)象。但該算法可能會移動的柱面數(shù)較多并且會經(jīng)常更換移
動方向,效率有待提高。
最短尋找時間優(yōu)先算法:總是優(yōu)先處理最靠近的請求。該算法移動的柱面距離較小,但可能會經(jīng)常改變
移動方向,并且可能會發(fā)生進程饑餓現(xiàn)象。
電梯調(diào)度:總是將一個方向上的請求全部處理完后,才改變方向繼續(xù)處理其他請求。
掃描(雙向掃描):總是從最外向最里進行掃描,然后在從最里向最外掃描。該算法與電梯調(diào)度算法的區(qū)別是電梯調(diào)度在沒有最外或
最里的請求時不會移動到最外或最里柱面,二掃描算法總是移到最外、最里柱面。兩端的請求有優(yōu)先服被務(wù)的跡象。
循環(huán)掃描(單 向掃描):從最外向最里進行柱面請求處理,到最里柱面后,直接跳到最外柱面然后繼續(xù)向里進行處理。該算法與掃描算法的區(qū)別是,回來過程不處理請求,基于這樣的事實,因為里端剛被處理。
2.實驗方法
1)使用流程圖描述演示程序的設(shè)計思想;
2)選取c/c++、Java等計算機語言,編程調(diào)試,最終給出運行正確的程序。
四.
實驗結(jié)果分析
能夠?qū)⒋疟P驅(qū)動調(diào)度算法在各種情況下都能得出正確的結(jié)論。對FIFO、最短尋找時間優(yōu)先或電梯調(diào)度算法能夠
在多次模擬數(shù)據(jù)下得出平均移動柱面數(shù),并進行效率比較分析
五.源程序代碼 #include <> #include <> #include <> #include <> typedef struct _proc {
char name[32];
/*定義進程名稱*/
int team;
/*定義柱面號*/
int ci;
/*定義磁道面號*/
int rec;
/*定義記錄號*/
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));
/*選中進程*/ 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()
/*接受請求函數(shù)*/
{
PROC *p;
P =(PROC*)malloc(sizeof(PROC));
Printf(“please input the information of the new processnprocess-name:nprocess-teamnprocess-cinprocess-recn”);
Printf(“”);
scanf(“%s”,p->name);
Printf(“ 0-199n”);
scanf(“%d”,&p->team);
/*輸入請求進程信息*/
Printf(“ 0-19n”);
scanf(“%d”,&p->ci);
Printf(“ 0-7n”);
scanf(“%d”,&p->rec);
getchar();
g_curr=g_head;
/*將此節(jié)點鏈入I/O請求表*/
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請求表輸出*/ } void qddd()
/*驅(qū)動調(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進程,模擬啟動此進程*/
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 的對稱過程*/
{
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) /*將選中的進程從I/O請求表中刪除*/ { out->prior->next=NULL;free(out); } else { out->prior->next=out->next; out->next->prior=out->prior; free(out); } }/*else*/ } void acceptnum() /*通過輸入0~1選擇‘驅(qū)動調(diào)度’或是‘接受請求’*/ { float num; char c; while(1) { Printf(“---------------n”); Printf(“please input a number between 0 and 1nnum<=:accept requestnnum>:qudong diaodunnnum==2:I/O LISTnnnum=?n”); scanf(“%f”,&num); getchar(); while((num<0||num>1)&&num!=2) /*過濾不合法數(shù)據(jù) 注意:本程序其他輸入數(shù)據(jù)可能未過濾*/ { Printf(“number ERROR!Input again please!nnum=?n ”); scanf(“%f”,&num); getchar(); } if(num>&&num!=2) /*驅(qū)動調(diào)度*/ { if(g_head->next==NULL) { Printf(“nn”); Printf(“---------------------n”); Printf(“I/O list is empty!!n”); /*請求表為空 無需調(diào)度*/ } else { Printf(“qudong diaodun”); qddd(); /*調(diào)用函數(shù)進行調(diào)度*/ } } else if(num<=) /*接受請求*/ { Printf(“accept requestnn”); acceptreq(); } else if(num==2) /*通過輸入2顯示當(dā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)》 學(xué)號:班級:軟技姓名:張靖偉 課 程 設(shè) 計 報 告 4班 目錄 實驗:進程調(diào)度算法——時間片輪轉(zhuǎn)算法 2 實驗:銀行家算法3 實驗:分區(qū)分配算法——4 實驗:頁面置換算法——5 實驗:磁盤調(diào)度算法—— bF和FF fIFO和LRU SCAN和SSTF 1實驗:進程調(diào)度算法——時間片輪轉(zhuǎn)算法 1.實驗設(shè)計說明 用時間片輪轉(zhuǎn)算法模擬單處理機調(diào)度。 (1)建立一個進程控制塊PCB來代表。PCB包括:進程名、到達時間、運行時間和進程后的狀態(tài)。 進程狀態(tài)分為就緒(R)和刪除(C)。 (2)為每個進程任意確定一個要求運行時間和到達時間。 (3)按照進程到達的先后順序排成一個隊列。再設(shè)一個指針指向隊首和隊尾。(4)執(zhí)行處理機調(diào)度時,開始選擇對首的第一個進程運行。(5)執(zhí)行: a)輸出當(dāng)前運行進程的名字; b)運行時間減去時間片的大小。 (6)進程執(zhí)行一次后,若該進程的剩余運行時間為零,則刪除隊首,并將該進程的狀態(tài)置為C;若不為空,則將向后找位置插入。繼續(xù)在運行隊首的進程。 (7)若進程隊列不空,則重復(fù)上述的(5)和(6)步驟直到所有進程都運行完為止。 2.實驗代碼 /*****************時間片輪轉(zhuǎn)調(diào)度算法*******************/ #include <> #include <> #include <> #define N 10 int time=0;bool spe=false;typedef struct pcb /*進程控制塊定義*/ { char pname[N];int runtime;/*進程名*/ /*服務(wù)時間*/ int arrivetime;/*到達時間*/ char state;/*進程狀態(tài)*/ struct pcb*next;/*連接指針*/ }PCB;typedef struct back_team/*后備隊列定義*/ { PCB*first,*tail;}BACK_TEAM;typedef struct pre_team/*就緒隊列定義*/ { PCB*first,*tail;}PRE_TEAM;PCB*creat()/*創(chuàng)建PCB*/ { char s[N];printf(“請輸入進程名:n”);scanf(“%s”,s);printf(“請輸入進程服務(wù)時間(/秒):n”);int t;scanf(“%d”,&t);PCB*p=(PCB*)malloc(sizeof(PCB));strcpy(p->pname,s);p->runtime=t;printf(“請輸入進程到達時間(/秒):n”);scanf(“%d”,&t);p->arrivetime=t;p->state='R';p->next=NULL;getchar();return p;} PCB*copy(PCB*p)/*復(fù)制一個進程*/ { } PCB*getnext(PCB*p,BACK_TEAM*head)/*得到隊列中下一個進程*/ { } void del(BACK_TEAM*head,PRE_TEAM*S)/*釋放申請的空間*/ { PCB*p=head->first->next;while(p){ free(head->first);head->first=p;PCB*s=head->first;if(!p)return NULL;if(!p)return NULL;PCB*s=(PCB*)malloc(sizeof(PCB));strcpy(s->pname,p->pname);s->next=NULL;s->arrivetime=p->arrivetime;s->runtime=p->runtime;s->state=p->state;return s;while(strcmp(s->pname,p->pname))s=s->next;return s->next; } } p=p->next;head->first=head->tail=NULL;free(head);free(S);BACK_TEAM*creatbt(BACK_TEAM*head)/*創(chuàng)建后備隊列*/ { } bool recognize(PRE_TEAM*s1)/*判斷運行是否結(jié)束*/ { if(!s1||!s1->first)return false;PCB*p=creat();if(!head->first)else head->tail->next=p;head->first=p;head->tail=p;return head;if(s1->first==s1->tail) if(s1->first->state!='C')else return false;return true;PCB*test=s1->first;while(test!=s1->tail&&(test->state!='C'))test=test->next;if(test==s1->tail) } return true;else return false;PCB*run(PRE_TEAM*s)/*在CPU中運行*/ { if(!s->first){ } printf(“%dt%st”,time,s->first);s->first->runtime--;time++;if(s->first->runtime<=0){ } PCB*p=s->first;s->first->state='C';printf(“%cn”,s->first->state);s->first=p->next;free(p);if(!s->first){ } goto next;s->tail=NULL;spe=false;return NULL;spe=false;return NULL;printf(“%cn”,s->first->state);next:PCB*head=s->first; } int CREAT(PCB*HEAD,PRE_TEAM*head2,bool*test,PCB*c)/*創(chuàng)建就緒隊列*/ { int i=0;if(!head2->first) if(HEAD){ } if(c){ } head2->first=head2->tail=HEAD;return 1;head2->first=c;c->next=HEAD;head2->tail=HEAD;return 1;s->first=head->next;if(!s->first){ } head->next=NULL;return head;s->tail=NULL;spe=true;if(head2->first==head2->tail){ } else { } if(*test){ } if(c){ } head2->tail->next=c;head2->tail=c;if(head2->first->arrivetime!=time)for(i=0;i } if(c->arrivetime!=time){ } head2->tail->next=c;head2->tail=c;time++;return 1;if(HEAD){ head2->tail->next=HEAD; } } head2->tail=HEAD;return 1;int main(void){ bACK_TEAM*head1=(BACK_TEAM*)malloc(sizeof(BACK_TEAM));head1->first=head1->tail=NULL;PRE_TEAM *head2=(PRE_TEAM*)malloc(sizeof(PRE_TEAM));head2->first=head2->tail=NULL;char ask;int num=0;bool test=true;do{ Printf(“要創(chuàng)建進程嗎(y/n):”);if((ask=getchar())=='y'||ask=='Y'){ } else if(ask=='n'||ask=='N')else return 1;break;head1=creatbt(head1);num++;}while(1);PCB*p=copy(head1->first);PCB*HEAD=NULL;head2->first=head2->tail=copy(head1->first);printf(“時刻t進程名t狀態(tài)n”); } while(spe||recognize(head2)){ } del(head1,head2);return 1;CREAT(HEAD,head2,&test,p);HEAD=run(head2);p=copy(getnext(p,head1));3.實驗結(jié)果 和不馬上運行: 當(dāng)有兩個進程的時候 當(dāng)有多個進程的時候: 4.實驗結(jié)果分析 rR算法:每次調(diào)度時,把CPU分配給隊首進程,并且令其執(zhí)行一個時間片,時間片的大小從幾個ms到幾百ms。當(dāng)執(zhí)行的時間片用完時,由一個計時器發(fā)出時鐘中斷請求,調(diào)度程序便依據(jù)此信號來停止該進程的執(zhí)行;并且把它送往就緒隊列的隊尾;然后,再把處理劑分配給就緒隊列中的新隊首進程,同時也讓它執(zhí)行一個時間片。這樣就可以保證就緒隊列中的所有進程在一個給定時間內(nèi)均能獲得一時間片的處理機執(zhí)行時間。換言之,系統(tǒng)能在給定的時間內(nèi)相應(yīng)所有用戶的請求.2實驗:銀行家算法 1.實驗設(shè)計說明 1.該算法通過建立幾個簡單的二維數(shù)組Available,Max,Allocation,Need簡單的模擬銀行家算法和安全性算法,每個二維數(shù)組默認(rèn)[][0]為A資源,[][1]為B資源,[][2]為C資源,默認(rèn)有5個進程 2.程序首先要輸入各個進程的三種資源的情況,包括每個進程最大的需求量,已經(jīng)分配的資源量和現(xiàn)在還需要的資源量,以及系統(tǒng)現(xiàn)在剩余的資源量。3.程序會判斷輸入的信息是否在程序的規(guī)定范圍內(nèi),正確才運行。 4.在執(zhí)行安全算法開始時,Work∶=Available;② Finish: 它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]∶=false;當(dāng)有足夠資源分配給進程時,再令Finish[i]∶=true 5.從進程集合中找到一個能滿足下述條件的進程: Finish[i]=false;并且 Need[i,j]≤Work[j]; 若找到,執(zhí)行6,否則,執(zhí)行7。 6.當(dāng)進程Pi獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行: work[j]∶=Work[i]+Allocation[i,j];Finish[i]∶=true;然后繼續(xù)執(zhí)行5。 7.如果所有進程的Finish[i]=true都滿足,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。 2.實驗代碼 #include <> int Available[3],Max[5][3],Allocation[5][3],Need[5][3];bool Safe(int p){ int Work[3]={Available[0],Available[1],Available[2]};int Finish[5]={0,0,0,0,0};int i=0,m,num=0;if(Need[p][0]||Need[p][1]||Need[p][2]) return false;printf(“p%d可以運行n”,p);Work[0]+=Allocation[p][0];Work[1]+=Allocation[p][1];Work[2]+=Allocation[p][2];Finish[p]=1;while(num<=25){ if(!Finish[i]&&(Need[i][0]<=Work[0])&&(Need[i][1]<=Work[1])&&(Need[i][2]<=Work[2])) { Printf(“p%d可以運行n”,i); work[0]+=Allocation[i][0]; work[1]+=Allocation[i][1]; work[2]+=Allocation[i][2]; finish[i]=1; } num++; i=(i+1)%5; if(i==p) i++;} for(m=0;m<5;m++) if(Finish[m]==0) break;if(m==5) return true;else { Printf(“系統(tǒng)處于不安全狀態(tài)!n”); return false;} } void Banker(int p,int i,int j,int k){ int able[3]={Available[0],Available[1],Available[2]};int need[3]={Need[p][0],Need[p][1],Need[p][2]};int allocation[3]={Allocation[p][0],Allocation[p][1],Allocation[p][2]};if(i<=Need[p][0]&&j<=Need[p][1]&&k<=Need[p][2]) if(i<=Available[0]&&j<=Available[1]&&k<=Available[2]) { available[0]-=i; available[1]-=j; available[2]-=k; allocation[p][0]+=i; allocation[p][1]+=j; allocation[p][2]+=k; need[p][0]-=i; need[p][1]-=j; need[p][2]-=k; if(!Safe(p)) { available[0]=able[0],Available[1]=able[1],Available[2]=able[2]; need[p][0]=need[0],Need[p][1]=need[1],Need[p][2]=need[2]; allocation[p][0]=allocation[0],Allocation[p][1]=allocation[1],Allocation[p][2]=allocation[2]; Printf(“系統(tǒng)可能發(fā)生死鎖!n”); } } else Printf(“等待!系統(tǒng)資源不足!n”);else Printf(“錯誤!申請的資源錯誤!n”);} int main(void){ int i,j,k=0,p;printf(“請輸入進程的三種資源的情況max{a,b,c} allocation{a,b,c} need{a,b,c}:n”);for(i=0;i<5;i++){ for(j=0;j<3;j++) scanf(“%d”,&Max[i][j]); for(j=0;j<3;j++) scanf(“%d”,&Allocation[i][j]); for(j=0;j<3;j++) scanf(“%d”,&Need[i][j]);} printf(“請輸入Available{a,b,c}情況:”);for(i=0;i<3;i++) scanf(“%d”,&Available[i]);printf(“MaxtAllotNeedtAvain”);for(i=0;i<5;i++){ for(j=0;j<3;j++) Printf(“%d ”,Max[i][j]); Printf(“t”); for(j=0;j<3;j++) Printf(“%d ”,Allocation[i][j]); Printf(“t”); for(j=0;j<3;j++) Printf(“%d ”,Need[i][j]); Printf(“t”); if(k!=4) Printf(“n”); k++;} for(i=0;i<3;i++)printf(“%d ”,Available[i]);printf(“n請輸入要申請的進程和資源<0~4>:”);scanf(“%d %d %d %d”,&p,&i,&j,&k);if(p>=0&&p<=4)Banker(p,i,j,k);else printf(“沒有此進程!”);return 1;} 3.實驗結(jié)果 4.實驗結(jié)果分析 這個實驗只是簡單的演示了進程申請資源之后的進程運行的其中一個運行序列,因為這個算法課本上已經(jīng)有詳細的解說,所以這個程序并沒有把算法的過程展現(xiàn)出來,只展現(xiàn)了進程的運行序列結(jié)果,另外,如果申請錯誤的話程序會有不同的結(jié)果 有時會發(fā)生死鎖 實驗:分區(qū)分配算法——BF和FF 1.實驗設(shè)計說明 1.這個算法模擬的是對內(nèi)存空間的管理,這個程序用了一個簡單的二維數(shù)組模擬分區(qū)表。2.程序首先要輸入固定的五個分區(qū)的大小和始址,其次要輸入作業(yè)的大小和實現(xiàn)的算法,由于這個程序把FF和BF放到一個程序中,便于比較兩個算法。 首次適應(yīng)算法FF(First Fit)把分區(qū)大于等于請求作業(yè)請求的分區(qū)分給請求者,余下部分仍留在空閑區(qū)中,然后修改分區(qū)表。然后打印出分配后的分區(qū)表 最佳適應(yīng)算法BF(Best Fit) 首先把分區(qū)表按空間大小從小到大排序。然后把分區(qū)大于等于請求作業(yè)請求的分區(qū)分給請求者,余下部分仍留在空閑區(qū)中,然后修改分區(qū)表。然后打印出分配后的分區(qū)表 2.實驗代碼 #include <> int table[5][3];void FirstFit(int job[3],int ta[5][3]){ int i,j;for(j=0;j<3;j++) for(i=0;i<5;i++) if(ta[i][1]>=job[j]){ } ta[i][1]-=job[j];ta[i][2]+=job[j];break;if(i==5)printf(“內(nèi)存不足!請等待!n”); } printf(“空閑區(qū)t大小t始址n”);for(j=0;j<5;j++){ } for(i=0;i<3;i++)printf(“%dt”,ta[j][i]);printf(“n”);void BestFit(int job[3]){ int j1,temp1,temp2,temp3,i,j;for(j1=0;j1<3;j1++){ for(i=0;i<5;i++) for(j=0;j<4;j++) if(table[j][1]>table[j+1][1]){ temp1=table[j][0];temp2=table[j][1];temp3=table[j][2]; table[j][0]=table[j+1][0];table[j][1]=table[j+1][1];table[j][2]=table[j+1][2]; } table[j+1][0]=temp1;table[j+1][1]=temp2;table[j+1][2]=temp3; } if(i==5)printf(“內(nèi)存不足!請等待!n”);printf(“空閑區(qū)t大小t始址n”);for(j=0;j<5;j++){ } for(i=0;i<3;i++)printf(“%dt”,table[j][i]); } for(i=0;i<5;i++) if(table[i][1]>=job[j1]){ } table[i][1]-=job[j1];table[i][2]+=job[j1];break;printf(“n”);void main(){ int table1[5][3],job[3],j,i;printf(“請輸入5個空分區(qū)的大小和始址:”);for(i=0;i<5;i++){ } for(j=0;j<5;j++){ } printf(“請輸入3個要運行作業(yè)的大?。骸?;for(i=0;i<3;i++)scanf(“%d”,&job[i]);for(i=0;i<3;i++)printf(“%dt”,table[j][i]);table[i][0]=i+1;table1[i][0]=i+1;for(j=1;j<3;j++){ } scanf(“%d”,&table[i][j]);table1[i][j]=table[i][j];printf(“n”);printf(“請輸入要實現(xiàn)的算法1(FF)2(BF):”); } char c;scanf(“%d”,&i);getchar();if(i==1){ } else if(i==2){ } BestFit(job);printf(“還要實現(xiàn)FF嗎(y/n)”);if((c=getchar())=='y')FirstFit(job,table1);FirstFit(job,table1);printf(“還要實現(xiàn)BF嗎(y/n)”);if((c=getchar())=='y')BestFit(job);3.實驗結(jié)果 4.實驗結(jié)果分析 首先輸入分區(qū)表的分區(qū)情況,然后輸入運行作業(yè)的大小,選擇要實現(xiàn)的算法。第一個作業(yè)是96,所以找到第四個分區(qū),第四個分區(qū)變?yōu)?22,316,接著到第二個作業(yè)20,然后把第一個分區(qū)分給第二個作業(yè),則第一個分區(qū)信息變?yōu)?22,316,到第三個作業(yè)時,由于內(nèi)存表中沒有比第三個請求的分區(qū)還大的分區(qū),所以會提示內(nèi)存不足; 然后到BF算法,因為是按空間大小排序的,所以第一個作業(yè)96被分配給了已經(jīng)排好序的內(nèi)存為96的第五個分區(qū),第二個作業(yè)被分配給大小為36的分區(qū),第三個作業(yè)被分配給內(nèi)存大小為218的分區(qū),然后又對剩余空間再次排隊,用來給下一批作業(yè)分配。實驗:頁面置換算法——FIFO和LRU 1實驗設(shè)計說明 程序設(shè)置了兩個結(jié)構(gòu)體,freeBlock和jobQueue,其中freeBlock代表物理塊,初次創(chuàng)建物理塊時,物理塊的計時器time=0,還有代表作業(yè)的index=-1;物理塊有添加和刪除的功能,每一次添加或刪除都要初始化物理塊。并且可以重復(fù)添加和刪除,這樣可以很好的測試算法的性能。2.算法設(shè)計的思想是:進入物理塊時間越長的則物理塊的計時器數(shù)值越大,如果物理塊中有要訪問的頁面,則那個含頁面的物理塊的計數(shù)器變成1;并且物理塊要滿才會發(fā)生置換,于是設(shè)置了物理塊計數(shù)器Time; 2.實驗代碼 #include<> #include<> typedef struct freeBlock { int index,time;struct freeBlock*next;}freeBlock;typedef struct jobQueue { int index;struct jobQueue*next;}jobQueue;jobQueue*creat(jobQueue*head,int num){ jobQueue*job=(jobQueue*)malloc(sizeof(jobQueue));job->index=num;job->next=NULL;if(!head){ jobQueue*j=head;while(j->next)j=j->next;j->next=job;head=job;else } } return head;freeBlock*creat(freeBlock*head){ } freeBlock*inse(freeBlock*head){ } freeBlock*dele(freeBlock*head){ freeBlock*test=head;while(test){ } freeBlock*free=(freeBlock*)malloc(sizeof(freeBlock));free->index=-1;free->time=0;free->next=head;head=free;return head;test->index=-1;test->time=0;test=test->next;freeBlock*free=(freeBlock*)malloc(sizeof(freeBlock));free->index=-1;free->time=0;free->next=NULL;if(head)free->next=head;head=free;return head; } freeBlock*test=head;while(test){ } freeBlock*f=head;head=f->next;free(f);return head;test->index=-1;test->time=0;test=test->next;bool check(freeBlock*free,int j){ } void LRU(freeBlock*free,jobQueue*job){ int size=0,Time=0,time=0;jobQueue*jtest=job;freeBlock*ftest=free;while(ftest){ freeBlock*f=free;while(f){ } return false;if(f->index==j)return true;f=f->next; } size++;ftest=ftest->next;printf(“LRU置換頁面為:”);while(jtest){ ftest=free;while(ftest){ } ftest=free;while((time==size)&&ftest){ if(check(free,jtest->index)){ if(ftest->index==jtest->index){ } ftest->time++;if(Time } } } } time=0;Time=0;break;if(ftest->time==Time){ } ftest=ftest->next;printf(“%d ”,ftest->index);ftest->index=jtest->index;ftest->time=1;time=0;Time=0;break;jtest=jtest->next;printf(“n”);void FIFU(freeBlock*free,jobQueue*job){ int size=0,Time=0,time=0;jobQueue*jtest=job;freeBlock*ftest=free;while(ftest){ } size++;ftest=ftest->next; Printf(“FIFU置換頁面為:”);while(jtest){ ftest=free;while(ftest){ } ftest=free;while((time==size)&&ftest){ if(check(free,jtest->index)){ } if(ftest->time==Time)time=0;Time=0;break;if(ftest->index==-1){ } ftest->time++;if(Time } } } { } ftest=ftest->next;printf(“%d ”,ftest->index);ftest->index=jtest->index;ftest->time=1;time=0;Time=0;break;jtest=jtest->next;printf(“n”);void main(){ int num,ch,p;freeBlock*block=NULL;jobQueue*job=NULL;printf(“請輸入物理塊數(shù)目:”);scanf(“%d”,&p);for(int i=0;i } job=creat(job,ch);FIFU(block,job);LRU(block,job);while(true){ Printf(“增加物理塊(1)減少物理塊(2),否則按任意鍵scanf(”%d“,&num);if(num==1){ } else if(num==2){ Printf(”要減少幾塊:“);scanf(”%d“,&ch);if(ch>=p){ } for(i=0;i } } } FIFU(block,job);LRU(block,job);else ;break;3.實驗結(jié)果 4.實驗結(jié)果分析 程序開始要輸入物理塊數(shù)目和作業(yè)個數(shù),然后再輸入作業(yè).在測試后可以隨意添加或刪除物理塊來測試算法的性能。實驗:磁盤調(diào)度算法——SCAN和SSTF 1.實驗設(shè)計說明 算法定義了一個雙向鏈表,利用雙向鏈表可以很好的進行方向的轉(zhuǎn)換,且雙向鏈表的中有代表磁盤號的標(biāo)識符index;兩個算法均采用訪問完一個磁盤序列時刪除該序列,其中scan算法實現(xiàn)時有點麻煩,首先要找到當(dāng)前磁盤號序列的Max最大值和最小值Min及指向他們的指針pmax,pmin,另外還要找到當(dāng)前磁頭的相鄰的兩個訪問序列信息psmax,psmin;還有一個重要的標(biāo)志,那就是訪問的方向test;當(dāng)遇到最大值或最小值時,便會反置test的值,也就是訪問的方向 2.實驗代碼 #include <> #include <> #include <> typedef struct memory { int index;struct memory*left,*right;}memory;memory*creat(){ Printf(“請輸入磁道隊列以-1結(jié)束!n”);int ch;memory*head=NULL,*tail,*p;scanf(“%d”,&ch);while(ch!=-1){ P=(memory*)malloc(sizeof(memory));p->index=ch;p->left=p->right=NULL; } } if(!head)head=p;else { } tail=p;scanf(“%d”,&ch);tail->right=p;p->left=tail;return head;void SSTF(memory*head,int index){ int index1=index,num;memory*p1=head,*p,*p2=NULL;while(true){ num=abs(p1->index-index1);p=p1;while(p){ } if((abs(p->index-index1))<=num){ } p=p->right;num=abs(p->index-index1);if(p!=p1)p2=p;p=p1->right;if(p2){ } else { printf(“%d ”,p1->index);index1=p2->index;printf(“%d ”,p2->index);p2->left->right=p2->right;if(p2->right)p2->right->left=p2->left;free(p2);p2=NULL; } } } index1=p1->index;if(!p){ } else { } p=p1;p1=p1->right;free(p);continue;free(p1);break;void SCAN(memory*head,int index){ int index1=index,num,test,max=0,min=199,Max,Min;printf(“請輸入磁頭查詢方向<0正向><1負(fù)向>!n”);scanf(“%d”,&test);memory*p1=head,*p,*p2=NULL,*pmax,*pmin,*psmax=NULL,*psmin=NULL; while(p1){ } p1=head;while(p1){ if(!test){ if(!test){ } else { } p1=p1->right;pmin=p1;if(p1->index<=min)Min=min=p1->index;pmax=p1;if(p1->index>=max)Max=max=p1->index; } } pmin=p1;if(p1->index<=min)Min=min=p1->index; else { } p1=p1->right;pmax=p1;if(p1->index>=max)Max=max=p1->index;p1=head;while(true){ num=abs(p1->index-index1);p=p1;while(p){ if(!test){ if(p->index>=index1&&p->index<=max) } } if((abs(p->index-index1))<=num){ } Psmin=p; num=abs(p->index-index1);if(p->left&&p->right)p2=p;else { } p=p->right;if(p->index<=index1&&p->index>=min) if(abs(p->index-index1)<=num){ } Psmax=p; num=abs(p->index-index1);if(p->left&&p->right)p2=p;if(p2) { if(!test){ } else { index1=psmax->index;p=psmax;if(index1==Min){ } test=0;Max=Min=-1;p1=pmin;index1=psmin->index;p=psmin;if(index1==Max){ } test=1;Min=Max=-1;p1=pmax; } printf(“%d ”,index1);if(!test){ } else { if(psmax)if(psmin){ } else { } psmax->right->left=psmax->left;if(psmax->left) Psmax->left->right=psmax->right;psmin->left->right=psmin->right;if(psmin->right) Psmin->right->left=psmin->left;free(psmin);free(psmax); } } { } else { } psmin->right->left=psmin->left;if(psmin->left) Psmin->left->right=psmin->right;psmax->left->right=psmax->right;if(psmax->right) Psmax->right->left=psmax->left;free(psmax);free(psmin);else { if(!test){ if(p1->index==Max){ test=1; } } Min=Max=-1;else { } if(psmax){ } else { } printf(“%d ”,index1);index1=psmin->index;p=psmin;index1=psmax->index;p=psmax;if(p1->index==Min){ } test=0;Max=Min=-1; } } } if(p->left&&!p->right){ } else if(p->right&&!p->left){ } else if(!p->right&&!p->left){ } free(p);free(p);break;p1=p->right;p1->left=NULL;p1=p->left;p1->right=NULL;p2=psmax=psmin=NULL;void main(){ int p,t;memory*head=creat();printf(“請輸入磁頭當(dāng)前的位置(0-199)”);scanf(“%d”,&p);printf(“要進行的算法:<0:SCAN><1:SSTF>”);scanf(“%d”,&t);if(!t)SCAN(head,p);else SSTF(head,p);} 3.實驗結(jié)果 4.實驗結(jié)果分析 輸入要訪問的磁盤號,然后選擇要實現(xiàn)的算法就可以看到結(jié)果,當(dāng)選0(正向)的時候由于當(dāng)前的磁頭在143處,所以要訪問的磁盤號就必須大于143,當(dāng)最大的磁盤號訪問完時,就轉(zhuǎn)向小于143的磁盤開始由大向小訪問,選1的話則相反。最短尋道時間算法是從整個隊列中選擇距離磁頭最近的訪問,算法的實現(xiàn)運用了絕對值的概念 1.實驗題目: 磁盤調(diào)度算法。 建立相應(yīng)的數(shù)據(jù)結(jié)構(gòu); 在屏幕上顯示磁盤請求的服務(wù)狀況; 將一批磁盤請求的情況存磁盤文件,以后可以讀出并重放; 計算磁頭移動的總距離及平均移動距離; 支持算法:FIFO、SSTF、SCAN、CSCAN; 2.設(shè)計目的: 調(diào)度磁盤I/O請求服務(wù),采用好的方式能提高訪問時間和帶寬。本實驗通過編程對磁盤調(diào)度算法的實現(xiàn),加深對算法的理解,同時通過用C++語言編寫程序?qū)崿F(xiàn)這些算法,并在windos平臺上實現(xiàn),更好的掌握操作系統(tǒng)的原理以及實現(xiàn)方法,提高綜合運用專業(yè)課知識的能力。 3.任務(wù)及要求 設(shè)計任務(wù) 編程實現(xiàn)下述磁盤調(diào)度算法,并求出每種算法的平均尋道長度: 1、先來先服務(wù)算法(FCFS) 2、最短尋道時間算法(SSTF) 3、掃描算法(SCAN) 4、循環(huán)掃描算法(CSCAN) 設(shè)計要求 對用戶指定的磁盤調(diào)度請求序列,基于以上四種算法,實現(xiàn)各自的調(diào)度順序并輸出,同時計算出各種算法下的平均尋道長度。 4.算法及數(shù)據(jù)結(jié)構(gòu) 算法的總體思想 queue[n] 為請求調(diào)度序列,diskrode為磁盤磁道數(shù),headstarts為正在調(diào)度的磁道 ①先來先服務(wù)算法(FCFS)按queue[n]數(shù)組的順序進行磁盤調(diào)度,將前一個調(diào)度磁道與下一個調(diào)度磁道的差值累加起來,得到總的尋道長度,再除以n得到平均尋道長度。 ②最短尋道時間優(yōu)先算法(SSTF)將queue[n]進行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,通過循環(huán)語句找出離起始磁頭最短的位置。 ③掃描算法(SCAN) 將queue[n]進行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當(dāng)?shù)蓝它c(queue[0]或queue[n-1])時,再在定位處反向遍歷到另一端。當(dāng)調(diào)度磁道不在queue端點時,總的尋道長度為為前一個磁道與后一個磁 道差值的累加,當(dāng)?shù)竭_端點且queue[n]未全調(diào)度時,總尋道長度加上端點值再加上下一個調(diào)度磁道的值,再按前面的算法進行,直到磁道全部都調(diào)度完畢,得到總的尋道長度,除以n得到平均尋道長度。 ④循環(huán)掃描算法(CSCAN)將queue[n]進行由小到大的排序,首先定位當(dāng)前調(diào)度磁headstarts在queue[n]的位置,然后在此位置按給定的方向遍歷queue[n],當(dāng)?shù)蓝它c(queue[0]或queue[n-1])時,反向到另一端點再以此方向進行遍歷,直到queue[n]中所有都調(diào)度完。當(dāng)調(diào)度磁道不在queue端點時,總的尋道長度為為前一個磁道與后一個磁道差值的累加,當(dāng)?shù)竭_端點且queue[n]未全調(diào)度時,總尋道長度加上端點值再加上磁盤磁道總長度,再加上下一個調(diào)度磁道的值,再按前面的算法進行,直到磁道全部都調(diào)度完畢,得到總的尋道長度,除以n得到平均尋道長度。 5、源代碼: #include<> #include<> #include<> void menu(){ cout<<“*********************菜單*********************”< 1、先來先服務(wù)算法(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 //對當(dāng)前正在執(zhí)行的磁道號進行定位,返回磁道號小于當(dāng)前磁道中最大的一個 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是請求調(diào)度序列,n為其個數(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)度磁盤請求序列queue的長度,diskrode表示磁盤磁道的個數(shù),headstarts表示目前正在調(diào)度的磁道; cout<<“請輸入磁盤的總磁道數(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é)束,謝謝使用!”< 操作系統(tǒng)課程設(shè)計,磁盤調(diào)度算法范文3篇(磁盤調(diào)度算法的模擬實現(xiàn)課程設(shè)計)相關(guān)文章: ★ 新課程學(xué)習(xí)體會12篇(新課程心得體會) ★ 淺談新課程改革背景下的高中物理教學(xué)[材料]3篇 新課程改革下的高中物理教學(xué)痛點 ★ 課程體系構(gòu)建調(diào)研論證報告3篇 課程建設(shè)調(diào)研報告 ★ 三年級作文課程標(biāo)準(zhǔn)3篇 小學(xué)三年級作文課程標(biāo)準(zhǔn) ★ 印刷設(shè)計與工藝課程教學(xué)大綱3篇(印刷設(shè)計與工藝課程教學(xué)大綱論文) ★ 小學(xué)科學(xué)課程教學(xué)反思4篇 小學(xué)科學(xué)課教學(xué)反思簡短 ★ 課程設(shè)計心得體會12篇 課程設(shè)計心得總結(jié) ★ 蔬菜技術(shù)課程總結(jié)3篇 蔬菜種植技術(shù)總結(jié)操作系統(tǒng)課程設(shè)計,磁盤調(diào)度算法范文2
操作系統(tǒng)課程設(shè)計,磁盤調(diào)度算法范文3