版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)課程設(shè)計(jì)報(bào)告姓 名: 學(xué) 號(hào): 班 級(jí): 院 系: 日 期: 指導(dǎo)教師: 實(shí)驗(yàn)一:可變分區(qū)存儲(chǔ)管理一、實(shí)驗(yàn)要求 設(shè)計(jì)合理的數(shù)據(jù)結(jié)構(gòu)來(lái)描述存儲(chǔ)空間:對(duì)于未分配出去的部分,可以用空閑分區(qū)隊(duì)列來(lái)描述,對(duì)于已經(jīng)分配出去的部分,由裝入內(nèi)存的作業(yè)占據(jù),可以將作業(yè)組織成鏈表或數(shù)組。 實(shí)現(xiàn)分區(qū)存儲(chǔ)管理的內(nèi)存分配功能,要求選擇至少兩種適應(yīng)算法(如首次適應(yīng)算法,最佳適應(yīng)算法,最后適應(yīng)算法,最壞適應(yīng)算法)。 實(shí)現(xiàn)分區(qū)存儲(chǔ)管理的內(nèi)存回收算法:要求能夠正確處理回收分區(qū)與空閑分區(qū)的四種鄰接關(guān)系。 當(dāng)碎片產(chǎn)生時(shí),能夠進(jìn)行碎片的拼接。二、設(shè)計(jì)目的在掌握了計(jì)算機(jī)可變分區(qū)存儲(chǔ)管理方式的原理的基礎(chǔ)上,利用c語(yǔ)言在windo
2、ws操作系統(tǒng)下模擬實(shí)現(xiàn)操作系統(tǒng)的可變分區(qū)存儲(chǔ)管理的功能,以便加深對(duì)可變分區(qū)存儲(chǔ)管理原理的理解,提高根據(jù)已有原理通過(guò)編程解決操作系統(tǒng)實(shí)際問(wèn)題的能力,另一方面提高根據(jù)已有原理通過(guò)編程解決實(shí)際問(wèn)題的能力,為進(jìn)行系統(tǒng)軟件開(kāi)發(fā)和針對(duì)實(shí)際問(wèn)題提出高效的軟件解決方案打下基礎(chǔ)。三、各功能模塊分析實(shí)現(xiàn)需要設(shè)計(jì)合理的數(shù)據(jù)結(jié)構(gòu)來(lái)描述存儲(chǔ)空間,包括:被程序占用的存儲(chǔ)空間、空閑的存儲(chǔ)空間、多個(gè)程序的組織。通常用鏈表把這些同種類(lèi)型的存儲(chǔ)空間連接起來(lái),使用結(jié)構(gòu)體來(lái)描述每個(gè)存儲(chǔ)空間的屬性信息。根據(jù)可變分區(qū)存儲(chǔ)管理的基本原理,程序的實(shí)現(xiàn)主要包括以下幾個(gè)部分:1內(nèi)存的初始化:包括確定內(nèi)存的起始地址、內(nèi)存的大小等。2要進(jìn)入內(nèi)存的程
3、序鏈表的產(chǎn)生:多個(gè)要進(jìn)入內(nèi)存運(yùn)行的程序的產(chǎn)生,包括程序編號(hào)、所占存儲(chǔ)空間的大小。可以把這些內(nèi)容以記錄式文件的形式保存到磁盤(pán)上,也可以把他們存放在二維數(shù)組中。若保存在文件中,則可以多次使用,如保存在數(shù)組中只能使用一次。3為程序分配存儲(chǔ)空間: 可以采用首次適應(yīng)、最佳適應(yīng)、最后適應(yīng)算法來(lái)實(shí)現(xiàn)。主要是按照這三種算法的思想對(duì)空閑塊進(jìn)行排序,以便找出符合要求的那個(gè)空閑塊。對(duì)空閑塊的排序思路可以使用冒泡排序算法的思想。4記錄和顯示內(nèi)存被程序占用的情況5記錄和顯示內(nèi)存中空閑塊的情況6回收存儲(chǔ)空間:程序運(yùn)行完畢后,要及時(shí)回收內(nèi)存空間。四、主程序流程圖創(chuàng)建分區(qū)頭節(jié)點(diǎn)刪除上次的結(jié)果文件鍵盤(pán)輸入字符stepiniti
4、aliziation字符step為? step=1 step=2 put job into memory step=6move fragment together step=3step=4 finish job step=5 show current memory used by jobsshow current free liststep=7exit五丶主要實(shí)驗(yàn)代碼void init()/初始化,設(shè)置物理內(nèi)存中用戶(hù)區(qū)的大小,選取適應(yīng)算法fl = null;/將各值復(fù)位al = null;jl = null;usermemory = 0;fitalgorithm = 0;count = 0;p
5、rintf(n請(qǐng)?jiān)O(shè)置用戶(hù)區(qū)的大?。ㄕ停?;cin usermemory;setfitalgorithm();fnode * tmp = (fnode *)malloc(sizeof(fnode);tmp-startaddress = 0;tmp-size = usermemory;/初始化時(shí),將整個(gè)用戶(hù)內(nèi)存劃分到一個(gè)分區(qū)里tmp-last = null;tmp-next = null;fl = tmp;void setfitalgorithm()/設(shè)置適應(yīng)算法fitalgorithm = 0;while(fitalgorithm 4 | fitalgorithm fitalgorithm;
6、dofitalgorithm();void dofitalgorithm()/執(zhí)行適應(yīng)算法fnode * t = (fnode *)malloc(sizeof(fnode);int tmpstartaddress = 0;int tmpsize = 0;for (fnode * i = fl; i != null; i = i-next)t = i;for (fnode * j = i-next; j != null; j = j-next)switch(fitalgorithm)case 1:if (j-size size)/最佳適應(yīng)算法,找到鏈表中分區(qū)大小最小的分區(qū)t = j;break;
7、case 2:if (j-size t-size)/最壞適應(yīng)算法,找到鏈表中分區(qū)大小最大的分區(qū)t = j;break;case 3:if (j-startaddress startaddress)/首次適應(yīng)算法,找到鏈表中分區(qū)起始地址最小的分區(qū)t = j;break;case 4:if (j-startaddress t-startaddress)/最后適應(yīng)算法,找到鏈表中分區(qū)起始地址最大的分區(qū)t = j;break;tmpstartaddress = i-startaddress;/將剩余鏈中找到的分區(qū)交換到剩余鏈的最前端tmpsize = i-size;i-startaddress = t
8、-startaddress;i-size = t-size;t-startaddress = tmpstartaddress;t-size = tmpsize;void addjob()/添加作業(yè)int num = 0;int size = 0;printf(n);printf(請(qǐng)輸入要加入的作業(yè)的編號(hào)(整型):);cin num;printf(請(qǐng)輸入要加入的作業(yè)的大?。ㄕ停?;cin size;count+;jnode * job = (jnode *)malloc(sizeof(jnode);/初始化一個(gè)新作業(yè)結(jié)點(diǎn)job-id = count;job-num = num;job-siz
9、e = size;job-status = 0;job-last = null;job-next = null;if (jl = null)/將新作業(yè)加入作業(yè)鏈表中/若jl鏈為空,則直接將jl指向該結(jié)點(diǎn)jl = job; else/若jl不為空,則將該結(jié)點(diǎn)插入jl鏈的前端job-next = jl;jl-last = job;jl = job;dofitalgorithm();/在進(jìn)行內(nèi)存分配之前需執(zhí)行適應(yīng)算法if (allocatememory(job) = 0)/開(kāi)始內(nèi)存分配printf(n沒(méi)有足夠的內(nèi)存空間分配給該作業(yè)!n); elseprintf(n該作業(yè)成功得到內(nèi)存分配!n);int
10、 allocatememory(jnode * tmp)/內(nèi)存分配int flag = 0;/用于標(biāo)記新作業(yè)是否能被分配,0為不能for (fnode * i = fl; i != null; i = i-next)if (i-size = tmp-size)/找到一個(gè)符合要求的分區(qū)裝入作業(yè)tmp-status = 1;/更改作業(yè)狀態(tài)為已裝入內(nèi)存anode * t = (anode *)malloc(sizeof(anode);/初始化新加入的已分配分區(qū)結(jié)點(diǎn)t-jid = tmp-id;t-size = tmp-size;t-startaddress = i-startaddress;t-la
11、st = null;t-next = null;if (al = null)/將已分配的分區(qū)接入已分配分區(qū)鏈表中/若al鏈為空,則直接將al指向該結(jié)點(diǎn)al = t; else/若al不為空,則將該結(jié)點(diǎn)插入al鏈的前端t-next = al;al-last = t;al = t;if (i-size tmp-size)/若該分區(qū)大小大于作業(yè)大小,則將剩余大小重新賦給該分區(qū)i-startaddress = i-startaddress + tmp-size;i-size = i-size - tmp-size; else/若該分區(qū)大小恰好等于作業(yè)大小,則從空閑分區(qū)鏈表中刪除該分區(qū)if (i-las
12、t = null)fl = i-next; else if (i-next = null)i-last-next = null; elsei-last-next = i-next;i-next-last = i-last;delete i;flag = 1;break;return flag;void finishjob()/完成作業(yè)jnode * job = (jnode *)malloc(sizeof(jnode);int flag = 0;/用于標(biāo)記該id是否存在,0為不存在int id = 0;printf(n請(qǐng)輸入要完成的作業(yè)的id(整型):);cin id;for (jnode *
13、 i = jl; i != null; i = i-next)/找出該id的作業(yè)if (i-id = id)job = i;flag = 1;break;if (flag = 0)printf(n該id不存在!n); elseif (job-last = null)/將已完成的作業(yè)從作業(yè)鏈表中刪除jl = job-next;/若該job為鏈表頭結(jié)點(diǎn),則jl鏈表直接指向其下一個(gè)結(jié)點(diǎn) else if (job-next = null)job-last-next = null; elsejob-last-next = job-next;job-next-last = job-last;delete
14、job;deallocatememory(id);/開(kāi)始內(nèi)存回收printf(n該作業(yè)成功完成!n);void deallocatememory(int jid)/內(nèi)存回收anode * a = (anode *)malloc(sizeof(anode);int startaddress;/待合并分區(qū)的起始地址int endaddress;for (anode * i = al; i != null; i = i-next)/找到該作業(yè)所占的已分配分區(qū)if (i-jid = jid)a = i;break;startaddress = a-startaddress;endaddress = s
15、tartaddress + a-size - 1;if (a-last = null)al = a-next; else if (a-next = null)a-last-next = null; elsea-last-next = a-next;a-next-last = a-last;delete a;mergememory(startaddress, endaddress);/傳入待合并分區(qū)的起始地址void mergememory(int startaddress, int endaddress)/合并分區(qū)fnode * ls = null;fnode * ns = null;fnod
16、e * t = (fnode *)malloc(sizeof(fnode);t-startaddress = startaddress;t-size = endaddress - startaddress + 1;t-last = null;t-next = null;for (fnode * i = fl; i != null; i = i-next)if (endaddress + 1) = i-startaddress)/查找與其結(jié)束地址后相鄰的空閑分區(qū)ns = i;if (i-startaddress + i-size) = startaddress)/查找與其起始地址前相鄰的空閑分區(qū)
17、ls = i;if (ls = null) & (ns = null)/沒(méi)有相鄰的空閑分區(qū)可以合并,則單獨(dú)作為一個(gè)分區(qū)插入空閑分區(qū)鏈表if (fl = null)fl = t;elset-next = fl;fl-last = t;fl = t;if (ls != null) & (ns = null)/有前一個(gè)分區(qū)可以與之合并ls-size = ls-size + t-size;if (ls = null) & (ns != null)/有后一個(gè)分區(qū)可以與之合并ns-startaddress = t-startaddress;ns-size = ns-size + t-size;if (ls
18、 != null) & (ns != null)/前后兩個(gè)分區(qū)都與之合并if (ns-last = null)/若ns為頭結(jié)點(diǎn),則fl鏈表直接指向其下一個(gè)結(jié)點(diǎn)fl = ns-next; else if (ns-next = null)/若ns為尾結(jié)點(diǎn),則直接將該結(jié)點(diǎn)刪除ns-last-next = null; elsens-last-next = ns-next;ns-next-last = ns-last;ls-size = ls-size + t-size + ns-size;delete ns;void defragment()/碎片整理,進(jìn)行碎片拼接int sum = 0;/記錄已分配
19、空間的總大小for (anode * i = al; i -next != null; i = i-next)i-startaddress = i -next -size + i -next-startaddress;/更改已分配分區(qū)的起始地址,將這些分區(qū)的地址移到內(nèi)存的低址部分sum = sum + i-size;if (fl != null)/fl不為空表示還存在空閑空間,否則不存在空閑空間fl-next = null;/將剩余的空閑分區(qū)合并為一個(gè)分區(qū)fl-startaddress = sum;fl-size = usermemory - sum;printf(n碎片拼接完成!n);voi
20、d reload()/重新裝入作業(yè)鏈中未裝入內(nèi)存的作業(yè)for (jnode * i = jl; i != null; i = i-next)if (i-status = 0)dofitalgorithm();/在進(jìn)行內(nèi)存分配之前需執(zhí)行適應(yīng)算法if (allocatememory(i) = 0)/開(kāi)始內(nèi)存分配printf(n沒(méi)有足夠的內(nèi)存空間分配給 %d號(hào)作業(yè)!n, i-id); elsei-status = 1;printf(n %d號(hào)作業(yè)成功得到內(nèi)存分配!n, i-id);void showflist()/顯示當(dāng)前空閑分區(qū)鏈的信息printf(n);printf(#當(dāng)前空閑分區(qū)鏈信息#n);
21、printf(#分區(qū)起始地址分區(qū)大小n);for (fnode * i = fl; i != null; i = i-next)printf(#%10d, i-startaddress);printf();printf(|%10d, i-size);printf(n);printf(#n);printf(n);void showalist()/顯示當(dāng)前已分配分區(qū)鏈的信息printf(n);printf(#當(dāng)前已分配分區(qū)鏈信息#n);printf(#分區(qū)起始地址分區(qū)大小分區(qū)作業(yè)號(hào)n);for (anode * i = al; i != null; i = i-next)printf(#%10d,
22、 i-startaddress);printf();printf(|%10d, i-size);printf();printf(|%10d, i-jid);printf(n);printf(#n);printf(n);void showjlist()/顯示當(dāng)前作業(yè)鏈的信息printf(n);printf(#當(dāng)前作業(yè)鏈信息#n);printf(#作業(yè)id作業(yè)編號(hào)作業(yè)大小作業(yè)狀態(tài)n);for (jnode * i = jl; i != null; i = i-next)printf(#%10d, i-id);printf();printf(|%10d, i-num);printf();printf
23、(|%10d, i-size);printf();if (i-status = 0)printf(| 未裝入內(nèi)存); elseprintf(| 已裝入內(nèi)存);printf(n);printf(#n);printf(n);void mainpage()/主界面int i = 0;printf(n);printf(#主界面#n);printf(#1-初始化(設(shè)置物理內(nèi)存中用戶(hù)區(qū)的大小,選取適應(yīng)算法)n);printf(#2-作業(yè)進(jìn)入內(nèi)存(內(nèi)存分配)n);printf(#3-作業(yè)完成(內(nèi)存回收)n);printf(#4-顯示當(dāng)前空閑分區(qū)鏈的信息n);printf(#5-顯示當(dāng)前已分配分區(qū)鏈的信息n)
24、;printf(#6-顯示當(dāng)前作業(yè)鏈的信息n);printf(#7-碎片整理(碎片拼接)n);printf(#8-重新裝入未裝入內(nèi)存的作業(yè)n);printf(#9-顯示所有鏈的信息n);printf(#10-設(shè)置適應(yīng)算法n);printf(#0-退出n);printf(#n);int main(void)mainpage();return system(pause);六丶實(shí)驗(yàn)截圖:進(jìn)行初始化:選擇最佳適應(yīng)算法:添加3個(gè)作業(yè):顯示空閑分區(qū):顯示當(dāng)前已分配分區(qū)鏈信息:顯示當(dāng)前作業(yè)鏈信息:完成作業(yè)1和2:顯示當(dāng)前空閑分區(qū):進(jìn)行拼接后顯示分區(qū):七丶實(shí)驗(yàn)小結(jié)通過(guò)本次課程設(shè)計(jì),自己的編程能力有所提高,對(duì)操
25、作系統(tǒng)內(nèi)存的分配,存儲(chǔ)空間的回收,以及碎片的拼接都有了全新的認(rèn)識(shí)。在這次操作系統(tǒng)的課程設(shè)計(jì)我使用了c語(yǔ)言編寫(xiě)系統(tǒng)軟件,對(duì)os中可變分區(qū)存儲(chǔ)管理有了更深刻的理解。通過(guò)驗(yàn)證,可以說(shuō)是做出結(jié)果。但是過(guò)程中遇到很多困難,只能邊做邊查資料,問(wèn)同學(xué)。也許是程序的某個(gè)邊界的設(shè)計(jì)不合理。在教案中提供了雙向鏈表的實(shí)現(xiàn)方法,但是感覺(jué)對(duì)于性能提升影響不大,但是對(duì)于編程復(fù)雜度提高較多,實(shí)際做下來(lái)感覺(jué)這個(gè)方法比較雞肋。通過(guò)試驗(yàn),對(duì)于c的語(yǔ)句有了比較多的了解,我們?cè)瓉?lái)學(xué)的是c+,但是發(fā)現(xiàn)c的i/o比于c+的似乎更為簡(jiǎn)便一些。任何輸入而正常結(jié)束。很遺憾的是因?yàn)闀r(shí)間問(wèn)題,沒(méi)有把這個(gè)模擬程序?qū)懗蓜?dòng)畫(huà)形式,還可以加幾句代碼后實(shí)現(xiàn)
26、動(dòng)態(tài)的增加作業(yè)??偠灾科湓蜻€是自己平時(shí)沒(méi)學(xué)牢固。希望在以后的學(xué)習(xí)中可以學(xué)到更多知識(shí)。實(shí)驗(yàn)二:多級(jí)隊(duì)列調(diào)度算法模擬實(shí)現(xiàn)1.設(shè)計(jì)要求 在熟練掌握計(jì)算機(jī)處理機(jī)調(diào)度原理的基礎(chǔ)上,利用一種程序設(shè)計(jì)語(yǔ)言模擬實(shí)現(xiàn)多級(jí)反饋隊(duì)列進(jìn)程調(diào)度算法,一方面加深對(duì)原理的理解,另一方面提高學(xué)生通過(guò)編程根據(jù)已有原理解決實(shí)際問(wèn)題的能力,為學(xué)生將來(lái)進(jìn)行系統(tǒng)軟件開(kāi)發(fā)和針對(duì)實(shí)際問(wèn)題提出高效的軟件解決方案打下基礎(chǔ)。 調(diào)度算法中采用至少4級(jí)隊(duì)列,每級(jí)隊(duì)列的時(shí)間片大小預(yù)先指定。 由于只是模擬實(shí)現(xiàn),調(diào)度的對(duì)象進(jìn)程實(shí)際上并不包括程序和數(shù)據(jù),而僅僅包括一個(gè)pcb數(shù)據(jù)結(jié)構(gòu),用pcb來(lái)代表一個(gè)進(jìn)程,調(diào)度算法調(diào)度的對(duì)象只包括進(jìn)程的pcb.處理
27、機(jī)的切換通過(guò)將pcb在運(yùn)行指針和就緒隊(duì)列之間進(jìn)行移動(dòng)來(lái)實(shí)現(xiàn)。又因?yàn)檫M(jìn)程的組成只有pcb,沒(méi)有程序和數(shù)據(jù),因而進(jìn)程只有運(yùn)行和就緒兩種狀態(tài),沒(méi)有等待狀態(tài)。 為避免顯示結(jié)果超過(guò)1屏,調(diào)度結(jié)果要求寫(xiě)入文件中以方便檢驗(yàn)。2.基礎(chǔ)知識(shí) 由于處理機(jī)是計(jì)算機(jī)系統(tǒng)中最寶貴和稀有的資源,因而處理機(jī)調(diào)度是操作系統(tǒng)進(jìn)行資源管理的一個(gè)重要功能。現(xiàn)代操作系統(tǒng)廣泛采用多道程序設(shè)計(jì)的技術(shù)來(lái)提高系統(tǒng)吞吐量,提高程序的并發(fā)度和資源利用率。特別是進(jìn)程調(diào)度程序,由于其運(yùn)行頻率高,更加要求調(diào)度算法簡(jiǎn)單,高效,系統(tǒng)開(kāi)銷(xiāo)小,進(jìn)程切換快,可以說(shuō),調(diào)度算法的好壞直接影響整個(gè)計(jì)算機(jī)系統(tǒng)的性能。 多級(jí)隊(duì)列調(diào)度算法是一種動(dòng)態(tài)優(yōu)先數(shù)調(diào)度算法。對(duì)于普通
28、的優(yōu)先調(diào)度算法,如何確定進(jìn)程優(yōu)先級(jí)以真實(shí)地反映進(jìn)程運(yùn)行的緊迫程度是一個(gè)難題,但在多級(jí)隊(duì)列調(diào)度算法中,可以預(yù)先規(guī)定優(yōu)先級(jí)一樣可以獲得好的性能。該算法實(shí)際上綜合了兩種調(diào)度算法:隊(duì)列內(nèi)部是fcfs,隊(duì)列之間是優(yōu)先調(diào)度。3.數(shù)據(jù)結(jié)構(gòu)參考 最核心的數(shù)據(jù)結(jié)構(gòu)就是進(jìn)程的邏輯結(jié)構(gòu)。 進(jìn)程中必須包括的內(nèi)容很多(參見(jiàn)教材pcb部分的定義),為了簡(jiǎn)化起見(jiàn),可以略去一些與本模擬調(diào)度算法關(guān)系不大的一些信息。請(qǐng)同學(xué)們自行設(shè)計(jì),要求能夠?qū)崿F(xiàn)本調(diào)度算法即可。4.主程序流程圖初始化輸入a ;a=2創(chuàng)建進(jìn)程n執(zhí)行進(jìn)程aenter?ynya=2?n撤消進(jìn)程ya=3?n阻塞進(jìn)程y喚醒進(jìn)程a=4?na=0?ny退出系統(tǒng)終止5.程序運(yùn)行
29、截圖:此系統(tǒng)的界面是在dos界面下輸出的,所以以下的輸出結(jié)果均是dos界面截圖。初始化界面:創(chuàng)建進(jìn)程:依次創(chuàng)建進(jìn)程:a,b,c和所需時(shí)間。運(yùn)行進(jìn)程: 進(jìn)程運(yùn)行結(jié)束:6.實(shí)驗(yàn)關(guān)鍵代碼:int main(void) priocreate(); processcreate(); multidispatch(); output(); return 0; void output() readyqueue *print = head; pcb *p; printf(進(jìn)程名t優(yōu)先級(jí)t輪數(shù)tcpu時(shí)間t需要時(shí)間t進(jìn)程狀態(tài)t計(jì)數(shù)器n); while(print) if(print -linkpcb != nul
30、l) p=print -linkpcb; while(p) printf(%st%dt%dt%dt%dtt%ctt%dn,p-name,p-prio,p-round,p-cputime,p-needtime,p-state,p-count); p = p-next; print = print-next; p = finish; while(p!=null) printf(%st%dt%dt%dt%dtt%ctt%dn,p-name,p-prio,p-round,p-cputime,p-needtime,p-state,p-count); p = p-next; p = run; while(
31、p!=null) printf(%st%dt%dt%dt%dtt%ctt%dn,p-name,p-prio,p-round,p-cputime,p-needtime,p-state,p-count); p = p-next; void insertfinish(pcb *in) pcb *fst; fst = finish; if(finish = null) in-next = finish; finish = in; else while(fst-next != null) fst = fst-next; in -next = fst -next; fst -next = in; void
32、 insertprio(readyqueue *in) readyqueue *fst,*nxt; fst = nxt = head; if(head = null) in-next = head; head = in; else if(in -prio = fst -prio) in-next = head; head = in; else while(fst-next != null) nxt = fst; fst = fst-next; if(fst -next = null) in -next = fst -next; fst -next = in; else nxt = in; in
33、 -next = fst; void priocreate() readyqueue *tmp; int i; printf(輸入就緒隊(duì)列的個(gè)數(shù):n); scanf(%d,&readynum); printf(輸入每個(gè)就緒隊(duì)列的cpu時(shí)間片:n); for(i = 0;i round); tmp -prio = 50 - tmp-round; tmp -linkpcb = null; tmp -next = null; insertprio(tmp); void getfirst(readyqueue *queue) run = queue -linkpcb; if(queue -linkpc
34、b != null) run -state = r; queue -linkpcb = queue -linkpcb -next; run -next = null; void insertlast(pcb *in,readyqueue *queue) pcb *fst; fst = queue-linkpcb; if( queue-linkpcb = null) in-next = queue-linkpcb; queue-linkpcb = in; else while(fst-next != null) fst = fst-next; in -next = fst -next; fst
35、-next = in; void processcreate() pcb *tmp; int i; printf(輸入進(jìn)程的個(gè)數(shù):n); scanf(%d,&num); printf(輸入進(jìn)程名字和進(jìn)程所需時(shí)間:n); for(i = 0;i name); getchar(); scanf(%d,&(tmp-needtime); tmp -cputime = 0; tmp -state =w; tmp -prio = 50 - tmp-needtime; tmp -round = head -round; tmp -count = 0; insertlast(tmp,head); void r
36、oundrun(readyqueue *timechip) int flag = 1; getfirst(timechip); while(run != null) while(flag) run-count+; run-cputime+; run-needtime-; if(run-needtime = 0) run -state = f; insertfinish(run); flag = 0; else if(run-count = timechip -round) run-state = w; run-count = 0; insertlast(run,timechip); flag
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度苗木苗圃定向種植與農(nóng)村電商合同范本3篇
- 2025年度高校教師博士后流動(dòng)站合作培養(yǎng)合同
- 2025年度美術(shù)教師職務(wù)聘任合同標(biāo)準(zhǔn)范本
- 2025年度土工布銷(xiāo)售合同-生態(tài)環(huán)保材料供應(yīng)協(xié)議
- 2025年度個(gè)人數(shù)字貨幣交易合同范本4篇
- 2025年度航空貨運(yùn)司機(jī)聘用勞動(dòng)合同范本
- 2025年度食品添加劑行業(yè)配料保密合同協(xié)議書(shū)范本
- 二零二五年度特色農(nóng)業(yè)觀光園果樹(shù)種植權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度牛羊肉冷鏈運(yùn)輸車(chē)輛購(gòu)置合同4篇
- 二零二五年度門(mén)面房租賃合同(含市場(chǎng)風(fēng)險(xiǎn)分擔(dān))4篇
- 智能養(yǎng)老院視頻監(jiān)控技術(shù)方案
- 你比我猜題庫(kù)課件
- 體育概論(第二版)課件第三章體育目的
- 無(wú)人駕駛航空器安全操作理論復(fù)習(xí)測(cè)試附答案
- 建筑工地春節(jié)留守人員安全技術(shù)交底
- 默納克-NICE1000技術(shù)交流-V1.0
- 蝴蝶蘭的簡(jiǎn)介
- 老年人心理健康量表(含評(píng)分)
- 《小兒靜脈輸液速度》課件
- 營(yíng)銷(xiāo)人員薪酬標(biāo)準(zhǔn)及績(jī)效考核辦法
- 醫(yī)院每日消防巡查記錄表
評(píng)論
0/150
提交評(píng)論