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