1863.VC++中進程調(diào)度算法的演示《操作系統(tǒng)原理》課程設(shè)計_第1頁
1863.VC++中進程調(diào)度算法的演示《操作系統(tǒng)原理》課程設(shè)計_第2頁
1863.VC++中進程調(diào)度算法的演示《操作系統(tǒng)原理》課程設(shè)計_第3頁
1863.VC++中進程調(diào)度算法的演示《操作系統(tǒng)原理》課程設(shè)計_第4頁
1863.VC++中進程調(diào)度算法的演示《操作系統(tǒng)原理》課程設(shè)計_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 操作系統(tǒng)原理課程設(shè)計 課題名稱:vc+中進程調(diào)度算法的演示姓 名: 班 級: 學 號: 課程設(shè)計起止時間:2005年12月26日至30日指導教師: 成績:課程設(shè)計任務書操作系統(tǒng)原理課程設(shè)計任務書設(shè)計題目:vc+中進程調(diào)度算法的演示任務下達時間:2005年12月26日任務完成時間:2005年12月30日指導教師: 指導教師評語一、所得結(jié)果:二、存在問題:成績評閱人課程設(shè)計的題目:vc+中進程調(diào)度算法的演示設(shè)計內(nèi)容:進程是當前操作系統(tǒng)下一個被加載到內(nèi)存的、正在運行的應用程序的實例。每一個進程都是由內(nèi)核對象和地址空間所組成的,內(nèi)核對象可以讓系統(tǒng)在其內(nèi)存放有關(guān)進程的統(tǒng)計信息并使系統(tǒng)能夠以此來管理進程

2、,而地址空間則包括了所有程序模塊的代碼和數(shù)據(jù)以及線程堆棧、堆分配空間等動態(tài)分配的空間。進程僅僅是一個存在,是不能獨自完成任何操作的,必須擁有至少一個在其環(huán)境下運行的線程,并由其負責執(zhí)行在進程地址空間內(nèi)的代碼。在進程啟動的同時即同時啟動了一個線程,該線程被稱作主線程或是執(zhí)行線程,由此線程可以繼續(xù)創(chuàng)建子線程。如果主線程退出,那么進程也就沒有存在的可能了,系統(tǒng)將自動撤消該進程并完成對其地址空間的釋放。詳細設(shè)計:程序入口選擇任務先來先服務關(guān)于作者case選擇任務短進程優(yōu)先強占式高有先權(quán)時間片輪轉(zhuǎn)退出123456判斷繼續(xù)退出程序流程圖退出程序流程圖如下:加載到進程地址空間的每一個可執(zhí)行文件或動態(tài)鏈接庫文

3、件的映象都會被分配一個與之相關(guān)聯(lián)的全局唯一的實例句柄。該實例句柄實際是一個記錄有進程加載位置的基本內(nèi)存地址。進程的實例句柄在程序入口函數(shù)中通過第一個參數(shù)傳遞,其實際值即為進程所使用的基本地址空間的地址。對于vc+鏈接程序所鏈接產(chǎn)生的程序,其默認的基本地址空間地址為0x00400000,如沒有必要一般不要修改該值。通過創(chuàng)建一個新的進程及在其地址空間內(nèi)運行的主線程來啟動并運行一個新的程序。具體的,在執(zhí)行函數(shù)時,首先由操作系統(tǒng)負責創(chuàng)建一個進程內(nèi)核對象,初始化計數(shù)為1,并立即為新進程創(chuàng)建一塊虛擬地址空間。隨后將可執(zhí)行文件或其他任何必要的動態(tài)鏈接庫文件的代碼和數(shù)據(jù)裝載到該地址空間中。在創(chuàng)建主線程時,也是

4、首先由系統(tǒng)負責創(chuàng)建一個線程內(nèi)核對象,并初始化為1。最后啟動主線程并執(zhí)行進程的入口函數(shù)runproc(),完成對進程和執(zhí)行線程的創(chuàng)建。runproc()函數(shù)的原型聲明如下:bool runproc(pcb *ppcb)int i;program *pprogram=&ppcb-program;int nprocid=ppcb-idproc.ninid;int nsize=pprogram-instructionset.size();int ntimepiececnt=0;int nstarttime=gettickcount();在程序設(shè)計時,某一個具體的功能模塊可以通過函數(shù)或是線程等不同的形式

5、來實現(xiàn)。對于同一進程而言,這些函數(shù)、線程都是存在于同一個地址空間下的,而且在執(zhí)行時,大多只對與其相關(guān)的一些數(shù)據(jù)進行處理。如果算法存在某種錯誤,將有可能破壞與其同處一個地址空間的其他一些重要內(nèi)容,這將造成比較嚴重的后果。為保護地址空間中的內(nèi)容可以考慮將那些需要對地址空間中的數(shù)據(jù)單獨進行訪問的操作部分,放到另外一個進程的地址空間中運行,并且只允許其訪問原進程地址空間中的相關(guān)數(shù)據(jù)。具體的,可在調(diào)度程序來解決。void schedule()switch(g_schedulealgorithm)case fcfs:schedule_fcfs();break;case spf:schedule_spf()

6、;break;case fpf_reaved:schedule_fpf_reaved();break;case timepiece:schedule_timepiece();break; 通過函數(shù)去創(chuàng)建子進程,子進程在全部處理過程中只對父進程地址空間中的相關(guān)數(shù)據(jù)進行訪問,從而可以保護父進程地址空間中與當前子進程執(zhí)行任務無關(guān)的全部數(shù)據(jù)。對于這種情況,子進程所體現(xiàn)出來的作用同函數(shù)和線程比較相似,可以看成是父進程在運行期間的一個過程。為此,需要由父進程來掌握子進程的啟動、執(zhí)行和退出。首先通過創(chuàng)建子進程,子進程啟動后父進程通過函數(shù)等待其執(zhí)行的結(jié)束,在子進程沒有退出前父進程是一直處于阻塞狀態(tài)的,這里子進

