




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、中北大學(xué)軟件學(xué)院實(shí)訓(xùn)說(shuō)明書(shū)中北大學(xué)軟件學(xué)院實(shí)訓(xùn)說(shuō)明書(shū)實(shí)訓(xùn)名稱(chēng): 操作系統(tǒng)課程設(shè)計(jì) 基于Linux的設(shè)備分配及磁盤(pán)調(diào)度算法題目名稱(chēng): 軟件工程專(zhuān) 業(yè): 班 級(jí): 12210A02 小組成員學(xué)號(hào): 1221010516 姓名: 高田田 成績(jī): 學(xué)號(hào): 1221010543 姓名: 王 浩 成績(jī): 學(xué)號(hào): 1221010618 姓名: 許嘉陽(yáng) 成績(jī): 學(xué)號(hào): 1221010707 姓名: 王晉英 成績(jī): 薛海麗指導(dǎo)教師: 2015 年 1 月任務(wù)分工情況說(shuō)明姓名分工組長(zhǎng)高田田 負(fù)責(zé)小組分工,資料查詢(xún),參與整體需求分析及概要設(shè)計(jì),完成設(shè)備分配部分的詳細(xì)設(shè)計(jì)及代碼。完成代碼整合及主函數(shù)的編寫(xiě)。完成小組說(shuō)
2、明書(shū)文檔整理工作。組員王浩 資料查詢(xún), 參與整體需求分析及概要設(shè)計(jì),完成磁盤(pán)調(diào)度中先來(lái)先服務(wù)(FCFS)和循環(huán)掃描調(diào)度算法(CSCAN)部分的詳細(xì)設(shè)計(jì)及代碼,協(xié)助完成設(shè)備分配。組員許嘉陽(yáng) 資料查詢(xún), 參與整體需求分析及概要設(shè)計(jì),完成磁盤(pán)調(diào)度中最短尋道時(shí)間優(yōu)先算法(SSTF)和掃描調(diào)度算法(SCAN)部分的詳細(xì)設(shè)計(jì)及代碼代碼,協(xié)助完成設(shè)備分配。組員王晉英 資料查詢(xún), 參與整體需求分析及概要設(shè)計(jì),完成進(jìn)程控制部分的詳細(xì)設(shè)計(jì)及代碼編寫(xiě)。第 0 頁(yè) 共 1 頁(yè)目錄1. 緒論12. 需求分析12.1. 目的12.2. 內(nèi)容22.2.1. 進(jìn)程調(diào)度22.2.2. 設(shè)備分配22.2.3. 磁盤(pán)調(diào)度33. 概
3、要設(shè)計(jì)43.1. 進(jìn)程調(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. 磁盤(pán)調(diào)度73.2.1. 功能模塊圖73.2.1. 相關(guān)函數(shù)74. 詳細(xì)設(shè)計(jì)74.1. 進(jìn)程調(diào)度74.1.1進(jìn)程創(chuàng)建74.1.2進(jìn)程切換94.1.3進(jìn)程阻塞104.1.4進(jìn)程喚醒104.1.5進(jìn)程結(jié)束114.1.6進(jìn)程顯示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. 磁盤(pán)調(diào)度264.3.1. 先來(lái)先服務(wù)算法264.3.2
4、最短尋道時(shí)間優(yōu)先算法274.3.3 掃描算法28 4.3.4 循環(huán)掃描算法30 4.3.5 調(diào)用四種算法比較315. 心得體會(huì)326. 參考文獻(xiàn)337. 源代碼34I1. 緒論隨著信息技術(shù)的發(fā)展, ,Linux操作系統(tǒng)得到了前所未有的廣泛應(yīng)用。Linux被應(yīng)用到包括便攜式電子設(shè)備、生物科技以及航天科技等各種領(lǐng)域。顯然不同應(yīng)用領(lǐng)域?qū)inux系統(tǒng)的實(shí)時(shí)性、公平性和吞吐量等性能有著不同的要求,而進(jìn)程調(diào)度算法對(duì)Linux系統(tǒng)性能起著至關(guān)重要的作用,用來(lái)創(chuàng)建進(jìn)程,撤銷(xiāo)進(jìn)程,實(shí)現(xiàn)進(jìn)程轉(zhuǎn)換,它提供了可運(yùn)行得進(jìn)程之間復(fù)用CPU的方法 ,并為創(chuàng)建的進(jìn)程在設(shè)備分配功能中提供所必要設(shè)備。同時(shí),Internet的飛
5、速發(fā)展使數(shù)據(jù)增長(zhǎng),這給數(shù)據(jù)增長(zhǎng)帶來(lái)了很大的壓力。對(duì)數(shù)據(jù)的訪問(wèn)性能、數(shù)據(jù)傳輸性能、數(shù)據(jù)管理性能和存儲(chǔ)擴(kuò)展等方面都提出了比過(guò)去更高的要求。這需要一個(gè)既能滿足大容量信息存儲(chǔ)、能適應(yīng)將來(lái)容量擴(kuò)充要求的存儲(chǔ)器管理系統(tǒng),又可以大大提高傳輸速率,還可以完成信息高速處理的計(jì)算機(jī)體系架構(gòu)。而隨著技術(shù)的發(fā)展,設(shè)備管理技術(shù)和磁盤(pán)調(diào)度技術(shù)成為提高數(shù)據(jù)處理和數(shù)據(jù)傳輸?shù)年P(guān)鍵因素。因此,研究海量管理系統(tǒng)中的分配管理技術(shù)和磁盤(pán)調(diào)度策略具有重要意義。本次課程設(shè)計(jì)就這些問(wèn)題展開(kāi)了一些有意義的研究工作。2. 需求分析 2.1. 目的 (1)通過(guò)本實(shí)驗(yàn)可以加深理解有關(guān)進(jìn)程控制塊(PCB) 、進(jìn)程隊(duì)列的概念,體會(huì)并了解創(chuàng)建進(jìn)程、切換進(jìn)
6、程、阻塞進(jìn)程、喚醒進(jìn)程、結(jié)束進(jìn)程、顯示進(jìn)程的具體實(shí)施過(guò)程。 (2)完成設(shè)備管理功能的模擬,掌握包括通道和控制器的添加和刪除,設(shè)備的添加、刪除,設(shè)備的分配和回收 。 (3)通過(guò)設(shè)計(jì)一個(gè)磁盤(pán)調(diào)度模擬系統(tǒng),從而使磁盤(pán)調(diào)度算法更加形象化,容易使人理解,使磁盤(pán)調(diào)度的特點(diǎn)更簡(jiǎn)單明了,能使使用者加深對(duì)先來(lái)先服務(wù)算法、最短尋道時(shí)間優(yōu)先算法、掃描算法以及循環(huán)掃描算法等磁盤(pán)調(diào)度算法的理解。2.2. 內(nèi)容 2.2.1. 進(jìn)程調(diào)度 2.2.2.1.功能分析 (1)每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊包含如下信 息:進(jìn)程名、進(jìn)程編號(hào)、進(jìn)程的大小和進(jìn)程的臨接PCB的地址。 (2)每個(gè)進(jìn)程的狀態(tài)可以是就緒(r
7、eady) 、執(zhí)行(running)和阻塞 (block)三種狀態(tài)之一。 (3)進(jìn)程創(chuàng)建,由系統(tǒng)生成一個(gè)PCB結(jié)點(diǎn),用進(jìn)隊(duì)函數(shù)放入就緒隊(duì)列。 如果沒(méi)有正在執(zhí)行的進(jìn)程,則將等待隊(duì)列中就緒進(jìn)程調(diào)入執(zhí)行。 (4)進(jìn)程切換,通過(guò)函數(shù)實(shí)現(xiàn)將運(yùn)行隊(duì)列中的執(zhí)行進(jìn)程調(diào)入就緒隊(duì)列, 將等待隊(duì)列中就緒進(jìn)程調(diào)入執(zhí)行。 (5) 進(jìn)程阻塞,通過(guò)函數(shù)實(shí)現(xiàn)將運(yùn)行隊(duì)列中的執(zhí)行進(jìn)程調(diào)入阻塞隊(duì) 列,將等待隊(duì)列中就緒進(jìn)程調(diào)入執(zhí)行。 (6) 進(jìn)程喚醒,通過(guò)函數(shù)實(shí)現(xiàn)將阻塞隊(duì)列中的阻塞進(jìn)程調(diào)入就緒隊(duì) 列,將等待隊(duì)列中就緒進(jìn)程調(diào)入執(zhí)行。 (7) 進(jìn)程結(jié)束,通過(guò)函數(shù)實(shí)現(xiàn)將就緒隊(duì)列中的就緒進(jìn)程搶占運(yùn)行隊(duì) 列。 (8)進(jìn)程顯示,根據(jù)隊(duì)列進(jìn)程的存
8、儲(chǔ)特性,順序查找到每個(gè)進(jìn)程并依 次輸出每個(gè)進(jìn)程的名稱(chēng)和大小。 (9) 所創(chuàng)建進(jìn)程將會(huì)在設(shè)備分配功能中為其提供所需必要設(shè)備。 2.2.2.1.數(shù)據(jù)結(jié)構(gòu) 進(jìn)程控制塊(PCB) 2.2.2. 設(shè)備分配 2.2.2.1.功能分析 (1)設(shè)備管理子系統(tǒng)涉及到通道控制表(CHCT)、控制器控制表(COCT) 和設(shè)備控制表(DCT)來(lái)體現(xiàn)輸入輸出系統(tǒng)。 (2)實(shí)現(xiàn)上述設(shè)備、控制器以及通道的層次關(guān)系,同時(shí)能夠添加或刪 除新的設(shè)備、控制器或通道。 (3)通過(guò)鍵盤(pán)命令模擬進(jìn)程執(zhí)行過(guò)程中提出的設(shè)備分配或釋放請(qǐng)求, 并為此請(qǐng)求分配或釋放設(shè)備。分配設(shè)備成功后可將進(jìn)程狀態(tài)調(diào)整為阻塞,釋 放設(shè)備后變?yōu)榫途w狀態(tài)。 (4)分配
9、設(shè)備時(shí)應(yīng)如果該設(shè)備已被其它進(jìn)程占用,則設(shè)備分配失敗, 請(qǐng)求進(jìn)程進(jìn)入阻塞狀態(tài),同時(shí)等待該設(shè)備的釋放。如果設(shè)備空閑,進(jìn)程占用 設(shè)備的同時(shí)還應(yīng)提出申請(qǐng)控制器請(qǐng)求,直到與設(shè)備相關(guān)的通道都已申請(qǐng)成功 為止。 (5)設(shè)備、控制器或通道的釋放應(yīng)引起對(duì)應(yīng)節(jié)點(diǎn)的等待隊(duì)列中的第一 個(gè)阻塞進(jìn)程被喚醒。如果被喚醒的進(jìn)程還未完成申請(qǐng)操作,應(yīng)繼續(xù)執(zhí)行上級(jí) 節(jié)點(diǎn)的申請(qǐng)操作。 2.2.2.2.數(shù)據(jù)結(jié)構(gòu) 設(shè)備控制表(DCT) 控制器控制表(COCT) 通道控制表(CHCT) 2.2.3. 磁盤(pán)調(diào)度 系統(tǒng)主界面可以靈活選擇某種算法,算法包括:先來(lái)先服務(wù)算法(FCFS)、最短尋道時(shí)間優(yōu)先算法(SSTF)、掃描算法(SCAN)、循環(huán)
10、掃描算法(CSCAN)。 2.2.3.1先來(lái)先服務(wù)算法(FCFS)這是一種比較簡(jiǎn)單的磁盤(pán)調(diào)度算法。它根據(jù)進(jìn)程請(qǐng)求訪問(wèn)磁盤(pán)的先后次序進(jìn)行調(diào)度。此算法的優(yōu)點(diǎn)是公平、簡(jiǎn)單,且每個(gè)進(jìn)程的請(qǐng)求都能依次得到處理,不會(huì)出現(xiàn)某一進(jìn)程的請(qǐng)求長(zhǎng)期得不到滿足的情況。此算法由于未對(duì)尋道進(jìn)行優(yōu)化,在對(duì)磁盤(pán)的訪問(wèn)請(qǐng)求比較多的情況下,此算法將降低設(shè)備服務(wù)的吞吐量,致使平均尋道時(shí)間可能較長(zhǎng),但各進(jìn)程得到服務(wù)的響應(yīng)時(shí)間的變化幅度較小。 2.2.3.2 最短尋道時(shí)間優(yōu)先算法(SSTF)該算法選擇這樣的進(jìn)程,其要求訪問(wèn)的磁道與當(dāng)前磁頭所在的磁道距離最近,以使每次的尋道時(shí)間最短,該算法可以得到比較好的吞吐量,但卻不能保證平均尋道時(shí)間
11、最短。其缺點(diǎn)是對(duì)用戶的服務(wù)請(qǐng)求的響應(yīng)機(jī)會(huì)不是均等的,因而導(dǎo)致響應(yīng)時(shí)間的變化幅度很大。在服務(wù)請(qǐng)求很多的情況下,對(duì)內(nèi)外邊緣磁道的請(qǐng)求將會(huì)無(wú)限期的被延遲,有些請(qǐng)求的響應(yīng)時(shí)間將不可預(yù)期。 2.2.3.3 掃描算法(SCAN)掃描算法不僅考慮到欲訪問(wèn)的磁道與當(dāng)前磁道的距離,更優(yōu)先考慮的是磁頭的當(dāng)前移動(dòng)方向。例如,當(dāng)磁頭正在自里向外移動(dòng)時(shí),掃描算法所選擇的下一個(gè)訪問(wèn)對(duì)象應(yīng)是其欲訪問(wèn)的磁道既在當(dāng)前磁道之外,又是距離最近的。這樣自里向外地訪問(wèn),直到再無(wú)更外的磁道需要訪問(wèn)才將磁臂換向,自外向里移動(dòng)。這時(shí),同樣也是每次選擇這樣的進(jìn)程來(lái)調(diào)度,即其要訪問(wèn)的磁道,在當(dāng)前磁道之內(nèi),從而避免了饑餓現(xiàn)象的出現(xiàn)。由于這種算法中
12、磁頭移動(dòng)的規(guī)律頗似電梯的運(yùn)行,故又稱(chēng)為電梯調(diào)度算法。此算法基本上克服了最短尋道時(shí)間優(yōu)先算法的服務(wù)集中于中間磁道和響應(yīng)時(shí)間變化比較大的缺點(diǎn),而具有最短尋道時(shí)間優(yōu)先算法的優(yōu)點(diǎn)即吞吐量較大,平均響應(yīng)時(shí)間較小,但由于是擺動(dòng)式的掃描方法,兩側(cè)磁道被訪問(wèn)的頻率仍低于中間磁道。 2.2.3.4 循環(huán)掃描算法(CSCAN)循環(huán)掃描算法是對(duì)掃描算法的改進(jìn)。如果對(duì)磁道的訪問(wèn)請(qǐng)求是均勻分布的,當(dāng)磁頭到達(dá)磁盤(pán)的一端,并反向運(yùn)動(dòng)時(shí)落在磁頭之后的訪問(wèn)請(qǐng)求相對(duì)較少。這是由于這些磁道剛被處理,而磁盤(pán)另一端的請(qǐng)求密度相當(dāng)高,且這些訪問(wèn)請(qǐng)求等待的時(shí)間較長(zhǎng),為了解決這種情況,循環(huán)掃描算法規(guī)定磁頭單向移動(dòng)。例如,只自里向外移動(dòng),當(dāng)磁
13、頭移到最外的被訪問(wèn)磁道時(shí),磁頭立即返回到最里的欲訪磁道,即將最小磁道號(hào)緊接著最大磁道號(hào)構(gòu)成循環(huán),進(jìn)行掃描。3. 概要設(shè)計(jì)3.1. 進(jìn)程調(diào)度 3.1.1. 功能模塊圖圖3.1 進(jìn)程管理功能模塊圖 3.1.2. 相關(guān)函數(shù) void enqueue(int id,char *name,int size,struct PCB *head)-進(jìn)程 進(jìn)入隊(duì)列(就緒隊(duì)列、阻塞隊(duì)列) struct PCB *dequeue(struct PCB *head)-進(jìn)程移出隊(duì)列 void createProcess()-創(chuàng)建進(jìn)程 void switchProcess()-進(jìn)程切換 void blockProcess
14、()-阻塞進(jìn)程 void wakeupProcess()-喚醒進(jìn)程 void terminateProcess()-結(jié)束進(jìn)程 void displayProcessstatus()-顯示進(jìn)程狀態(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)-進(jìn)入進(jìn)程等待隊(duì)列 add(*head,*node)-入隊(duì)列 struct PCB *getFirst(*head)-獲得隊(duì)列里的第一個(gè)進(jìn)程 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. 磁盤(pán)調(diào)度 3.2.1. 功能模塊圖圖3.3 磁盤(pán)調(diào)度功能模塊圖 3.2.1. 相關(guān)函數(shù) Sort(int Array,int n)-冒泡排序算法,從小到大排序 Output(int Track,int Num)-輸出磁道請(qǐng)求順序 FCFS(int Track,int Num)-先來(lái)先服務(wù)調(diào)度算法
17、 SSTF(int Track,int Num)-最短尋道時(shí)間優(yōu)先調(diào)度算法 SCAN(int Track,int Num)-掃描調(diào)度算法 C_SCAN(int Track,int Num)-循環(huán)掃描調(diào)度算法4. 詳細(xì)設(shè)計(jì)4.1. 進(jìn)程調(diào)度 4.1.1進(jìn)程創(chuàng)建 (1)核心代碼void createProcess()printf("nname: ");scanf("%s",name); printf("size: ");scanf("%d",&size);printf("n"); enque
18、ue(id+,name,size,ready); /用進(jìn)隊(duì)函數(shù)將進(jìn)程放入就緒隊(duì)列 if(running=0) /如果沒(méi)有正在執(zhí)行的進(jìn)程,則將等待隊(duì)列中就緒進(jìn)程調(diào)入執(zhí)行 running=dequeue(ready); (2)測(cè)試結(jié)果圖4.1.1 進(jìn)程管理主界面 圖4.1.2 進(jìn)程創(chuàng)建前 圖4.1.3 進(jìn)程創(chuàng)建后 4.1.2進(jìn)程切換 (1)核心代碼 void switchProcess() if(running!=0&&ready->next!=0) enqueue(running->id,running->name,running->size,ready)
19、; /將正在執(zhí)行的進(jìn)程放入就緒隊(duì)列 running=dequeue(ready); /將就緒隊(duì)列中第一個(gè)進(jìn)程 調(diào)入執(zhí)行 elseprintf("沒(méi)有可切換的進(jìn)程n");(2)測(cè)試結(jié)果 圖4.1.4 進(jìn)程切換前 圖4.1.5 進(jìn)程切換后圖4.1.6 沒(méi)有可切換的進(jìn)程 4.1.3進(jìn)程阻塞 (1)核心代碼 void blockProcess()if(running=0)printf("沒(méi)有可阻塞的進(jìn)程n"); else enqueue(running->id,running->name,running->size,blocked); /將正在
20、執(zhí)行的進(jìn)程掛入阻塞隊(duì)列 running=0; if(ready->next=0) printf("沒(méi)有可執(zhí)行的進(jìn)程n"); else running=dequeue(ready); (2)測(cè)試結(jié)果 圖4.1.7 進(jìn)程阻塞前 圖4.1.8進(jìn)程阻塞后圖4.1.9 沒(méi)有可阻塞的進(jìn)程4.1.4進(jìn)程喚醒 (1)核心代碼 void wakeupProcess()if(blocked->next=0)printf("沒(méi)有可激活的進(jìn)程");elseenqueue(blocked->next->id,blocked->next->nam
21、e,blocked->next->size,ready);dequeue(blocked);if(running=0)running=dequeue(ready);(2)測(cè)試結(jié)果 圖4.1.10 進(jìn)程喚醒前 圖4.1.11 進(jìn)程喚醒后圖4.1.12 沒(méi)有可喚醒的進(jìn)程4.1.5進(jìn)程結(jié)束(1)核心代碼void terminateProcess() if(running=0) printf("沒(méi)有需要結(jié)束的進(jìn)程n");else running=dequeue(ready);(2)測(cè)試結(jié)果 圖4.1.13 進(jìn)程結(jié)束前 圖4.1.14 進(jìn)程結(jié)束后圖4.1.15 沒(méi)有可結(jié)束
22、的進(jìn)程4.1.6進(jìn)程顯示(1)核心代碼void displayProcessstatus()printf("-就緒狀態(tài)-n");if(ready->next=0)printf("當(dāng)前沒(méi)有進(jìn)程在該狀態(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)前沒(méi)有進(jìn)程在該狀態(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)前沒(méi)有進(jìn)程在該狀態(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)測(cè)試結(jié)果 圖4.1.16 進(jìn)程顯示結(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);/添加進(jìn)程到通道等待隊(duì)列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); /已分配控制器請(qǐng)求分配通道 /分配DCT void allocateDCT() char n
27、ameDCT10;printf("請(qǐng)輸入設(shè)備名稱(chēng):");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è)備分配成功請(qǐng)求分配控制器 else printf("發(fā)生錯(cuò)誤!n"); (2)測(cè)試結(jié)果圖4.2.1 設(shè)備管理主界面請(qǐng)求設(shè)備順序?yàn)椋簆rocess1->input1(成功) process2->printer2(失?。涸O(shè)備、控制器成功,通道被占用。進(jìn)程阻 塞,掛入通道等待隊(duì)列) process3->input1(失敗:設(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); /控制器已釋放,請(qǐng)求釋放通道 void releaseDCT()/釋放設(shè)備char nameDCT10;printf("請(qǐng)輸入要釋放的設(shè)備名稱(chēng):n");scanf("%s",nameDCT);char nameP10;printf("請(qǐng)輸入要釋放的進(jìn)程名稱(chēng):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è)備釋放成功,請(qǐng)求釋放控制器 elseprintf("沒(méi)有對(duì)應(yīng)的設(shè)備和進(jìn)程!"); (2)測(cè)試結(jié)果釋放:input1->process1(成功:同時(shí)通道等待隊(duì)列中的process2設(shè)備分 配成功,process3的設(shè)備和控制器分配成 功,掛入通道等待隊(duì)列) 圖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; /進(jìn)入了chcts隊(duì)列 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; /進(jìn)入了cocts隊(duì)列 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)測(cè)試結(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、"沒(méi)有對(duì)應(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("沒(méi)有對(duì)應(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("沒(méi)有對(duì)應(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)測(cè)試結(jié)果刪除設(shè) 備:input1刪除控制器:coct4 級(jí)聯(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é)點(diǎn),pcb指向隊(duì)列第一個(gè)進(jìn)程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)測(cè)試結(jié)果前文圖4.2.2圖4.2.9均為顯示結(jié)果 4.3. 磁盤(pán)調(diào)度 本系統(tǒng)劃分為四個(gè)模塊:先來(lái)先服務(wù)算法模塊void FCFS(int Track,int Num)、最短尋道時(shí)間優(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 磁盤(pán)調(diào)度首頁(yè) 4.3.1. 先來(lái)先服務(wù)算法 輸入磁道號(hào),按先來(lái)先服務(wù)的策略輸出磁盤(pán)請(qǐng)求序列,求平均尋道長(zhǎng)度,輸出移 動(dòng)平均磁道數(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 先來(lái)先服務(wù)算法執(zhí)行結(jié)果 4.3.2 最短尋
47、道時(shí)間優(yōu)先算法首先將隨機(jī)生成的磁盤(pán)請(qǐng)求序列與當(dāng)前所在的磁道號(hào)進(jìn)行比較,將所得之差用數(shù)組 Ttrack保存起來(lái)。然后在求出Ttrack數(shù)組中最小的數(shù)即為第一個(gè)訪問(wèn)的磁道。再 將訪問(wèn)過(guò)的磁道置-1。再次循環(huán),求出平均尋道長(zhǎng)度,輸出移動(dòng)的平均磁道數(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 最短尋道時(shí)間優(yōu)先算法執(zhí)行結(jié)果 4.3.3 掃描算法將磁道號(hào)用冒泡法將隨機(jī)生成的磁道請(qǐng)求序列從小到大排序,隨機(jī)生成的當(dāng)前磁道 號(hào),選擇移動(dòng)臂的移動(dòng)方向,根據(jù)當(dāng)前磁道在已排的序列中的位置,選擇掃描的順序, 求出平均尋道長(zhǎng)度,輸出移動(dòng)的平均磁道數(shù)。主要代碼:Output(Track,Num);for(i=0;i<
49、;N;i+) tempi=Tracki; Sort(temp,N); /將訪問(wèn)序列從小到大排序 while(tempk<Num) /找到Num在訪問(wèn)序列所在的位置 k+; l=k-1; r=k; printf("請(qǐng)輸入移動(dòng)臂移動(dòng)方向 (1 表示比當(dāng)前磁道號(hào)大的方向 ,0表示比當(dāng)前磁道小的方向) : ");scanf("%d",&choose); if(choose=0)printf("磁道訪問(wèn)的序列為:"); 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("磁道訪問(wèn)的序列為:"); 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60793-2-50:2025 CMV EN Optical fibres - Part 2-50: Product specifications - Sectional specification for class B single-mode fibres
- 2025年新興技術(shù)與產(chǎn)業(yè)發(fā)展研究考試卷及答案
- 2025年市場(chǎng)推廣與廣告策略考試卷及答案
- 2025年外貿(mào)英語(yǔ)專(zhuān)業(yè)考試題及答案
- 2025年電子商務(wù)專(zhuān)業(yè)考試試卷及答案
- 2025年法務(wù)會(huì)計(jì)考試試題及答案
- 2025年企業(yè)戰(zhàn)略管理職業(yè)考題及答案
- 丈夫保證協(xié)議書(shū)
- 七級(jí)地理試題及答案
- 烘焙店學(xué)徒合同協(xié)議書(shū)
- 2025年山東省濟(jì)南市萊蕪區(qū)中考一模地理試卷(原卷版+解析版)
- 2025春季學(xué)期國(guó)開(kāi)電大專(zhuān)科《政治學(xué)原理》一平臺(tái)在線形考(形考任務(wù)四)試題及答案
- SCI論文寫(xiě)作與投稿 第2版-課件 14-SCI論文投稿與發(fā)表
- 中國(guó)車(chē)路云一體化發(fā)展研究報(bào)告
- 2025年青桐鳴高三語(yǔ)文3月大聯(lián)考作文題目解析及相關(guān)范文:道理是直的道路是彎的
- 腫瘤免疫治療綜述
- 2025-2030年中國(guó)威士忌酒行業(yè)運(yùn)行動(dòng)態(tài)及前景趨勢(shì)預(yù)測(cè)報(bào)告
- 小學(xué)生記憶小竅門(mén)課件
- 婚姻家庭與法律知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋延邊大學(xué)
- 物業(yè)管理安全責(zé)任分配
- 《傷寒論》課件-少陽(yáng)病提綱、小柴胡湯證
評(píng)論
0/150
提交評(píng)論