




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、中北大學(xué)軟件學(xué)院實訓(xùn)說明書中北大學(xué)軟件學(xué)院實訓(xùn)說明書實訓(xùn)名稱: 操作系統(tǒng)課程設(shè)計 基于Linux的設(shè)備分配及磁盤調(diào)度算法題目名稱: 軟件工程專 業(yè): 班 級: 12210A02 小組成員學(xué)號: 1221010516 姓名: 高田田 成績: 學(xué)號: 1221010543 姓名: 王 浩 成績: 學(xué)號: 1221010618 姓名: 許嘉陽 成績: 學(xué)號: 1221010707 姓名: 王晉英 成績: 薛海麗指導(dǎo)教師: 2015 年 1 月任務(wù)分工情況說明姓名分工組長高田田 負責(zé)小組分工,資料查詢,參與整體需求分析及概要設(shè)計,完成設(shè)備分配部分的詳細設(shè)計及代碼。完成代碼整合及主函數(shù)的編寫。完成小組說
2、明書文檔整理工作。組員王浩 資料查詢, 參與整體需求分析及概要設(shè)計,完成磁盤調(diào)度中先來先服務(wù)(FCFS)和循環(huán)掃描調(diào)度算法(CSCAN)部分的詳細設(shè)計及代碼,協(xié)助完成設(shè)備分配。組員許嘉陽 資料查詢, 參與整體需求分析及概要設(shè)計,完成磁盤調(diào)度中最短尋道時間優(yōu)先算法(SSTF)和掃描調(diào)度算法(SCAN)部分的詳細設(shè)計及代碼代碼,協(xié)助完成設(shè)備分配。組員王晉英 資料查詢, 參與整體需求分析及概要設(shè)計,完成進程控制部分的詳細設(shè)計及代碼編寫。第 0 頁 共 1 頁目錄1. 緒論12. 需求分析12.1. 目的12.2. 內(nèi)容22.2.1. 進程調(diào)度22.2.2. 設(shè)備分配22.2.3. 磁盤調(diào)度33. 概
3、要設(shè)計43.1. 進程調(diào)度43.1.1. 功能模塊圖43.1.2. 相關(guān)函數(shù)53.2. 設(shè)備分配53.2.1. 功能模塊圖63.2.1. 相關(guān)函數(shù)63.3. 磁盤調(diào)度73.2.1. 功能模塊圖73.2.1. 相關(guān)函數(shù)74. 詳細設(shè)計74.1. 進程調(diào)度74.1.1進程創(chuàng)建74.1.2進程切換94.1.3進程阻塞104.1.4進程喚醒104.1.5進程結(jié)束114.1.6進程顯示124.2. 設(shè)備分配134.2.1. 設(shè)備分配134.2.2. 設(shè)備釋放164.2.3. 設(shè)備添加194.2.4. 設(shè)備刪除214.2.5. 設(shè)備顯示244.3. 磁盤調(diào)度264.3.1. 先來先服務(wù)算法264.3.2
4、最短尋道時間優(yōu)先算法274.3.3 掃描算法28 4.3.4 循環(huán)掃描算法30 4.3.5 調(diào)用四種算法比較315. 心得體會326. 參考文獻337. 源代碼34I1. 緒論隨著信息技術(shù)的發(fā)展, ,Linux操作系統(tǒng)得到了前所未有的廣泛應(yīng)用。Linux被應(yīng)用到包括便攜式電子設(shè)備、生物科技以及航天科技等各種領(lǐng)域。顯然不同應(yīng)用領(lǐng)域?qū)inux系統(tǒng)的實時性、公平性和吞吐量等性能有著不同的要求,而進程調(diào)度算法對Linux系統(tǒng)性能起著至關(guān)重要的作用,用來創(chuàng)建進程,撤銷進程,實現(xiàn)進程轉(zhuǎn)換,它提供了可運行得進程之間復(fù)用CPU的方法 ,并為創(chuàng)建的進程在設(shè)備分配功能中提供所必要設(shè)備。同時,Internet的飛
5、速發(fā)展使數(shù)據(jù)增長,這給數(shù)據(jù)增長帶來了很大的壓力。對數(shù)據(jù)的訪問性能、數(shù)據(jù)傳輸性能、數(shù)據(jù)管理性能和存儲擴展等方面都提出了比過去更高的要求。這需要一個既能滿足大容量信息存儲、能適應(yīng)將來容量擴充要求的存儲器管理系統(tǒng),又可以大大提高傳輸速率,還可以完成信息高速處理的計算機體系架構(gòu)。而隨著技術(shù)的發(fā)展,設(shè)備管理技術(shù)和磁盤調(diào)度技術(shù)成為提高數(shù)據(jù)處理和數(shù)據(jù)傳輸?shù)年P(guān)鍵因素。因此,研究海量管理系統(tǒng)中的分配管理技術(shù)和磁盤調(diào)度策略具有重要意義。本次課程設(shè)計就這些問題展開了一些有意義的研究工作。2. 需求分析 2.1. 目的 (1)通過本實驗可以加深理解有關(guān)進程控制塊(PCB) 、進程隊列的概念,體會并了解創(chuàng)建進程、切換進
6、程、阻塞進程、喚醒進程、結(jié)束進程、顯示進程的具體實施過程。 (2)完成設(shè)備管理功能的模擬,掌握包括通道和控制器的添加和刪除,設(shè)備的添加、刪除,設(shè)備的分配和回收 。 (3)通過設(shè)計一個磁盤調(diào)度模擬系統(tǒng),從而使磁盤調(diào)度算法更加形象化,容易使人理解,使磁盤調(diào)度的特點更簡單明了,能使使用者加深對先來先服務(wù)算法、最短尋道時間優(yōu)先算法、掃描算法以及循環(huán)掃描算法等磁盤調(diào)度算法的理解。2.2. 內(nèi)容 2.2.1. 進程調(diào)度 2.2.2.1.功能分析 (1)每個進程有一個進程控制塊(PCB)表示。進程控制塊包含如下信 息:進程名、進程編號、進程的大小和進程的臨接PCB的地址。 (2)每個進程的狀態(tài)可以是就緒(r
7、eady) 、執(zhí)行(running)和阻塞 (block)三種狀態(tài)之一。 (3)進程創(chuàng)建,由系統(tǒng)生成一個PCB結(jié)點,用進隊函數(shù)放入就緒隊列。 如果沒有正在執(zhí)行的進程,則將等待隊列中就緒進程調(diào)入執(zhí)行。 (4)進程切換,通過函數(shù)實現(xiàn)將運行隊列中的執(zhí)行進程調(diào)入就緒隊列, 將等待隊列中就緒進程調(diào)入執(zhí)行。 (5) 進程阻塞,通過函數(shù)實現(xiàn)將運行隊列中的執(zhí)行進程調(diào)入阻塞隊 列,將等待隊列中就緒進程調(diào)入執(zhí)行。 (6) 進程喚醒,通過函數(shù)實現(xiàn)將阻塞隊列中的阻塞進程調(diào)入就緒隊 列,將等待隊列中就緒進程調(diào)入執(zhí)行。 (7) 進程結(jié)束,通過函數(shù)實現(xiàn)將就緒隊列中的就緒進程搶占運行隊 列。 (8)進程顯示,根據(jù)隊列進程的存
8、儲特性,順序查找到每個進程并依 次輸出每個進程的名稱和大小。 (9) 所創(chuàng)建進程將會在設(shè)備分配功能中為其提供所需必要設(shè)備。 2.2.2.1.數(shù)據(jù)結(jié)構(gòu) 進程控制塊(PCB) 2.2.2. 設(shè)備分配 2.2.2.1.功能分析 (1)設(shè)備管理子系統(tǒng)涉及到通道控制表(CHCT)、控制器控制表(COCT) 和設(shè)備控制表(DCT)來體現(xiàn)輸入輸出系統(tǒng)。 (2)實現(xiàn)上述設(shè)備、控制器以及通道的層次關(guān)系,同時能夠添加或刪 除新的設(shè)備、控制器或通道。 (3)通過鍵盤命令模擬進程執(zhí)行過程中提出的設(shè)備分配或釋放請求, 并為此請求分配或釋放設(shè)備。分配設(shè)備成功后可將進程狀態(tài)調(diào)整為阻塞,釋 放設(shè)備后變?yōu)榫途w狀態(tài)。 (4)分配
9、設(shè)備時應(yīng)如果該設(shè)備已被其它進程占用,則設(shè)備分配失敗, 請求進程進入阻塞狀態(tài),同時等待該設(shè)備的釋放。如果設(shè)備空閑,進程占用 設(shè)備的同時還應(yīng)提出申請控制器請求,直到與設(shè)備相關(guān)的通道都已申請成功 為止。 (5)設(shè)備、控制器或通道的釋放應(yīng)引起對應(yīng)節(jié)點的等待隊列中的第一 個阻塞進程被喚醒。如果被喚醒的進程還未完成申請操作,應(yīng)繼續(xù)執(zhí)行上級 節(jié)點的申請操作。 2.2.2.2.數(shù)據(jù)結(jié)構(gòu) 設(shè)備控制表(DCT) 控制器控制表(COCT) 通道控制表(CHCT) 2.2.3. 磁盤調(diào)度 系統(tǒng)主界面可以靈活選擇某種算法,算法包括:先來先服務(wù)算法(FCFS)、最短尋道時間優(yōu)先算法(SSTF)、掃描算法(SCAN)、循環(huán)
10、掃描算法(CSCAN)。 2.2.3.1先來先服務(wù)算法(FCFS)這是一種比較簡單的磁盤調(diào)度算法。它根據(jù)進程請求訪問磁盤的先后次序進行調(diào)度。此算法的優(yōu)點是公平、簡單,且每個進程的請求都能依次得到處理,不會出現(xiàn)某一進程的請求長期得不到滿足的情況。此算法由于未對尋道進行優(yōu)化,在對磁盤的訪問請求比較多的情況下,此算法將降低設(shè)備服務(wù)的吞吐量,致使平均尋道時間可能較長,但各進程得到服務(wù)的響應(yīng)時間的變化幅度較小。 2.2.3.2 最短尋道時間優(yōu)先算法(SSTF)該算法選擇這樣的進程,其要求訪問的磁道與當(dāng)前磁頭所在的磁道距離最近,以使每次的尋道時間最短,該算法可以得到比較好的吞吐量,但卻不能保證平均尋道時間
11、最短。其缺點是對用戶的服務(wù)請求的響應(yīng)機會不是均等的,因而導(dǎo)致響應(yīng)時間的變化幅度很大。在服務(wù)請求很多的情況下,對內(nèi)外邊緣磁道的請求將會無限期的被延遲,有些請求的響應(yīng)時間將不可預(yù)期。 2.2.3.3 掃描算法(SCAN)掃描算法不僅考慮到欲訪問的磁道與當(dāng)前磁道的距離,更優(yōu)先考慮的是磁頭的當(dāng)前移動方向。例如,當(dāng)磁頭正在自里向外移動時,掃描算法所選擇的下一個訪問對象應(yīng)是其欲訪問的磁道既在當(dāng)前磁道之外,又是距離最近的。這樣自里向外地訪問,直到再無更外的磁道需要訪問才將磁臂換向,自外向里移動。這時,同樣也是每次選擇這樣的進程來調(diào)度,即其要訪問的磁道,在當(dāng)前磁道之內(nèi),從而避免了饑餓現(xiàn)象的出現(xiàn)。由于這種算法中
12、磁頭移動的規(guī)律頗似電梯的運行,故又稱為電梯調(diào)度算法。此算法基本上克服了最短尋道時間優(yōu)先算法的服務(wù)集中于中間磁道和響應(yīng)時間變化比較大的缺點,而具有最短尋道時間優(yōu)先算法的優(yōu)點即吞吐量較大,平均響應(yīng)時間較小,但由于是擺動式的掃描方法,兩側(cè)磁道被訪問的頻率仍低于中間磁道。 2.2.3.4 循環(huán)掃描算法(CSCAN)循環(huán)掃描算法是對掃描算法的改進。如果對磁道的訪問請求是均勻分布的,當(dāng)磁頭到達磁盤的一端,并反向運動時落在磁頭之后的訪問請求相對較少。這是由于這些磁道剛被處理,而磁盤另一端的請求密度相當(dāng)高,且這些訪問請求等待的時間較長,為了解決這種情況,循環(huán)掃描算法規(guī)定磁頭單向移動。例如,只自里向外移動,當(dāng)磁
13、頭移到最外的被訪問磁道時,磁頭立即返回到最里的欲訪磁道,即將最小磁道號緊接著最大磁道號構(gòu)成循環(huán),進行掃描。3. 概要設(shè)計3.1. 進程調(diào)度 3.1.1. 功能模塊圖圖3.1 進程管理功能模塊圖 3.1.2. 相關(guān)函數(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()-結(jié)束進程 void displayProcessstatus()-顯示進程狀態(tài) 3.2. 設(shè)備分配 3.2.1. 功能模塊圖圖3.2 設(shè)備分配功能模塊圖 3.2.1. 相關(guān)函數(shù) struct DCT *findDCT(char name)-用設(shè)備名查找設(shè)備 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()-釋放設(shè)備 addChannel(char name)-增加通道 addController(*name,*ch
16、ct)-增加控制器 addDevice(*name,*coct)-增加設(shè)備 deleteDCT(char nameDCT)-刪除設(shè)備 deleteCOCT(char nameCOCT)-刪除控制器 deleteCHCT(char nameCHCT)-刪除通道 displayDCT()-顯示設(shè)備3.3. 磁盤調(diào)度 3.2.1. 功能模塊圖圖3.3 磁盤調(diào)度功能模塊圖 3.2.1. 相關(guān)函數(shù) Sort(int Array,int n)-冒泡排序算法,從小到大排序 Output(int Track,int Num)-輸出磁道請求順序 FCFS(int Track,int Num)-先來先服務(wù)調(diào)度算法
17、 SSTF(int Track,int Num)-最短尋道時間優(yōu)先調(diào)度算法 SCAN(int Track,int Num)-掃描調(diào)度算法 C_SCAN(int Track,int Num)-循環(huán)掃描調(diào)度算法4. 詳細設(shè)計4.1. 進程調(diào)度 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í)行的進程,則將等待隊列中就緒進程調(diào)入執(zhí)行 running=dequeue(ready); (2)測試結(jié)果圖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); /將就緒隊列中第一個進程 調(diào)入執(zhí)行 elseprintf("沒有可切換的進程n");(2)測試結(jié)果 圖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)測試結(jié)果 圖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)測試結(jié)果 圖4.1.10 進程喚醒前 圖4.1.11 進程喚醒后圖4.1.12 沒有可喚醒的進程4.1.5進程結(jié)束(1)核心代碼void terminateProcess() if(running=0) printf("沒有需要結(jié)束的進程n");else running=dequeue(ready);(2)測試結(jié)果 圖4.1.13 進程結(jié)束前 圖4.1.14 進程結(jié)束后圖4.1.15 沒有可結(jié)束
22、的進程4.1.6進程顯示(1)核心代碼void displayProcessstatus()printf("-就緒狀態(tài)-n");if(ready->next=0)printf("當(dāng)前沒有進程在該狀態(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("當(dāng)前沒有進程在該狀態(tài)n");if(running!=0)printf("%s",running->name);printf(" %dn",running->size);printf("-阻塞狀態(tài)-n");if(blocked->next=0) printf("當(dāng)前沒有進程在該狀態(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)測試結(jié)果 圖4.1.16 進程顯示結(jié)果4.2. 設(shè)備分配 4.2.1. 設(shè)備分配 (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("請輸入設(shè)備名稱:");scanf("%s",nameDCT);struct DCT * dct=findDCT(nameDCT); struct PCB * p = running;if(dct!=NULL&&p!=NULL)if(dct->occupied!=0)printf("不能分配設(shè)備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); /設(shè)備分配成功請求分配控制器 else printf("發(fā)生錯誤!n"); (2)測試結(jié)果圖4.2.1 設(shè)備管理主界面請求設(shè)備順序為:process1->input1(成功) process2->printer2(失?。涸O(shè)備、控制器成功,通道被占用。進程阻 塞,掛入通道等待隊列) process3->input1(失?。涸O(shè)備input1被占用) 圖4.2.2 設(shè)備分配前 圖4.2.3 設(shè)備分配后 4.2.2. 設(shè)備
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()/釋放設(shè)備char nameDCT10;printf("請輸入要釋放的設(shè)備名稱: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); /設(shè)備釋放成功,請求釋放控制器 elseprintf("沒有對應(yīng)的設(shè)備和進程!"); (2)測試結(jié)果釋放:input1->process1(成功:同時通道等待隊列中的process2設(shè)備分 配成功,process3的設(shè)備和控制器分配成 功,掛入通道等待隊列) 圖4.2.4 input1釋放前 圖
33、4.2.5 input1釋放后 4.2.3. 設(shè)備添加 (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)/增加設(shè)備 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)測試結(jié)果添加 通道:chct3添加控制器:coct4屬于通道chct3添加 設(shè)備:disk2屬于控制器coct4 圖4.2.6 添加前 圖4.2.7 添加后 4.2.4. 設(shè)備刪除 (1)核心代碼 void deleteDCT(char nameDCT)/刪除設(shè)備struct DCT *temp = findDCT(nameDCT);struct DCT *head = dcts;if(temp=NULL)printf(
38、"沒有對應(yīng)的設(shè)備!n");return ;elsewhile(head->next!=0)if(strcmp(temp->name,head->next->name)=0)if(temp->occupied!=NULL)printf("此設(shè)備現(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("沒有對應(yīng)的控制器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("沒有對應(yīng)的通道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)測試結(jié)果刪除設(shè) 備:input1刪除控制器:coct4 級聯(lián)刪除未被占用的設(shè)備disk2,若disk2被占用則不 能刪除刪除通 道:chct3 圖4.2.8 刪除前 圖4.2.9 刪除后 4.2.5. 設(shè)備顯示 (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是頭結(jié)點,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");/-顯示設(shè)備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)測試結(jié)果前文圖4.2.2圖4.2.9均為顯示結(jié)果 4.3. 磁盤調(diào)度 本系統(tǒng)劃分為四個模塊:先來先服務(wù)算法模塊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 磁盤調(diào)度首頁 4.3.1. 先來先服務(wù)算法 輸入磁道號,按先來先服務(wù)的策略輸出磁盤請求序列,求平均尋道長度,輸出移 動平均磁道數(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 先來先服務(wù)算法執(zhí)行結(jié)果 4.3.2 最短尋
47、道時間優(yōu)先算法首先將隨機生成的磁盤請求序列與當(dāng)前所在的磁道號進行比較,將所得之差用數(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í)行結(jié)果 4.3.3 掃描算法將磁道號用冒泡法將隨機生成的磁道請求序列從小到大排序,隨機生成的當(dāng)前磁道 號,選擇移動臂的移動方向,根據(jù)當(dāng)前磁道在已排的序列中的位置,選擇掃描的順序, 求出平均尋道長度,輸出移動的平均磁道數(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 表示比當(dāng)前磁道號大的方向 ,0表示比當(dāng)前磁道小的方向) : ");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 掃描調(diào)度算法執(zhí)行結(jié)果 4.3.4 循
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車輛試用協(xié)議書范本
- 部分合同提前終止協(xié)議
- 辭職后合同上寫著保密協(xié)議
- 建筑工程合同價格形式分為幾種
- POS機收單業(yè)務(wù)服務(wù)合同
- 辣椒成品收購合同協(xié)議
- 車輛抵質(zhì)押合同協(xié)議
- 投標合同管理規(guī)定要點培訓(xùn)
- 兩方自愿和平離婚協(xié)議書
- 通知乙方解除合同協(xié)議
- The three wishes課外閱讀故事(說課稿)-2022-2023學(xué)年英語五年級上冊
- SHL7.0-1.09570-AⅡ熱水鍋爐設(shè)計-畢業(yè)論文
- 2023學(xué)年完整公開課版《老師領(lǐng)進門》
- 《伊利乳業(yè)集團企業(yè)內(nèi)部審計存在的問題及優(yōu)化對策分析案例(論文)10000字》
- DB65T 2283-2005新疆平原楊樹人工林二元立木材積表
- 生產(chǎn)過程時間組織教材
- 2023年副主任醫(yī)師(副高)-急診醫(yī)學(xué)(副高)考試歷年高頻考點真題附帶含答案
- 三晶8000B系列變頻器說明書
- 2022屆黑龍江省龍東地區(qū)中考二?;瘜W(xué)試題
- 2023年全國職業(yè)院校技能大賽競賽英語口語項目方案申報書
- GB/T 33083-2016大型碳素結(jié)構(gòu)鋼鍛件技術(shù)條件
評論
0/150
提交評論