7、程的作用同單線程中的函數(shù)類似。一旦子進程退出,所等待的對象將得到通知,父進程將得以繼續(xù),如有必要可以通過函數(shù)來獲取子進程的退出可以通過enum procpriority()參數(shù)在創(chuàng)建進程時設(shè)置子進程的優(yōu)先級。前面的示例代碼在創(chuàng)建子進程時使用的均是默認的優(yōu)先級,如果要將優(yōu)先級設(shè)置為高,可以修改。對于前面沒有設(shè)定優(yōu)先級的例子代碼,可以在子進程啟動后由父進程來動態(tài)改變其優(yōu)先級設(shè)置。子進程 各進程創(chuàng)建如下: /調(diào)度程序void schedule()switch(g_schedulealgorithm)case fcfs:schedule_fcfs();break;case spf:schedule_s

8、pf();break;case fpf_reaved:schedule_fpf_reaved();break;case timepiece:schedule_timepiece();break;/fcfs調(diào)度void schedule_fcfs()pcb pcb;program program;int nip=0;schedule:if(g_bisend & g_pcbreadyqueue.empty()g_liststatinfoproglenfcfs.sort();printstatinfo_proglen(g_liststatinfoproglenfcfs,fcfs);return;if

9、(g_pcbreadyqueue.empty()goto schedule;entercriticalsection(&g_criticalsection);pcb=g_pcbreadyqueue.front();g_pcbreadyqueue.pop();leavecriticalsection(&g_criticalsection);runproc(&pcb);/添加統(tǒng)計信息 /短進程優(yōu)先void schedule_spf()pcb pcb;schedule:if(g_bisend & g_pcbreadypriorityqueue.empty()g_liststatinfoproglen

10、spf.sort();printstatinfo_proglen(g_liststatinfoproglenspf,spf);return;if(g_pcbreadypriorityqueue.empty()goto schedule;entercriticalsection(&g_criticalsection);pcb=g_pcbreadypriorityqueue.front();g_pcbreadypriorityqueue.pop_front();leavecriticalsection(&g_criticalsection);runproc(&pcb);/添加統(tǒng)計信息 /搶占式高優(yōu)

11、先權(quán)調(diào)度void schedule_fpf_reaved()pcb *ppcb;pcbpqueue:iterator p;schedule:if(g_bisend & g_pcbreadypriorityqueue.empty()g_liststatinfoproglenfpf_reaved.sort();printstatinfo_proglen(g_liststatinfoproglenfpf_reaved,fpf_reaved);return;if(g_pcbreadypriorityqueue.empty()goto schedule;entercriticalsection(&g_c

12、riticalsection);p=g_pcbreadypriorityqueue.begin();ppcb=&g_pcbreadypriorityqueue.front();g_bprogisrun=true;leavecriticalsection(&g_criticalsection);if(runproc(ppcb)/添加統(tǒng)計信息 /時間片調(diào)度void schedule_timepiece()pcb pcb;schedule:if(g_bisend & g_pcbreadypriorityqueue.empty()g_liststatinfoprocpriority.sort();pr

13、intstatinfo_priority(g_liststatinfoprocpriority,timepiece);return;if(g_pcbreadypriorityqueue.empty()goto schedule;entercriticalsection(&g_criticalsection);pcb=g_pcbreadypriorityqueue.front();g_pcbreadypriorityqueue.pop_front();leavecriticalsection(&g_criticalsection);if(!runproc(&pcb)entercriticalse

14、ction(&g_criticalsection);g_pcbreadypriorityqueue.push_back(pcb);leavecriticalsection(&g_criticalsection);else/添加統(tǒng)計信息 進程的互斥運行 正常情況下,一個進程的運行一般是不會影響到其他正在運行的進程的。但是對于某些有特殊要求的如以獨占方式使用串行口等硬件設(shè)備的程序就要求在其進程運行期間不允許其他試圖使用此端口設(shè)備的程序運行的,而且此類程序通常也不允許運行同一個程序的多個實例。這就引出了進程互斥的問題。 實現(xiàn)進程互斥的核心思想比較簡單:進程在啟動時首先檢查當前系統(tǒng)是否已經(jīng)存在有此進程

15、的實例,如果沒有,進程將成功創(chuàng)建并設(shè)置標識實例已經(jīng)存在的標記。此后再創(chuàng)建進程時將會通過該標記而知曉其實例已經(jīng)存在,從而保證進程在系統(tǒng)中只能存在一個實例。如果函數(shù)成功執(zhí)行,將返回一個互斥量對象的句柄。如果在進程執(zhí)行前已經(jīng)存在有相同名字的互斥量,函數(shù)將返回這個已經(jīng)存在互斥量的句柄,使用全局共享變量的方法則主要是在程序中通過編譯器來實現(xiàn)的。通過預編譯指令創(chuàng)建一個新節(jié),在此節(jié)中可定義一個變量,而且必須對其進行初始化指定變量可以為外部進程訪問。最后,為了使該變量能夠在進程互斥過程中發(fā)揮作用,還要將其設(shè)置為共享變量,同時允許具有讀、寫訪問權(quán)限。這可以通過預編譯指令來通知編譯器。運行結(jié)果及截圖:小結(jié)程序中含有一些對控制臺輸出和事件進行控制的api函數(shù)。多進程是多任務管理中的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論