版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)原理及應(yīng)用課程設(shè)計(jì)報(bào)告進(jìn)程調(diào)度算法模擬 學(xué)院(系): 計(jì)算機(jī)科學(xué)與工程學(xué)院 班 級(jí): 學(xué)號(hào) 學(xué)生姓名: 許鴻興 同組人員: 許鴻興 時(shí)間: 從 2016年 12 月27日 到 2017 年01月03日目錄1、課程設(shè)計(jì)的目的12、課程設(shè)計(jì)的內(nèi)容及要求13、設(shè)計(jì)原理14、設(shè)計(jì)說(shuō)明25、具體實(shí)現(xiàn)56、軟件運(yùn)行環(huán)境及限制97、結(jié)果輸出及分析98、心得體會(huì)129、參考文獻(xiàn)1310、源程序131、課程設(shè)計(jì)的目的本課程設(shè)計(jì)是學(xué)生學(xué)習(xí)完操作系統(tǒng)原理及應(yīng)用課程后,進(jìn)行的一次全面的綜合訓(xùn)練,通過(guò)課程設(shè)計(jì),讓學(xué)生更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對(duì)操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強(qiáng)學(xué)生的動(dòng)手能力。
2、2、課程設(shè)計(jì)的內(nèi)容及要求進(jìn)程調(diào)度算法模擬:先來(lái)先服務(wù)、短作業(yè)優(yōu)先、時(shí)間片輪轉(zhuǎn)、基于靜態(tài)優(yōu)先級(jí)的調(diào)度、基于高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度算法實(shí)現(xiàn)。能夠輸出調(diào)度情況,并計(jì)算周轉(zhuǎn)時(shí)間和平均周轉(zhuǎn)時(shí)間。要求使用鏈表,進(jìn)程個(gè)數(shù)由用戶提供,按照進(jìn)程的實(shí)際個(gè)數(shù)生成PCB,程序能夠讓用戶選擇使用哪種調(diào)度算法,能夠在Linux環(huán)境運(yùn)行并驗(yàn)證結(jié)果。程序要考慮用戶界面的友好性和使用方便性。進(jìn)程基本信息可從文件讀入,也可手動(dòng)輸入。3、設(shè)計(jì)原理(1)先來(lái)先服務(wù)調(diào)度算法(FCFS)。當(dāng)在作業(yè)調(diào)度中采用FCFS算法時(shí),系統(tǒng)將按照作業(yè)到達(dá)的先后次序來(lái)進(jìn)行調(diào)度。即相當(dāng)于只考慮作業(yè)的等待時(shí)間,而忽視了作業(yè)的運(yùn)行時(shí)間,從后備作業(yè)隊(duì)列中
3、選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,為之分配處理機(jī),使之投入運(yùn)行,該進(jìn)程一直運(yùn)行到完成或者發(fā)生某件事而阻塞后,進(jìn)程調(diào)度程序才就愛那個(gè)處理機(jī)分配給其他進(jìn)程。(2)短作業(yè)優(yōu)先調(diào)度算法(SJF)。SJF算法是以作業(yè)的長(zhǎng)短來(lái)計(jì)算優(yōu)先級(jí),作業(yè)越短,優(yōu)先級(jí)越高。作業(yè)的長(zhǎng)短是以作業(yè)的運(yùn)行時(shí)間來(lái)衡量的。SJF算法可以分別用于作業(yè)調(diào)度和進(jìn)程調(diào)度。在把段作業(yè)優(yōu)先算法用于作業(yè)調(diào)度時(shí),它將從外村的作業(yè)后備隊(duì)列中選擇若干個(gè)估計(jì)運(yùn)行時(shí)間按最短的作業(yè),優(yōu)先將它們調(diào)入內(nèi)存運(yùn)行。(3)時(shí)間片輪轉(zhuǎn)調(diào)度算法(RR)。RR算法采取了非常公平的處理機(jī)分配方式,即讓就緒隊(duì)列上的每一個(gè)進(jìn)程每次僅運(yùn)行一個(gè)時(shí)間片。如果就緒隊(duì)列上有n個(gè)進(jìn)程,則每次大
4、約都可獲得1/n的處理機(jī)時(shí)間。在RR算法中,有兩種情況發(fā)生進(jìn)程的切換:若一個(gè)時(shí)間片尚未用完,正在運(yùn)行的進(jìn)程便已經(jīng)完成,就立即激活調(diào)度程序,將它從就緒隊(duì)列中刪除,在調(diào)度就緒隊(duì)列中的進(jìn)程運(yùn)行,并啟動(dòng)一個(gè)新的時(shí)間片。在一個(gè)時(shí)間片用完時(shí),計(jì)時(shí)器中斷處理程序被激活。如果進(jìn)程尚未運(yùn)行完畢,調(diào)度程序?qū)阉屯途w隊(duì)列。在RR算法中,時(shí)間片的大小對(duì)系統(tǒng)性能的影響很大。一個(gè)較為可取的時(shí)間片大小是略大于一次典型的交互所需的時(shí)間,是大多數(shù)交互式進(jìn)程能在一個(gè)時(shí)間片內(nèi)完成,從而可以獲得很小的響應(yīng)時(shí)間。(4)基于靜態(tài)優(yōu)先級(jí)的調(diào)度算法(PSA)。PSA算法是基于作業(yè)的緊迫程度,由外部賦予作業(yè)相應(yīng)的優(yōu)先級(jí)。調(diào)度算法是基于該優(yōu)
5、先級(jí)進(jìn)行調(diào)度的。這樣就可以保證緊迫性作業(yè)優(yōu)先運(yùn)行。PSA算法可作為作業(yè)調(diào)度算法,也可作為進(jìn)程調(diào)度算法。當(dāng)該算法用于作業(yè)調(diào)度時(shí),系統(tǒng)是從后備隊(duì)列中選擇若干個(gè)優(yōu)先級(jí)最高的作業(yè)裝入內(nèi)存。(5)基于高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度算法(HRRN)。為每個(gè)作業(yè)引入一個(gè)動(dòng)態(tài)優(yōu)先級(jí),即優(yōu)先級(jí)是可以改變的,令它隨等待時(shí)間的延長(zhǎng)而增加,這將使長(zhǎng)作業(yè)的優(yōu)先級(jí)在等待期間不斷地增加,等到足夠的時(shí)間后,必然會(huì)獲得處理機(jī)。由于等待時(shí)間與服務(wù)時(shí)間之和就是系統(tǒng)對(duì)該作業(yè)的響應(yīng)時(shí)間,故優(yōu)先級(jí)的變化規(guī)律為:優(yōu)先權(quán)=(等待時(shí)間+要求服務(wù)時(shí)間)/要求服務(wù)時(shí)間=響應(yīng)時(shí)間/要求服務(wù)時(shí)間。由上式可以看出:如果作業(yè)的等待時(shí)間相等,則要求服務(wù)時(shí)間越
6、短,其優(yōu)先權(quán)越高,因而類似SJF算法,有利于短作業(yè)。當(dāng)要求服務(wù)的時(shí)間相同時(shí),作業(yè)的優(yōu)先權(quán)又決定于其等待時(shí)間,因而類似FCFS算法。對(duì)于長(zhǎng)作業(yè)的優(yōu)先權(quán),可以隨等待時(shí)間的增加而增高,當(dāng)其等待時(shí)間足夠長(zhǎng)時(shí),也可獲得處理機(jī)。因此該算法實(shí)現(xiàn)了較好的折中。但在使用該算法時(shí),每次進(jìn)行調(diào)度之前,都需要先做響應(yīng)比的計(jì)算,會(huì)增加系統(tǒng)的開銷。4、設(shè)計(jì)說(shuō)明(1)系統(tǒng)整體結(jié)構(gòu)。系統(tǒng)主要分為三個(gè)部分:獲取進(jìn)程信息部分、調(diào)度算法部分、輸出部分。程序流程:輸入進(jìn)程個(gè)數(shù)->選擇獲取進(jìn)程信息方式->選擇調(diào)度算法->繼續(xù)選擇。程序流程圖如圖4.1所示。圖4.1 程序流程圖(2)獲取進(jìn)程信息系統(tǒng)首先定義一個(gè)進(jìn)程控制
7、塊結(jié)構(gòu)體Node。包含進(jìn)程名Name、優(yōu)先級(jí)Piority(數(shù)值越小優(yōu)先級(jí)越高)、到達(dá)時(shí)間Arrive_Time、服務(wù)時(shí)間Service_Time、開始時(shí)間Start_Time、結(jié)束時(shí)間Finish_Time、周轉(zhuǎn)時(shí)間Around_Time、還需要的輪轉(zhuǎn)時(shí)間Need_Around_Time以及指向下一個(gè)結(jié)點(diǎn)指針Next。在void Create_Process(Node *H)函數(shù)中,根據(jù)主函數(shù)傳進(jìn)來(lái)的頭指針H以及全局變量進(jìn)程個(gè)數(shù)Pro_Num根據(jù)選擇的獲取進(jìn)程信息的方法,使用尾插法創(chuàng)建長(zhǎng)度為Pro_Num的進(jìn)程鏈表,其中頭結(jié)點(diǎn)H不保存進(jìn)程信息。若選擇的是手動(dòng)輸入進(jìn)程信息,則使用for循環(huán),一
8、個(gè)一個(gè)輸入進(jìn)程的信息。若選擇從文件獲取進(jìn)程的信息,則也是for循環(huán),使用fscanf將文件逐行讀出,每行包括進(jìn)程的進(jìn)程名、優(yōu)先級(jí)、到達(dá)時(shí)間、服務(wù)時(shí)間。(3)輸出部分函數(shù)void OutPutProcess(Node *H)用于按格式輸出進(jìn)程信息以及計(jì)算并輸出平均周轉(zhuǎn)時(shí)間。(4)先來(lái)先服務(wù)調(diào)度算法(FCFS)。在先來(lái)先服務(wù)調(diào)度算法中,首先定義一個(gè)空鏈表的頭指針First和尾指針Tail,以及用于保留鍵值更小的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針p_min和用于存儲(chǔ)最小到達(dá)時(shí)間的節(jié)點(diǎn)min。然后使用選擇排序的方法,將原進(jìn)程鏈表中到達(dá)時(shí)間最小的結(jié)點(diǎn)依次放到First鏈表的鏈尾,直到取完原鏈表中的結(jié)點(diǎn)。然后再將Fir
9、st連接到H->Next,即此時(shí)H為已將到達(dá)時(shí)間從小到大排序好的鏈表。(5)短作業(yè)優(yōu)先調(diào)度算法(SJF)。原理同先來(lái)先服務(wù)調(diào)度算法,在短作業(yè)優(yōu)先調(diào)度算法中,首先定義一個(gè)空鏈表的頭指針First和尾指針Tail,以及用于保留鍵值更小的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針p_min和用于存儲(chǔ)最小到達(dá)時(shí)間的節(jié)點(diǎn)min。然后使用選擇排序的方法,將原進(jìn)程鏈表中相同條件下作業(yè)時(shí)間最短或者不同條件下最先到達(dá)的結(jié)點(diǎn)依次放到First鏈表的鏈尾,直到取完原鏈表中的結(jié)點(diǎn)。然后再將First連接到H->Next,即此時(shí)H為已滿足短作業(yè)優(yōu)先的鏈表。(6)時(shí)間片輪轉(zhuǎn)調(diào)度算法(RR)。時(shí)間片輪轉(zhuǎn)調(diào)度算法中用到的變量主要有用戶
10、輸入的輪轉(zhuǎn)時(shí)間Round_Time、記錄當(dāng)前時(shí)間Time、新到達(dá)進(jìn)程數(shù)NewArrive以及用于存放當(dāng)前就緒隊(duì)列中的進(jìn)程的循環(huán)鏈表First。在當(dāng)前時(shí)間=總的服務(wù)時(shí)間Total_Time之前,應(yīng)不斷地獲取在Time之前到達(dá)但未移動(dòng)到運(yùn)行隊(duì)列的進(jìn)程數(shù)量,然后判斷并在循環(huán)鏈表中插入新結(jié)點(diǎn)。然后判斷當(dāng)前進(jìn)程Q剩余的服務(wù)時(shí)間是否小于等于輪轉(zhuǎn)時(shí)間,若是,則結(jié)束Q,并將其從隊(duì)列中刪除;若否,則計(jì)算相應(yīng)數(shù)據(jù)并繼續(xù)循環(huán)。(7)基于靜態(tài)優(yōu)先級(jí)的調(diào)度算法(PSA)。原理同先來(lái)先服務(wù)調(diào)度算法,在靜態(tài)優(yōu)先級(jí)調(diào)度算法中,首先定義一個(gè)空鏈表的頭指針First和尾指針Tail,以及用于保留鍵值更小的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針p_
11、min和用于存儲(chǔ)最小到達(dá)時(shí)間的節(jié)點(diǎn)min。然后使用選擇排序的方法,將原進(jìn)程鏈表中相同條件下優(yōu)先級(jí)最高或者不同條件下最先到達(dá)的結(jié)點(diǎn)依次放到First鏈表的鏈尾,直到取完原鏈表中的結(jié)點(diǎn)。然后再將First連接到H->Next,即此時(shí)H為已滿足靜態(tài)優(yōu)先級(jí)調(diào)度的鏈表。(8)基于高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度算法(HRRN)。原理同先來(lái)先服務(wù)調(diào)度算法,在高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度算法中,首先定義一個(gè)空鏈表的頭指針First和尾指針Tail,以及用于保留鍵值更小的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針p_min和用于存儲(chǔ)最小到達(dá)時(shí)間的節(jié)點(diǎn)min。然后使用選擇排序的方法,將原進(jìn)程鏈表中相同條件下優(yōu)先權(quán)最高或者不同條件下
12、最先到達(dá)的結(jié)點(diǎn)依次放到First鏈表的鏈尾,直到取完原鏈表中的結(jié)點(diǎn)。然后再將First連接到H->Next,即此時(shí)H為已滿足高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度的鏈表。5、具體實(shí)現(xiàn)(1) 主函數(shù)的功能說(shuō)明。在主函數(shù)中,創(chuàng)建頭結(jié)點(diǎn)H,初始化為空鏈表。并輸入進(jìn)程的個(gè)數(shù),然后調(diào)用Create_Process(H);函數(shù),創(chuàng)建鏈表。為了避免調(diào)用其他調(diào)度算法后影響程序的結(jié)果,為五個(gè)調(diào)度算法賦予了五個(gè)原始創(chuàng)建的進(jìn)程鏈表,即H1H5。然后調(diào)用Menu函數(shù),輸出菜單,在根據(jù)選擇的選項(xiàng),調(diào)用相應(yīng)的調(diào)度算法。(2) 先來(lái)先服務(wù)調(diào)度算法(FCFS)。在此調(diào)度算法中,最主要的是使用選擇排序進(jìn)行到達(dá)時(shí)間的排序。使用whi
13、le循環(huán),遍歷鏈表中的每個(gè)結(jié)點(diǎn),在while循環(huán)內(nèi),再使用for循環(huán),找出比當(dāng)前結(jié)點(diǎn)到達(dá)時(shí)間小的結(jié)點(diǎn),然后交換并記錄下其前驅(qū)結(jié)點(diǎn),程序片段如下:for(P=H->Next,min=H->Next;P->Next!=NULL;P=P->Next)/循環(huán)遍歷鏈表中的節(jié)點(diǎn),找出此時(shí)最小的節(jié)點(diǎn)if(P->Next->Arrive_Time<min->Arrive_Time)/找到一個(gè)比當(dāng)前min小的節(jié)點(diǎn)p_min=P;/保存p->next的前驅(qū)節(jié)點(diǎn)pmin=P->Next;/保存鍵值更小的節(jié)點(diǎn)然后判斷有序鏈表是否為空,若為空,則將找出的最小到
14、達(dá)時(shí)間的進(jìn)程的結(jié)點(diǎn)作為First鏈表的頭結(jié)點(diǎn),然后將其到達(dá)時(shí)間作為開始時(shí)間、完成時(shí)間=開始時(shí)間+服務(wù)時(shí)間、周轉(zhuǎn)時(shí)間=完成時(shí)間-到達(dá)時(shí)間,同時(shí)尾指針后移。若有序鏈表First不為空鏈表,則將找到的當(dāng)前最小的到達(dá)時(shí)間的進(jìn)程的結(jié)點(diǎn)作為有序鏈表的尾節(jié)點(diǎn),然后判斷若其到達(dá)時(shí)間<=前一個(gè)進(jìn)程的完成時(shí)間,則將前一個(gè)進(jìn)程的完成時(shí)間作為其開始時(shí)間,若其到達(dá)時(shí)間>前一個(gè)進(jìn)程的完成時(shí)間,則將愛其到達(dá)時(shí)間作為其開始時(shí)間,同樣地在計(jì)算其完成時(shí)間和周轉(zhuǎn)時(shí)間,同時(shí)尾指針后移。if(min=H->Next) H->Next=H->Next->Next;else p_min->Next
15、=min->Next; 用于判斷如果找到的最小節(jié)點(diǎn)就是第一個(gè)節(jié)點(diǎn),則讓H指向原H->next,即第二個(gè)節(jié)點(diǎn)。如果不是第一個(gè)節(jié)點(diǎn),則將前次最小節(jié)點(diǎn)的next指向當(dāng)前min的next。(3) 短作業(yè)優(yōu)先調(diào)度算法(SJF)。同先來(lái)先服務(wù)算法,只是判斷的條件不同。增設(shè)一個(gè)用于記錄前一個(gè)進(jìn)程的完成時(shí)間的變量Pre_Finish_Time,初始化為0。然后判斷滿足一下四個(gè)條件之一則滿足min->Next和P->Next交換的條件:min->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間且min->Next服務(wù)時(shí)間&
16、gt;P->Next服務(wù)時(shí)間。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且min->Next到達(dá)時(shí)間>P->Next到達(dá)時(shí)間。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且min->Next到達(dá)時(shí)間=P->Next到達(dá)時(shí)間且min->Next服務(wù)時(shí)間>P->Next服務(wù)時(shí)間。(4) 時(shí)
17、間片輪轉(zhuǎn)調(diào)度算法(RR)。在時(shí)間片輪轉(zhuǎn)調(diào)度算法中,int GetCount(Node *H,int Time)函數(shù)用于獲取在Time之前到達(dá)但未移動(dòng)到運(yùn)行隊(duì)列的進(jìn)程數(shù)量,并返回進(jìn)程數(shù)Count。Node *SearchEnd(Node *H)函數(shù)用于查找循環(huán)隊(duì)列的尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),并返回前一個(gè)結(jié)點(diǎn)的指針。void Move(Node *HeadF,Node *HeadT,int Num)用于將H1后的Num個(gè)節(jié)點(diǎn)移動(dòng)到循環(huán)隊(duì)列H2中。在調(diào)度過(guò)程中,需要定義一個(gè)循環(huán)鏈表,用于存放當(dāng)前就緒隊(duì)列中的進(jìn)程。然后再不斷地獲取在Time之前到達(dá)但未移動(dòng)到運(yùn)行隊(duì)列的進(jìn)程數(shù)量,然后判斷并在循環(huán)鏈表中插入新結(jié)
18、點(diǎn),代碼片段如下:NewArrive=GetCount(H,Time); if(NewArrive>0)Move(H,First,NewArrive); 若就緒隊(duì)列中沒有進(jìn)程,則Time+:if(First=First->Next)Time+;若有一個(gè)進(jìn)程,則取出作為當(dāng)前進(jìn)程:else if(First=Q)P=Q;Q=Q->Next;否則,輸出其信息。若當(dāng)前進(jìn)程Q的剩余服務(wù)時(shí)間<=輪轉(zhuǎn)時(shí)間,則當(dāng)前時(shí)間Time+=Q的服務(wù)時(shí)間,Q的完成時(shí)間=當(dāng)前時(shí)間,Q的輪轉(zhuǎn)時(shí)間=Q的完成時(shí)間-Q的到達(dá)時(shí)間,總的輪轉(zhuǎn)時(shí)間+=Q的輪轉(zhuǎn)時(shí)間,并將Q從隊(duì)列刪除:if(Q->Servic
19、e_Time<=Round_Time)/服務(wù)時(shí)間<=輪轉(zhuǎn)時(shí)間Time+=Q->Service_Time;/當(dāng)前時(shí)間+=服務(wù)時(shí)間Q->Finish_Time=Time;/結(jié)束時(shí)間=當(dāng)前時(shí)間printf("時(shí) 刻:%dn",Time);printf("結(jié)束 進(jìn)程:%sn",Q->Name);Q->Around_Time=Q->Finish_Time-Q->Start_Time;/周轉(zhuǎn)時(shí)間=結(jié)束時(shí)間=到達(dá)時(shí)間ALL_Turn_Around_Time+=Q->Around_Time;/所有進(jìn)程周轉(zhuǎn)時(shí)間之和+=
20、每個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間printf("周轉(zhuǎn) 時(shí)間:%dnn",Q->Around_Time);temp=Q;Q=Q->Next;P->Next=Q;free(temp);/將已經(jīng)結(jié)束的進(jìn)程從隊(duì)列刪除若當(dāng)前進(jìn)程Q的剩余服務(wù)時(shí)間>輪轉(zhuǎn)時(shí)間,則當(dāng)前時(shí)間Time+=Q的輪轉(zhuǎn)時(shí)間,并將Q的服務(wù)時(shí)間-=輪轉(zhuǎn)時(shí)間,再往下循環(huán):else/服務(wù)時(shí)間>輪轉(zhuǎn)時(shí)間Time+=Round_Time;/當(dāng)前時(shí)間+=輪轉(zhuǎn)時(shí)間printf("第%d次運(yùn)行結(jié)束時(shí)間:%dnn",Q->Run_Time+1,Time);Q->Service_Time-=
21、Round_Time;/服務(wù)時(shí)間-=輪轉(zhuǎn)時(shí)間Q->Run_Time+;/運(yùn)行次數(shù)+P=Q;Q=Q->Next;(5) 基于靜態(tài)優(yōu)先級(jí)的調(diào)度算法(PSA)。同先來(lái)先服務(wù)算法,只是判斷的條件不同。增設(shè)一個(gè)用于記錄前一個(gè)進(jìn)程的完成時(shí)間的變量Pre_Finish_Time,初始化為0。然后判斷滿足一下四個(gè)條件之一則滿足min->Next和P->Next交換的條件(其中優(yōu)先數(shù)越高,優(yōu)先級(jí)越?。簃in->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間且min->Next優(yōu)先級(jí)>P->Next優(yōu)先級(jí)。m
22、in->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且min->Next到達(dá)時(shí)間>P->Next到達(dá)時(shí)間。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且min->Next到達(dá)時(shí)間=P->Next到達(dá)時(shí)間且min->Next優(yōu)先級(jí)>P->Next優(yōu)先級(jí)。(6) 基于高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度算法(HRR
23、N)。同先來(lái)先服務(wù)算法,只是判斷的條件不同。增設(shè)一個(gè)用于記錄前一個(gè)進(jìn)程的完成時(shí)間的變量Pre_Finish_Time,初始化為0。然后每次進(jìn)行交換前進(jìn)行優(yōu)先權(quán)的計(jì)算,再判斷滿足一下四個(gè)條件之一則滿足min->Next和P->Next交換的條件:min->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間且min->Next優(yōu)先權(quán)>P->Next優(yōu)先權(quán)。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間<=前一個(gè)進(jìn)程完成時(shí)間。min->Next到達(dá)時(shí)間>
24、前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且min->Next到達(dá)時(shí)間>P->Next到達(dá)時(shí)間。min->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且P->Next到達(dá)時(shí)間>前一個(gè)進(jìn)程完成時(shí)間且min->Next到達(dá)時(shí)間=P->Next到達(dá)時(shí)間且min->Next優(yōu)先權(quán)<P->Next優(yōu)先權(quán)。6、軟件運(yùn)行環(huán)境及限制在Linux環(huán)境下C語(yǔ)言編程。7、結(jié)果輸出及分析文件內(nèi)容為:圖7.1 文件內(nèi)容(1)FCFS:圖7.2先來(lái)先服務(wù)(2)SJF:圖7.3短作業(yè)優(yōu)先(3)RR:圖7.4時(shí)間片輪轉(zhuǎn)(4)PSA
25、:圖7.5基于靜態(tài)優(yōu)先級(jí)的調(diào)度(5)HRRN:圖7.6基于高響應(yīng)比優(yōu)先的動(dòng)態(tài)優(yōu)先級(jí)調(diào)度8、心得體會(huì)本次課程設(shè)計(jì)的內(nèi)容主要是對(duì)進(jìn)程調(diào)度的掌握和使用,以及對(duì)鏈表的操作外加一個(gè)選擇排序的使用。通過(guò)這次課程設(shè)計(jì),加深了我對(duì)進(jìn)程概念及進(jìn)程調(diào)度的理解;熟悉并掌握了進(jìn)程調(diào)度算法。使得理論知識(shí)得到的實(shí)踐,也使我的編程能力得到了進(jìn)一步提高。雖然在設(shè)計(jì)中遇到了一些問題,但在查閱資料后都解決了。9、參考文獻(xiàn)1湯小丹,梁紅兵計(jì)算機(jī)操作系統(tǒng)(第四版)2014年 陜西 西安電子科技大學(xué)出版社1陳媛,何波,盧玲,涂飛算法與數(shù)據(jù)結(jié)構(gòu)(第二版)2011年 北京 清華大學(xué)出版社10、源程序#include<stdio.h&
26、gt;#include<stdlib.h>#include<string.h>int Pro_Num;/進(jìn)程個(gè)數(shù)int Total_Time;/所有進(jìn)程運(yùn)行的總時(shí)間typedef struct Node/進(jìn)程控制塊結(jié)構(gòu)體char Name10;/進(jìn)程名int Piority;/優(yōu)先級(jí) 數(shù)值越小優(yōu)先級(jí)越高int Arrive_Time;/到達(dá)時(shí)間int Service_Time;/服務(wù)時(shí)間int Start_Time;/開始時(shí)間int Finish_Time;/結(jié)束時(shí)間int Around_Time;/周轉(zhuǎn)時(shí)間int Run_Time;/運(yùn)行次數(shù)struct Node *
27、Next;/指向下一個(gè)結(jié)點(diǎn)Node;void Create_Process(Node *H)/尾插法創(chuàng)建進(jìn)程鏈表int i,Select;Node *P=H;printf("1.手動(dòng)輸入進(jìn)程的信息n");printf("2.從文件讀取進(jìn)程的信息n");printf("輸入選擇:");scanf("%d",&Select);if(Select=1)/手動(dòng)輸入進(jìn)程信息for(i=0;i<Pro_Num;i+)P->Next=(Node *)malloc(sizeof(Node);printf(&qu
28、ot;n輸入第%d個(gè)進(jìn)程的信息:",i+1);printf("n進(jìn) 程 名:");scanf("%s",&P->Next->Name);printf("優(yōu) 先 級(jí):");scanf("%d",&P->Next->Piority);printf("到達(dá)時(shí)間:");scanf("%d",&P->Next->Arrive_Time);printf("服務(wù)時(shí)間:");scanf("%d
29、",&P->Next->Service_Time);P->Next->Run_Time=0;/初始化運(yùn)行次數(shù)為0Total_Time+=P->Next->Service_Time;/計(jì)算總運(yùn)行時(shí)間P=P->Next;P->Next=NULL;/鏈表尾節(jié)點(diǎn)置空else if(Select=2)/從文件讀入進(jìn)程信息FILE *fp=fopen("Process_Scheduling.dat","r");/打開文字文件只讀if(fp=NULL)printf("打開文件失敗!n"
30、;);exit(0);for(i=0;i<Pro_Num;i+)P->Next=(Node *)malloc(sizeof(Node);fscanf(fp,"%s %d %d %d",P->Next->Name,&P->Next->Piority,&P->Next->Arrive_Time,&P->Next->Service_Time);P->Next->Run_Time=0;/初始化運(yùn)行次數(shù)為0Total_Time+=P->Next->Service_Time;/計(jì)
31、算總運(yùn)行時(shí)間P=P->Next;P->Next=NULL;/鏈表尾節(jié)點(diǎn)置空f(shuō)close(fp);elseprintf("輸入有誤!n");exit(0);void OutPutProcess(Node *H)/輸出進(jìn)程N(yùn)ode *Q=H->Next;int ALL_Turn_Around_Time=0;/執(zhí)行完所有進(jìn)程周轉(zhuǎn)時(shí)間只和printf("進(jìn) 程 名 優(yōu) 先 級(jí) 到達(dá)時(shí)間 服務(wù)時(shí)間 開始時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間n");while(Q)printf("%s%10d%10d%10d%10d%10d%10dn",Q-
32、>Name,Q->Piority,Q->Arrive_Time,Q->Service_Time,Q->Start_Time,Q->Finish_Time,Q->Around_Time);ALL_Turn_Around_Time+=Q->Around_Time;/執(zhí)行完所有進(jìn)程所用時(shí)間Q=Q->Next;printf("n平均周轉(zhuǎn)時(shí)間為:%fn",(float)ALL_Turn_Around_Time/Pro_Num);printf("*n");/*先來(lái)先服務(wù)*void FCFS(Node *H)Nod
33、e *First=NULL;/排列后有序鏈的表頭指針Node *Tail=NULL;/排列后有序鏈的表尾指針Node *p_min;/保留鍵值更小的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針Node *min;/存儲(chǔ)最小到達(dá)時(shí)間節(jié)點(diǎn)Node *P;/當(dāng)前比較的節(jié)點(diǎn)while(H->Next!=NULL)/在鏈表中找到達(dá)時(shí)間最小的節(jié)點(diǎn)for(P=H->Next,min=H->Next;P->Next!=NULL;P=P->Next)/循環(huán)遍歷鏈表中的節(jié)點(diǎn),找出此時(shí)最小的節(jié)點(diǎn)if(P->Next->Arrive_Time<min->Arrive_Time)/找到一個(gè)
34、比當(dāng)前min小的節(jié)點(diǎn)p_min=P;/保存p->next的前驅(qū)節(jié)點(diǎn)pmin=P->Next;/保存鍵值更小的節(jié)點(diǎn)if(First=NULL)/如果有序鏈表目前還是一個(gè)空鏈表First=min;/第一次找到鍵值最小的節(jié)點(diǎn)First->Start_Time=First->Arrive_Time;/開始時(shí)間等于到達(dá)時(shí)間First->Finish_Time=First->Start_Time+First->Service_Time;/完成時(shí)間=開始時(shí)間+服務(wù)時(shí)間First->Around_Time=First->Finish_Time-First-
35、>Arrive_Time;/周轉(zhuǎn)時(shí)間=完成時(shí)間-到達(dá)時(shí)間Tail=min;/尾指針指向最后一個(gè)節(jié)點(diǎn)else/有序鏈表中已經(jīng)有節(jié)點(diǎn)Tail->Next=min;/把剛找到的最小節(jié)點(diǎn)放到最后if(Tail->Next->Arrive_Time<=Tail->Finish_Time)/下一個(gè)進(jìn)程的到達(dá)時(shí)間<=前一個(gè)進(jìn)程的完成時(shí)間Tail->Next->Start_Time=Tail->Finish_Time;/開始時(shí)間=前一個(gè)進(jìn)程的完成時(shí)間else/下一個(gè)進(jìn)程的到達(dá)時(shí)間>=前一個(gè)進(jìn)程的完成時(shí)間Tail->Next->Sta
36、rt_Time=Tail->Next->Arrive_Time;/開始時(shí)間=到達(dá)時(shí)間Tail->Next->Finish_Time=Tail->Next->Start_Time+Tail->Next->Service_Time;/完成時(shí)間=開始時(shí)間+服務(wù)時(shí)間Tail->Next->Around_Time=Tail->Next->Finish_Time-Tail->Next->Arrive_Time;/周轉(zhuǎn)時(shí)間=完成時(shí)間-到達(dá)時(shí)間Tail=min;/尾指針也要指向它if(min=H->Next)/如果找到的
37、最小節(jié)點(diǎn)就是第一個(gè)節(jié)點(diǎn)H->Next=H->Next->Next;/讓H指向原H->next,即第二個(gè)節(jié)點(diǎn)else/如果不是第一個(gè)節(jié)點(diǎn)p_min->Next=min->Next;/前次最小節(jié)點(diǎn)的next指向當(dāng)前min的next,讓min離開原鏈表if(First!=NULL)/循環(huán)結(jié)束得到有序鏈表FirstTail->Next=NULL;/鏈表的最后一個(gè)節(jié)點(diǎn)的next指向NULLH->Next=First;/*短作業(yè)優(yōu)先(非搶占式)*void SJF(Node *H)Node *First;/排列后有序鏈的表頭指針Node *Tail=NULL;
38、/排列后有序鏈的表尾指針Node *p_min;/保留鍵值更小的節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針Node *min;/存儲(chǔ)最小到達(dá)時(shí)間節(jié)點(diǎn)Node *P;/當(dāng)前比較的節(jié)點(diǎn)int Pre_Finish_Time=0;/前一個(gè)進(jìn)程的完成時(shí)間First=NULL;while(H->Next!=NULL)/在鏈表中找到達(dá)時(shí)間最小的節(jié)點(diǎn)for(P=H->Next,min=H->Next;P->Next!=NULL;P=P->Next)/循環(huán)遍歷鏈表中的節(jié)點(diǎn),找出此時(shí)最小的節(jié)點(diǎn)/1.當(dāng)前進(jìn)程到達(dá)時(shí)間<=Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間<=Pre_Fini
39、sh_Time 且 當(dāng)前進(jìn)程服務(wù)時(shí)間>被比較進(jìn)程服務(wù)時(shí)間/2.當(dāng)前進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間<=Pre_Finish_Time/3.當(dāng)前進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 當(dāng)前進(jìn)程到達(dá)時(shí)間>被比較進(jìn)程到達(dá)時(shí)間/4.當(dāng)前進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 當(dāng)前進(jìn)程到達(dá)時(shí)間=被比較進(jìn)程到達(dá)時(shí)間 且 當(dāng)前進(jìn)程服務(wù)時(shí)間>被比較進(jìn)程服務(wù)時(shí)間if(min->Arriv
40、e_Time<=Pre_Finish_Time && P->Next->Arrive_Time<=Pre_Finish_Time && min->Service_Time>P->Next->Service_Time)|(min->Arrive_Time>Pre_Finish_Time && P->Next->Arrive_Time<=Pre_Finish_Time)|(min->Arrive_Time>Pre_Finish_Time && P
41、->Next->Arrive_Time>Pre_Finish_Time && min->Arrive_Time>P->Next->Arrive_Time)|(min->Arrive_Time>Pre_Finish_Time && P->Next->Arrive_Time>Pre_Finish_Time && min->Arrive_Time=P->Next->Arrive_Time && min->Service_Time>P-&
42、gt;Next->Service_Time)p_min=P;/保存p->next的前驅(qū)節(jié)點(diǎn)pmin=P->Next;/保存鍵值更小的節(jié)點(diǎn)if(First=NULL)/如果有序鏈表目前還是一個(gè)空鏈表First=min;/第一次找到鍵值最小的節(jié)點(diǎn)First->Start_Time=First->Arrive_Time;/開始時(shí)間等于到達(dá)時(shí)間First->Finish_Time=First->Start_Time+First->Service_Time;/完成時(shí)間=開始時(shí)間+服務(wù)時(shí)間First->Around_Time=First->Fin
43、ish_Time-First->Arrive_Time;/周轉(zhuǎn)時(shí)間=完成時(shí)間-到達(dá)時(shí)間Pre_Finish_Time=First->Finish_Time;/前一個(gè)進(jìn)程的完成時(shí)間Tail=min;/尾指針指向最后一個(gè)節(jié)點(diǎn)else/有序鏈表中已經(jīng)有節(jié)點(diǎn)Tail->Next=min;/把剛找到的最小節(jié)點(diǎn)放到最后if(Tail->Next->Arrive_Time<=Tail->Finish_Time)/下一個(gè)進(jìn)程的到達(dá)時(shí)間<=前一個(gè)進(jìn)程的完成時(shí)間Tail->Next->Start_Time=Tail->Finish_Time;/開始
44、時(shí)間=前一個(gè)進(jìn)程的完成時(shí)間else/下一個(gè)進(jìn)程的到達(dá)時(shí)間>=前一個(gè)進(jìn)程的完成時(shí)間Tail->Next->Start_Time=Tail->Next->Arrive_Time;/開始時(shí)間=到達(dá)時(shí)間Tail->Next->Finish_Time=Tail->Next->Start_Time+Tail->Next->Service_Time;/完成時(shí)間=開始時(shí)間+服務(wù)時(shí)間Tail->Next->Around_Time=Tail->Next->Finish_Time-Tail->Next->Arriv
45、e_Time;/周轉(zhuǎn)時(shí)間=完成時(shí)間-到達(dá)時(shí)間Pre_Finish_Time=Tail->Next->Finish_Time;/前一個(gè)進(jìn)程的完成時(shí)間Tail=min;/尾指針也要指向它if(min=H->Next)/如果找到的最小節(jié)點(diǎn)就是第一個(gè)節(jié)點(diǎn)H->Next=H->Next->Next;/讓H指向原H->next,即第二個(gè)節(jié)點(diǎn)else/如果不是第一個(gè)節(jié)點(diǎn)p_min->Next=min->Next;/前次最小節(jié)點(diǎn)的next指向當(dāng)前min的next,讓min離開原鏈表if(First!=NULL)/循環(huán)結(jié)束得到有序鏈表FirstTail-&g
46、t;Next=NULL;/鏈表的最后一個(gè)節(jié)點(diǎn)的next指向NULLH->Next=First;/*時(shí)間片輪轉(zhuǎn)*int GetCount(Node *H,int Time)/獲取在Time之前到達(dá)但未移動(dòng)到運(yùn)行隊(duì)列的進(jìn)程數(shù)量int Count=0;/進(jìn)程數(shù)Node *Q=H->Next;while(Q&&Q->Arrive_Time<=Time)Q=Q->Next;Count+;return Count;Node *SearchEnd(Node *H)/查找循環(huán)隊(duì)列的尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)Node *P=H;Node *Q=H->Next;whil
47、e(Q->Next!=H)/如果不是頭節(jié)點(diǎn),返回尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),如果只有頭節(jié)點(diǎn),則直接返回P=Q;Q=Q->Next;return P;void Move(Node *H,Node *First,int Num)/將H后的Num個(gè)節(jié)點(diǎn)移動(dòng)到循環(huán)隊(duì)列First中Node *P=H;Node *Q=H->Next;Node *S=Q;/記錄要移動(dòng)的第一個(gè)節(jié)點(diǎn)while(Num>1)Q=Q->Next;Num-;P->Next=Q->Next;/以上完成從原隊(duì)列中取出相關(guān)節(jié)點(diǎn),S,Q分別為第一個(gè)和最后一個(gè)節(jié)點(diǎn) P=SearchEnd(First);/P為
48、循環(huán)隊(duì)列的尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)Q->Next=P->Next;/連接到循環(huán)隊(duì)列的鏈尾P->Next=S;/循環(huán)鏈表的鏈尾的下一個(gè)節(jié)點(diǎn)為頭節(jié)點(diǎn)void RR(Node *H)/輪轉(zhuǎn)調(diào)度Node *P,*Q,*temp;int Round_Time;/輪轉(zhuǎn)時(shí)間int Time=0;/記錄當(dāng)前時(shí)間int NewArrive;/新到達(dá)進(jìn)程數(shù)int ALL_Turn_Around_Time=0;/執(zhí)行完所有進(jìn)程周轉(zhuǎn)時(shí)間只和Node *First=(Node *)malloc(sizeof(Node);First->Next=First;/循環(huán)鏈表,存放當(dāng)前就緒隊(duì)列中的進(jìn)程P=Fir
49、st;Q=P->Next;/當(dāng)前應(yīng)當(dāng)運(yùn)行的進(jìn)程printf("輸入輪轉(zhuǎn)時(shí)間:");scanf("%d",&Round_Time);printf("n");if(Round_Time<=0)printf("輸入的輪轉(zhuǎn)時(shí)間有誤!n");exit(0);FCFS(H);while(Time<=Total_Time)NewArrive=GetCount(H,Time);/獲取在Time之前到達(dá)但未移動(dòng)到運(yùn)行隊(duì)列的進(jìn)程數(shù)量if(NewArrive>0)Move(H,First,NewArriv
50、e);/將H后的NewArrive個(gè)節(jié)點(diǎn)移動(dòng)到First隊(duì)列中if(First=First->Next)/就緒隊(duì)列中沒有進(jìn)程Time+;/自增的最小單位為1,自增后再獲取在Time+1之前到達(dá)但未移動(dòng)到運(yùn)行隊(duì)列的進(jìn)程數(shù)量else if(First=Q)/就緒隊(duì)列只有一個(gè)進(jìn)程P=Q;/把Q放到就緒隊(duì)列 Q=Q->Next;elseprintf("時(shí) 刻:%dn",Time);printf("運(yùn)行 進(jìn)程:%sn",Q->Name);printf("第幾次運(yùn)行:%dn",Q->Run_Time+1);printf(&
51、quot;到達(dá) 時(shí)間:%dn",Q->Arrive_Time);if(Q->Run_Time=0)/第一次運(yùn)行,則開始時(shí)間=當(dāng)前時(shí)間Q->Start_Time=Time;if(Q->Service_Time<=Round_Time)/服務(wù)時(shí)間<=輪轉(zhuǎn)時(shí)間Time+=Q->Service_Time;/當(dāng)前時(shí)間+=服務(wù)時(shí)間Q->Finish_Time=Time;/結(jié)束時(shí)間=當(dāng)前時(shí)間printf("進(jìn)程 時(shí)刻:%dn",Time);Q->Around_Time=Q->Finish_Time-Q->Arri
52、ve_Time;/周轉(zhuǎn)時(shí)間=結(jié)束時(shí)間=到達(dá)時(shí)間ALL_Turn_Around_Time+=Q->Around_Time;/所有進(jìn)程周轉(zhuǎn)時(shí)間之和+=每個(gè)進(jìn)程的周轉(zhuǎn)時(shí)間printf("周轉(zhuǎn) 時(shí)間:%dnn",Q->Around_Time);temp=Q;/將已經(jīng)結(jié)束的進(jìn)程從就緒隊(duì)列刪除Q=Q->Next;/指針后移P->Next=Q;/將刪除掉的結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)接到該結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)的后邊f(xié)ree(temp);else/服務(wù)時(shí)間>輪轉(zhuǎn)時(shí)間Time+=Round_Time;/當(dāng)前時(shí)間+=輪轉(zhuǎn)時(shí)間printf("第%d次運(yùn)行結(jié)束時(shí)間:%dnn
53、",Q->Run_Time+1,Time);Q->Service_Time-=Round_Time;/服務(wù)時(shí)間-=輪轉(zhuǎn)時(shí)間Q->Run_Time+;/運(yùn)行次數(shù)+P=Q;/放回就緒隊(duì)列Q=Q->Next;/指針后移printf("平均周轉(zhuǎn)時(shí)間:%fn",(float)ALL_Turn_Around_Time/Pro_Num);/*基于靜態(tài)優(yōu)先級(jí)的調(diào)度*void PSA(Node *H)Node *First=NULL;/排列后有序鏈的表頭指針Node *Tail=NULL;/排列后有序鏈的表尾指針Node *p_min;/保留鍵值更小的節(jié)點(diǎn)的
54、前驅(qū)節(jié)點(diǎn)的指針Node *min;/存儲(chǔ)最小到達(dá)時(shí)間節(jié)點(diǎn)Node *P;/當(dāng)前比較的節(jié)點(diǎn)int Pre_Finish_Time=0;/前一個(gè)進(jìn)程的完成時(shí)間while(H->Next!=NULL)/在鏈表中找到達(dá)時(shí)間最小的節(jié)點(diǎn)for(P=H->Next,min=H->Next;P->Next!=NULL;P=P->Next)/循環(huán)遍歷鏈表中的節(jié)點(diǎn),找出此時(shí)最小的節(jié)點(diǎn)/1.當(dāng)前進(jìn)程到達(dá)時(shí)間<=Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間<=Pre_Finish_Time 且 當(dāng)前進(jìn)程優(yōu)先級(jí)>被比較進(jìn)程優(yōu)先級(jí)/2.當(dāng)前進(jìn)程到達(dá)時(shí)間>Pr
55、e_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間<=Pre_Finish_Time/3.當(dāng)前進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 當(dāng)前進(jìn)程優(yōu)先級(jí)>被比較進(jìn)程優(yōu)先級(jí)/4.當(dāng)前進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 被比較進(jìn)程到達(dá)時(shí)間>Pre_Finish_Time 且 當(dāng)前進(jìn)程到達(dá)時(shí)間=被比較進(jìn)程到達(dá)時(shí)間 且 當(dāng)前進(jìn)程優(yōu)先級(jí)>被比較進(jìn)程優(yōu)先級(jí)if(min->Arrive_Time<=Pre_Finish_Time && P->Next->
56、;Arrive_Time<=Pre_Finish_Time && min->Piority>P->Next->Piority)|(min->Arrive_Time>Pre_Finish_Time && P->Next->Arrive_Time<=Pre_Finish_Time)|(min->Arrive_Time>Pre_Finish_Time && P->Next->Arrive_Time>Pre_Finish_Time && min-&g
57、t;Piority>P->Next->Piority)|(min->Arrive_Time>Pre_Finish_Time && P->Next->Arrive_Time>Pre_Finish_Time && min->Arrive_Time=P->Next->Arrive_Time && min->Piority>P->Next->Piority)p_min=P;/保存p->next的前驅(qū)節(jié)點(diǎn)pmin=P->Next;/保存鍵值更小的節(jié)點(diǎn)if(First=NULL)/如果有序鏈表目前還是一個(gè)空鏈表First=min;/第一次找到鍵值最小的節(jié)點(diǎn)First->Start_Time=First->Arrive_Time;/開始時(shí)間等于到達(dá)時(shí)間First->Fin
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:巨災(zāi)指數(shù)保險(xiǎn)調(diào)節(jié)下政府應(yīng)急物資采儲(chǔ)策略優(yōu)化研究
- 課題申報(bào)參考:教育強(qiáng)國(guó)與新質(zhì)生產(chǎn)力研究
- 2025年度個(gè)人屋頂光伏安裝合同范本3篇
- 2025年塔城b2考貨運(yùn)資格證要多久
- 2025個(gè)人蝦池承包養(yǎng)殖資源整合與開發(fā)合同3篇
- 十佳書香家庭事跡
- 二零二五版智能農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)采購(gòu)合同提升農(nóng)業(yè)效率4篇
- 二零二五學(xué)校與家長(zhǎng)聯(lián)合實(shí)施家校共育行動(dòng)計(jì)劃3篇
- 2025年度北京商品房買賣合同(含智能家居系統(tǒng)升級(jí)承諾)3篇
- 2025年個(gè)人間信息保密與責(zé)任承擔(dān)協(xié)議書3篇
- 2024版?zhèn)€人私有房屋購(gòu)買合同
- 2024爆炸物運(yùn)輸安全保障協(xié)議版B版
- 2025年度軍人軍事秘密保護(hù)保密協(xié)議與信息安全風(fēng)險(xiǎn)評(píng)估合同3篇
- 《食品與食品》課件
- 讀書分享會(huì)《白夜行》
- 光伏工程施工組織設(shè)計(jì)
- DB4101-T 121-2024 類家庭社會(huì)工作服務(wù)規(guī)范
- 化學(xué)纖維的鑒別與測(cè)試方法考核試卷
- 2024-2025學(xué)年全國(guó)中學(xué)生天文知識(shí)競(jìng)賽考試題庫(kù)(含答案)
- 自動(dòng)駕駛汽車道路交通安全性探討研究論文
- 術(shù)后譫妄及護(hù)理
評(píng)論
0/150
提交評(píng)論