




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、中北大學軟件學院實訓說明書中北大學軟件學院實訓說明書實訓名稱: 操作系統(tǒng)課程設計 基于Linux的設備分配及磁盤調度算法題目名稱: 軟件工程專 業(yè): 班 級: 12210A02 小組成員學號: 1221010516 姓名: 高田田 成績: 學號: 1221010543 姓名: 王 浩 成績: 學號: 1221010618 姓名: 許嘉陽 成績: 學號: 1221010707 姓名: 王晉英 成績: 薛海麗指導教師: 2015 年 1 月任務分工情況說明姓名分工組長高田田 負責小組分工,資料查詢,參與整體需求分析及概要設計,完成設備分配部分的詳細設計及代碼。完成代碼整合及主函數(shù)的編寫。完成小組說
2、明書文檔整理工作。組員王浩 資料查詢, 參與整體需求分析及概要設計,完成磁盤調度中先來先服務(FCFS)和循環(huán)掃描調度算法(CSCAN)部分的詳細設計及代碼,協(xié)助完成設備分配。組員許嘉陽 資料查詢, 參與整體需求分析及概要設計,完成磁盤調度中最短尋道時間優(yōu)先算法(SSTF)和掃描調度算法(SCAN)部分的詳細設計及代碼代碼,協(xié)助完成設備分配。組員王晉英 資料查詢, 參與整體需求分析及概要設計,完成進程控制部分的詳細設計及代碼編寫。第 0 頁 共 1 頁目錄1. 緒論12. 需求分析12.1. 目的12.2. 內(nèi)容22.2.1. 進程調度22.2.2. 設備分配22.2.3. 磁盤調度33. 概
3、要設計43.1. 進程調度43.1.1. 功能模塊圖43.1.2. 相關函數(shù)53.2. 設備分配53.2.1. 功能模塊圖63.2.1. 相關函數(shù)63.3. 磁盤調度73.2.1. 功能模塊圖73.2.1. 相關函數(shù)74. 詳細設計74.1. 進程調度74.1.1進程創(chuàng)建74.1.2進程切換94.1.3進程阻塞104.1.4進程喚醒104.1.5進程結束114.1.6進程顯示124.2. 設備分配134.2.1. 設備分配134.2.2. 設備釋放164.2.3. 設備添加194.2.4. 設備刪除214.2.5. 設備顯示244.3. 磁盤調度264.3.1. 先來先服務算法264.3.2
4、最短尋道時間優(yōu)先算法274.3.3 掃描算法28 4.3.4 循環(huán)掃描算法30 4.3.5 調用四種算法比較315. 心得體會326. 參考文獻337. 源代碼34I1. 緒論隨著信息技術的發(fā)展, ,Linux操作系統(tǒng)得到了前所未有的廣泛應用。Linux被應用到包括便攜式電子設備、生物科技以及航天科技等各種領域。顯然不同應用領域對Linux系統(tǒng)的實時性、公平性和吞吐量等性能有著不同的要求,而進程調度算法對Linux系統(tǒng)性能起著至關重要的作用,用來創(chuàng)建進程,撤銷進程,實現(xiàn)進程轉換,它提供了可運行得進程之間復用CPU的方法 ,并為創(chuàng)建的進程在設備分配功能中提供所必要設備。同時,Internet的飛
5、速發(fā)展使數(shù)據(jù)增長,這給數(shù)據(jù)增長帶來了很大的壓力。對數(shù)據(jù)的訪問性能、數(shù)據(jù)傳輸性能、數(shù)據(jù)管理性能和存儲擴展等方面都提出了比過去更高的要求。這需要一個既能滿足大容量信息存儲、能適應將來容量擴充要求的存儲器管理系統(tǒng),又可以大大提高傳輸速率,還可以完成信息高速處理的計算機體系架構。而隨著技術的發(fā)展,設備管理技術和磁盤調度技術成為提高數(shù)據(jù)處理和數(shù)據(jù)傳輸?shù)年P鍵因素。因此,研究海量管理系統(tǒng)中的分配管理技術和磁盤調度策略具有重要意義。本次課程設計就這些問題展開了一些有意義的研究工作。2. 需求分析 2.1. 目的 (1)通過本實驗可以加深理解有關進程控制塊(PCB) 、進程隊列的概念,體會并了解創(chuàng)建進程、切換進
6、程、阻塞進程、喚醒進程、結束進程、顯示進程的具體實施過程。 (2)完成設備管理功能的模擬,掌握包括通道和控制器的添加和刪除,設備的添加、刪除,設備的分配和回收 。 (3)通過設計一個磁盤調度模擬系統(tǒng),從而使磁盤調度算法更加形象化,容易使人理解,使磁盤調度的特點更簡單明了,能使使用者加深對先來先服務算法、最短尋道時間優(yōu)先算法、掃描算法以及循環(huán)掃描算法等磁盤調度算法的理解。2.2. 內(nèi)容 2.2.1. 進程調度 2.2.2.1.功能分析 (1)每個進程有一個進程控制塊(PCB)表示。進程控制塊包含如下信 息:進程名、進程編號、進程的大小和進程的臨接PCB的地址。 (2)每個進程的狀態(tài)可以是就緒(r
7、eady) 、執(zhí)行(running)和阻塞 (block)三種狀態(tài)之一。 (3)進程創(chuàng)建,由系統(tǒng)生成一個PCB結點,用進隊函數(shù)放入就緒隊列。 如果沒有正在執(zhí)行的進程,則將等待隊列中就緒進程調入執(zhí)行。 (4)進程切換,通過函數(shù)實現(xiàn)將運行隊列中的執(zhí)行進程調入就緒隊列, 將等待隊列中就緒進程調入執(zhí)行。 (5) 進程阻塞,通過函數(shù)實現(xiàn)將運行隊列中的執(zhí)行進程調入阻塞隊 列,將等待隊列中就緒進程調入執(zhí)行。 (6) 進程喚醒,通過函數(shù)實現(xiàn)將阻塞隊列中的阻塞進程調入就緒隊 列,將等待隊列中就緒進程調入執(zhí)行。 (7) 進程結束,通過函數(shù)實現(xiàn)將就緒隊列中的就緒進程搶占運行隊 列。 (8)進程顯示,根據(jù)隊列進程的存
8、儲特性,順序查找到每個進程并依 次輸出每個進程的名稱和大小。 (9) 所創(chuàng)建進程將會在設備分配功能中為其提供所需必要設備。 2.2.2.1.數(shù)據(jù)結構 進程控制塊(PCB) 2.2.2. 設備分配 2.2.2.1.功能分析 (1)設備管理子系統(tǒng)涉及到通道控制表(CHCT)、控制器控制表(COCT) 和設備控制表(DCT)來體現(xiàn)輸入輸出系統(tǒng)。 (2)實現(xiàn)上述設備、控制器以及通道的層次關系,同時能夠添加或刪 除新的設備、控制器或通道。 (3)通過鍵盤命令模擬進程執(zhí)行過程中提出的設備分配或釋放請求, 并為此請求分配或釋放設備。分配設備成功后可將進程狀態(tài)調整為阻塞,釋 放設備后變?yōu)榫途w狀態(tài)。 (4)分配
9、設備時應如果該設備已被其它進程占用,則設備分配失敗, 請求進程進入阻塞狀態(tài),同時等待該設備的釋放。如果設備空閑,進程占用 設備的同時還應提出申請控制器請求,直到與設備相關的通道都已申請成功 為止。 (5)設備、控制器或通道的釋放應引起對應節(jié)點的等待隊列中的第一 個阻塞進程被喚醒。如果被喚醒的進程還未完成申請操作,應繼續(xù)執(zhí)行上級 節(jié)點的申請操作。 2.2.2.2.數(shù)據(jù)結構 設備控制表(DCT) 控制器控制表(COCT) 通道控制表(CHCT) 2.2.3. 磁盤調度 系統(tǒng)主界面可以靈活選擇某種算法,算法包括:先來先服務算法(FCFS)、最短尋道時間優(yōu)先算法(SSTF)、掃描算法(SCAN)、循環(huán)
10、掃描算法(CSCAN)。 2.2.3.1先來先服務算法(FCFS)這是一種比較簡單的磁盤調度算法。它根據(jù)進程請求訪問磁盤的先后次序進行調度。此算法的優(yōu)點是公平、簡單,且每個進程的請求都能依次得到處理,不會出現(xiàn)某一進程的請求長期得不到滿足的情況。此算法由于未對尋道進行優(yōu)化,在對磁盤的訪問請求比較多的情況下,此算法將降低設備服務的吞吐量,致使平均尋道時間可能較長,但各進程得到服務的響應時間的變化幅度較小。 2.2.3.2 最短尋道時間優(yōu)先算法(SSTF)該算法選擇這樣的進程,其要求訪問的磁道與當前磁頭所在的磁道距離最近,以使每次的尋道時間最短,該算法可以得到比較好的吞吐量,但卻不能保證平均尋道時間
11、最短。其缺點是對用戶的服務請求的響應機會不是均等的,因而導致響應時間的變化幅度很大。在服務請求很多的情況下,對內(nèi)外邊緣磁道的請求將會無限期的被延遲,有些請求的響應時間將不可預期。 2.2.3.3 掃描算法(SCAN)掃描算法不僅考慮到欲訪問的磁道與當前磁道的距離,更優(yōu)先考慮的是磁頭的當前移動方向。例如,當磁頭正在自里向外移動時,掃描算法所選擇的下一個訪問對象應是其欲訪問的磁道既在當前磁道之外,又是距離最近的。這樣自里向外地訪問,直到再無更外的磁道需要訪問才將磁臂換向,自外向里移動。這時,同樣也是每次選擇這樣的進程來調度,即其要訪問的磁道,在當前磁道之內(nèi),從而避免了饑餓現(xiàn)象的出現(xiàn)。由于這種算法中
12、磁頭移動的規(guī)律頗似電梯的運行,故又稱為電梯調度算法。此算法基本上克服了最短尋道時間優(yōu)先算法的服務集中于中間磁道和響應時間變化比較大的缺點,而具有最短尋道時間優(yōu)先算法的優(yōu)點即吞吐量較大,平均響應時間較小,但由于是擺動式的掃描方法,兩側磁道被訪問的頻率仍低于中間磁道。 2.2.3.4 循環(huán)掃描算法(CSCAN)循環(huán)掃描算法是對掃描算法的改進。如果對磁道的訪問請求是均勻分布的,當磁頭到達磁盤的一端,并反向運動時落在磁頭之后的訪問請求相對較少。這是由于這些磁道剛被處理,而磁盤另一端的請求密度相當高,且這些訪問請求等待的時間較長,為了解決這種情況,循環(huán)掃描算法規(guī)定磁頭單向移動。例如,只自里向外移動,當磁
13、頭移到最外的被訪問磁道時,磁頭立即返回到最里的欲訪磁道,即將最小磁道號緊接著最大磁道號構成循環(huán),進行掃描。3. 概要設計3.1. 進程調度 3.1.1. 功能模塊圖圖3.1 進程管理功能模塊圖 3.1.2. 相關函數(shù) void enqueue(int id,char *name,int size,struct PCB *head)-進程 進入隊列(就緒隊列、阻塞隊列) struct PCB *dequeue(struct PCB *head)-進程移出隊列 void createProcess()-創(chuàng)建進程 void switchProcess()-進程切換 void blockProcess
14、()-阻塞進程 void wakeupProcess()-喚醒進程 void terminateProcess()-結束進程 void displayProcessstatus()-顯示進程狀態(tài) 3.2. 設備分配 3.2.1. 功能模塊圖圖3.2 設備分配功能模塊圖 3.2.1. 相關函數(shù) struct DCT *findDCT(char name)-用設備名查找設備 struct COCT *findController(char name)-用控制器名查找控制器 struct CHCT *findChannel(char name)-用通道名查找通道 addProcesstoWaitin
15、g(*waiting,*p)-進入進程等待隊列 add(*head,*node)-入隊列 struct PCB *getFirst(*head)-獲得隊列里的第一個進程 allocateCHCT(*chct,*p)-分配CHCT allocateCOCT(*coct,*p)-分配COCT allocateDCT()-分配DCT releaseCHCT(*name,*chct,*p)-釋放通道 releaseCOCT(*name,*coct,*p)-釋放控制器 releaseDCT()-釋放設備 addChannel(char name)-增加通道 addController(*name,*ch
16、ct)-增加控制器 addDevice(*name,*coct)-增加設備 deleteDCT(char nameDCT)-刪除設備 deleteCOCT(char nameCOCT)-刪除控制器 deleteCHCT(char nameCHCT)-刪除通道 displayDCT()-顯示設備3.3. 磁盤調度 3.2.1. 功能模塊圖圖3.3 磁盤調度功能模塊圖 3.2.1. 相關函數(shù) Sort(int Array,int n)-冒泡排序算法,從小到大排序 Output(int Track,int Num)-輸出磁道請求順序 FCFS(int Track,int Num)-先來先服務調度算法
17、 SSTF(int Track,int Num)-最短尋道時間優(yōu)先調度算法 SCAN(int Track,int Num)-掃描調度算法 C_SCAN(int Track,int Num)-循環(huán)掃描調度算法4. 詳細設計4.1. 進程調度 4.1.1進程創(chuàng)建 (1)核心代碼void createProcess()printf("nname: ");scanf("%s",name); printf("size: ");scanf("%d",&size);printf("n"); enque
18、ue(id+,name,size,ready); /用進隊函數(shù)將進程放入就緒隊列 if(running=0) /如果沒有正在執(zhí)行的進程,則將等待隊列中就緒進程調入執(zhí)行 running=dequeue(ready); (2)測試結果圖4.1.1 進程管理主界面 圖4.1.2 進程創(chuàng)建前 圖4.1.3 進程創(chuàng)建后 4.1.2進程切換 (1)核心代碼 void switchProcess() if(running!=0&&ready->next!=0) enqueue(running->id,running->name,running->size,ready)
19、; /將正在執(zhí)行的進程放入就緒隊列 running=dequeue(ready); /將就緒隊列中第一個進程 調入執(zhí)行 elseprintf("沒有可切換的進程n");(2)測試結果 圖4.1.4 進程切換前 圖4.1.5 進程切換后圖4.1.6 沒有可切換的進程 4.1.3進程阻塞 (1)核心代碼 void blockProcess()if(running=0)printf("沒有可阻塞的進程n"); else enqueue(running->id,running->name,running->size,blocked); /將正在
20、執(zhí)行的進程掛入阻塞隊列 running=0; if(ready->next=0) printf("沒有可執(zhí)行的進程n"); else running=dequeue(ready); (2)測試結果 圖4.1.7 進程阻塞前 圖4.1.8進程阻塞后圖4.1.9 沒有可阻塞的進程4.1.4進程喚醒 (1)核心代碼 void wakeupProcess()if(blocked->next=0)printf("沒有可激活的進程");elseenqueue(blocked->next->id,blocked->next->nam
21、e,blocked->next->size,ready);dequeue(blocked);if(running=0)running=dequeue(ready);(2)測試結果 圖4.1.10 進程喚醒前 圖4.1.11 進程喚醒后圖4.1.12 沒有可喚醒的進程4.1.5進程結束(1)核心代碼void terminateProcess() if(running=0) printf("沒有需要結束的進程n");else running=dequeue(ready);(2)測試結果 圖4.1.13 進程結束前 圖4.1.14 進程結束后圖4.1.15 沒有可結束
22、的進程4.1.6進程顯示(1)核心代碼void displayProcessstatus()printf("-就緒狀態(tài)-n");if(ready->next=0)printf("當前沒有進程在該狀態(tài)n");if(ready->next!=0)q=ready->next;while(ready->next!=0)printf("%s",ready->next->name);printf(" %dn",ready->next->size);ready->next=r
23、eady->next->next;ready->next=q;printf("-執(zhí)行狀態(tài)-n");if(running=0) printf("當前沒有進程在該狀態(tài)n");if(running!=0)printf("%s",running->name);printf(" %dn",running->size);printf("-阻塞狀態(tài)-n");if(blocked->next=0) printf("當前沒有進程在該狀態(tài)nn");if(blo
24、cked->next!=0)p=blocked->next;while(blocked->next!=0)printf("%s",blocked->next->name);printf(" %dn",blocked->next->size);blocked->next = blocked->next->next;blocked->next=p;(2)測試結果 圖4.1.16 進程顯示結果4.2. 設備分配 4.2.1. 設備分配 (1)核心代碼void allocateCHCT(struc
25、t CHCT *chct,struct PCB *p)/分配CHCT if(chct->occupied!=0) /如果通道被占用 printf("不能分配通道n"); addProcesstoWaiting(chct->waiting,p);/添加進程到通道等待隊列else chct->occupied=p;printf("分配成功!n"); add(blocked,p);if(ready!=0)running=dequeue(ready);elserunning=0;/分配COCT void allocateCOCT(struct
26、COCT *coct,struct PCB *p) if(coct->occupied!=0) printf("不能分配控制器n"); addProcesstoWaiting(coct->waiting,p); add(blocked,p); if(ready!=0) running=dequeue(ready); elserunning=0; return;else coct->occupied=p; allocateCHCT(coct->chct,p); /已分配控制器請求分配通道 /分配DCT void allocateDCT() char n
27、ameDCT10;printf("請輸入設備名稱:");scanf("%s",nameDCT);struct DCT * dct=findDCT(nameDCT); struct PCB * p = running;if(dct!=NULL&&p!=NULL)if(dct->occupied!=0)printf("不能分配設備n");addProcesstoWaiting(dct->waiting,p);add(blocked,p);if(ready!=0)running=dequeue(ready);el
28、serunning=0;return;elsedct->occupied=p;allocateCOCT(dct->coct,p); /設備分配成功請求分配控制器 else printf("發(fā)生錯誤!n"); (2)測試結果圖4.2.1 設備管理主界面請求設備順序為:process1->input1(成功) process2->printer2(失?。涸O備、控制器成功,通道被占用。進程阻 塞,掛入通道等待隊列) process3->input1(失?。涸O備input1被占用) 圖4.2.2 設備分配前 圖4.2.3 設備分配后 4.2.2. 設備
29、釋放 (1)核心代碼void releaseCHCT(char *name,struct CHCT *chct,struct PCB *p)/釋放通道if(p!=NULL)addProcesstoWaiting(chct->waiting,p);if(strcmp(name,chct->occupied->name)=0)if(chct->waiting->next!=NULL)chct->occupied = dequeue(chct->waiting);elsechct->occupied = NULL;void releaseCOCT(ch
30、ar *name,struct COCT *coct,struct PCB *p)/釋放控制器if(p!=NULL)addProcesstoWaiting(coct->waiting,p);if(strcmp(name,coct->occupied->name)=0)if(coct->waiting->next!=NULL)coct->occupied = dequeue(coct->waiting);elsecoct->occupied = NULL;releaseCHCT(name,coct->chct,coct->occupie
31、d); /控制器已釋放,請求釋放通道 void releaseDCT()/釋放設備char nameDCT10;printf("請輸入要釋放的設備名稱:n");scanf("%s",nameDCT);char nameP10;printf("請輸入要釋放的進程名稱:n");scanf("%s",nameP);struct DCT *temp = findDCT(nameDCT);if(strcmp(temp->occupied->name,nameP)=0)if(temp->waiting->
32、;next!=NULL)temp->occupied = dequeue(temp->waiting);elsetemp->occupied = NULL;releaseCOCT(nameP,temp->coct,temp->occupied); /設備釋放成功,請求釋放控制器 elseprintf("沒有對應的設備和進程!"); (2)測試結果釋放:input1->process1(成功:同時通道等待隊列中的process2設備分 配成功,process3的設備和控制器分配成 功,掛入通道等待隊列) 圖4.2.4 input1釋放前 圖
33、4.2.5 input1釋放后 4.2.3. 設備添加 (1)核心代碼 void addChannel(char name)/增加通道 struct CHCT *temp=(struct CHCT *)malloc(sizeof(struct CHCT); strcpy(temp->name,name); temp->next=0; temp->busy=0; struct PCB *newnode=(struct PCB *)malloc(sizeof(struct PCB); temp->waiting=newnode; temp->waiting->n
34、ext = NULL; temp->occupied=0; struct CHCT * head=chcts; /進入了chcts隊列 while(head->next!=0) head=head->next; head->next=temp;void addController(char *name,struct CHCT *chct)/增加控制器 struct COCT *temp=(struct COCT *)malloc(sizeof(struct COCT); strcpy(temp->name,name); temp->next=0; temp-
35、>busy=0; struct PCB *newnode=(struct PCB *)malloc(sizeof(struct PCB); temp->waiting=newnode; temp->waiting->next = NULL; temp->occupied=0; temp->chct= chct; struct COCT *head=cocts; /進入了cocts隊列 while(head->next!=0) head=head->next; head->next=temp; void addDevice(char *nam
36、e,struct COCT *coct)/增加設備 struct DCT *temp=(struct DCT *)malloc(sizeof(struct DCT);strcpy(temp->name,name);temp->next=0;temp->busy=0;struct PCB *newnode=(struct PCB *)malloc(sizeof(struct PCB); temp->waiting=newnode;temp->waiting->next = NULL;temp->occupied=0;temp->coct= coct
37、;struct DCT *head=dcts;while(head->next!=0)head=head->next;head->next=temp; (2)測試結果添加 通道:chct3添加控制器:coct4屬于通道chct3添加 設備:disk2屬于控制器coct4 圖4.2.6 添加前 圖4.2.7 添加后 4.2.4. 設備刪除 (1)核心代碼 void deleteDCT(char nameDCT)/刪除設備struct DCT *temp = findDCT(nameDCT);struct DCT *head = dcts;if(temp=NULL)printf(
38、"沒有對應的設備!n");return ;elsewhile(head->next!=0)if(strcmp(temp->name,head->next->name)=0)if(temp->occupied!=NULL)printf("此設備現(xiàn)在正在使用不能刪除n");else head->next=head->next->next;break;else head=head->next;void deleteCOCT(char nameCOCT)/刪除控制器struct COCT *temp=find
39、Controller(nameCOCT);struct COCT *head=cocts;if(temp=NULL)printf("沒有對應的控制器n");return;elsewhile(head->next!=0)if(strcmp(temp->name,head->next->name)=0)if(temp->occupied!=NULL)printf("此控制器現(xiàn)在正在使用不能刪除n");elsehead->next=head->next->next;break;head=head->next
40、;void deleteCHCT(char nameCHCT)/刪除通道struct CHCT *temp=findChannel(nameCHCT);struct CHCT *head=chcts;if(temp=NULL)printf("沒有對應的通道n");return;elsewhile(head->next!=0)if(strcmp(temp->name,head->next->name)=0)if(temp->occupied!=NULL)printf("此通道現(xiàn)在正在使用不能刪除n");else/deleteD
41、CT(temp->);head->next=head->next->next;/i+;break;head=head->next; (2)測試結果刪除設 備:input1刪除控制器:coct4 級聯(lián)刪除未被占用的設備disk2,若disk2被占用則不 能刪除刪除通 道:chct3 圖4.2.8 刪除前 圖4.2.9 刪除后 4.2.5. 設備顯示 (1)核心代碼 void displayDCT()struct DCT *dct;struct COCT *coct;struct CHCT *chct = chcts;struct PCB *pcb;/-顯示通道 wh
42、ile(chct->next!=NULL)chct = chct->next;printf(" %s(",chct->name);if(chct->occupied!=0)printf("%s",chct->occupied->name);printf(")");pcb = chct->waiting->next; /waiting是頭結點,pcb指向隊列第一個進程while(pcb!=NULL)printf("%s",pcb->name);pcb = pcb-
43、>next;printf("n");/-顯示控制器coct = cocts;while(coct->next!=NULL)coct = coct->next;if(strcmp(coct->chct->name,chct->name)=0)printf(" %s(",coct->name);if(coct->occupied!=0)printf("%s",coct->occupied->name);printf(")");pcb = coct->wa
44、iting->next;while(pcb!=NULL)printf("%s",pcb->name); pcb = pcb->next;printf("n");/-顯示設備dct = dcts;while(dct->next!=NULL)dct = dct->next;if(strcmp(dct->coct->name,coct->name)=0)printf(" %s(",dct->name);if(dct->occupied!=0)printf("%s"
45、;,dct->occupied->name);printf(")");pcb = dct->waiting->next;while(pcb!=NULL)printf("%s",pcb->name); pcb = pcb->next;printf("n"); (2)測試結果前文圖4.2.2圖4.2.9均為顯示結果 4.3. 磁盤調度 本系統(tǒng)劃分為四個模塊:先來先服務算法模塊void FCFS(int Track,int Num)、最短尋道時間優(yōu)先算法模塊void SSTF(int Track,int
46、Num)、掃描算法模塊void SCAN(int Track,int Num) 和循環(huán)掃描算法模塊:void C_SCAN(int Track,int Num)圖4.3.1 磁盤調度首頁 4.3.1. 先來先服務算法 輸入磁道號,按先來先服務的策略輸出磁盤請求序列,求平均尋道長度,輸出移 動平均磁道數(shù)。主要代碼:for(i=0;i<N;i+)if(Num<Tracki)temp=Tracki-Num;else temp=Num-Tracki;Num=Tracki;Sum+=temp;AverTime=(float)Sum/N;圖4.3.2 先來先服務算法執(zhí)行結果 4.3.2 最短尋
47、道時間優(yōu)先算法首先將隨機生成的磁盤請求序列與當前所在的磁道號進行比較,將所得之差用數(shù)組 Ttrack保存起來。然后在求出Ttrack數(shù)組中最小的數(shù)即為第一個訪問的磁道。再 將訪問過的磁道置-1。再次循環(huán),求出平均尋道長度,輸出移動的平均磁道數(shù)。 主要代碼:for(j=0;j<N;j+) for(i=0;i<N;i+)if(Ttracki=-1)continue;elseif(Num<Tracki) Ttracki=Tracki-Num;else Ttracki=Num-Tracki;min=200;minj=0;for(i=0;i<N;i+)if(Ttracki=-1)
48、 continue;elseif(Ttracki<min)min=Ttracki;minj=i;Num=Trackminj;DiskDcount+=Num; Sum=Sum+Ttrackminj;Ttrackminj=-1;AverTime=(float)Sum/N;圖4.3.3 最短尋道時間優(yōu)先算法執(zhí)行結果 4.3.3 掃描算法將磁道號用冒泡法將隨機生成的磁道請求序列從小到大排序,隨機生成的當前磁道 號,選擇移動臂的移動方向,根據(jù)當前磁道在已排的序列中的位置,選擇掃描的順序, 求出平均尋道長度,輸出移動的平均磁道數(shù)。主要代碼:Output(Track,Num);for(i=0;i<
49、;N;i+) tempi=Tracki; Sort(temp,N); /將訪問序列從小到大排序 while(tempk<Num) /找到Num在訪問序列所在的位置 k+; l=k-1; r=k; printf("請輸入移動臂移動方向 (1 表示比當前磁道號大的方向 ,0表示比當前磁道小的方向) : ");scanf("%d",&choose); if(choose=0)printf("磁道訪問的序列為:"); for(j=l;j>=0;j-) printf(" %d ",tempj); for(j=r;j<N;j+) printf(" %d ",tempj); Sum=Num-2*temp0+tempN-1; else printf("磁道訪問的序列為:"); for(j=r;j<N;j+) printf(" %d ",tempj); for(j=l;j>=0;j-) printf(" %d ",tempj); Sum=Num-temp0+2*tempN-1; AverTime=(float)Sum/N;圖4.3.4 掃描調度算法執(zhí)行結果 4.3.4 循
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 標準醫(yī)學病例匯報
- 香港公司出資協(xié)議書
- 路面問題賠償協(xié)議書
- 遺產(chǎn)自愿放棄協(xié)議書
- 金店夜班合同協(xié)議書
- 農(nóng)機合伙人合同協(xié)議書
- 飯店入伙合同協(xié)議書
- 轉讓壽司餐廳協(xié)議書
- 飯?zhí)糜啿秃贤瑓f(xié)議書
- 集體產(chǎn)權私下協(xié)議書
- GB/T 15211-2013安全防范報警設備環(huán)境適應性要求和試驗方法
- 【課件】第17課實驗與多元-20世紀以來的西方美術課件-高中美術人教版(2019)美術鑒賞
- FZ/T 20008-2015毛織物單位面積質量的測定
- 打起手鼓唱起歌二聲部改編簡譜
- 新版ECMO并發(fā)癥學習課件
- 2023版泌尿外科前列腺增生癥診療指南
- 一般行業(yè)主要負責人和安全管理人員考試復習題庫
- 計算機組裝與維護立體化教程ppt課件(完整版)
- 痛風性關節(jié)炎 課件
- 項目部管理人員名單
- 四川省廣安市中考數(shù)學真題含答案
評論
0/150
提交評論