操作系統(tǒng)實驗指導(dǎo)_第1頁
操作系統(tǒng)實驗指導(dǎo)_第2頁
操作系統(tǒng)實驗指導(dǎo)_第3頁
操作系統(tǒng)實驗指導(dǎo)_第4頁
操作系統(tǒng)實驗指導(dǎo)_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、長春工業(yè)大學(xué)計算機(jī)科學(xué)與工程學(xué)院操作系統(tǒng)課程組前 言操作系統(tǒng)是信息科學(xué)、計算機(jī)軟件的核心和基礎(chǔ)學(xué)科,對它的掌握程度,決定著計算機(jī)學(xué)習(xí)者的發(fā)展水平及方向。同時它是一門實踐性很強(qiáng)的課程,不僅要學(xué)習(xí)書本上的理論,而且必須動手實踐才能對操作系統(tǒng)基本原理真正理解。本課程提供實驗課,其目的在于加深學(xué)生對教學(xué)內(nèi)容的理解,培養(yǎng)學(xué)生初步掌握操作系統(tǒng)基本功能的設(shè)計方法及其實現(xiàn)過程。為使學(xué)生能更好的了解操作系統(tǒng),本次實驗安排了熟悉AIX操作系統(tǒng)的基本特性,在Linux系統(tǒng)下進(jìn)行實驗題目的設(shè)計與實現(xiàn)。 目 錄實驗1 熟悉Linux環(huán)境11、實驗?zāi)康?2、實驗內(nèi)容13、實驗預(yù)習(xí)內(nèi)容1附錄一 AIX/LINUX簡單命令簡

2、介1附錄二 Linux的全屏幕程序應(yīng)用3實驗2 進(jìn)程調(diào)度算法設(shè)計71、實驗?zāi)康?2、實驗內(nèi)容73、實驗要求74、實驗預(yù)習(xí)內(nèi)容75、實驗指導(dǎo)9實驗3進(jìn)程間通信算法設(shè)計161、實驗?zāi)康?62、實驗內(nèi)容163、實驗要求164、實驗預(yù)習(xí)內(nèi)容165、實驗指導(dǎo)16實驗4死鎖與哲學(xué)家就餐問題30設(shè)計一 采用預(yù)先分配法預(yù)防死鎖的哲學(xué)家就餐問題301、實驗?zāi)康?02、實驗要求303、實驗步驟303.1 程序結(jié)構(gòu)設(shè)計303.2 算法設(shè)計30設(shè)計二 采用有序分配法預(yù)防死鎖的哲學(xué)家就餐問題321、實驗?zāi)康?22、實驗要求323、實驗步驟323.1 程序結(jié)構(gòu)設(shè)計323.2 算法設(shè)計32設(shè)計三 不預(yù)防死鎖情況下的哲學(xué)家就

3、餐問題331、實驗?zāi)康?32、實驗要求333、實驗步驟333.1 程序結(jié)構(gòu)設(shè)計333.2 算法設(shè)計33實驗題目5 存儲管理算法設(shè)計34設(shè)計一 內(nèi)存空間的分配和回收341、實驗?zāi)康?42、實驗內(nèi)容343、實驗要求344、實驗預(yù)習(xí)內(nèi)容:345、實驗指導(dǎo)35設(shè)計二 虛擬存儲管理371、實驗?zāi)康?72、實驗內(nèi)容373、實驗要求374、實驗預(yù)習(xí)內(nèi)容385、實驗指導(dǎo)38實驗6 同步機(jī)制-讀者與寫者問題401、實驗?zāi)康?02、實驗內(nèi)容403、實驗要求404、實驗預(yù)習(xí)內(nèi)容415、實驗指導(dǎo)(算法分析)41實驗7 假脫機(jī)打印程序與虛擬設(shè)備501、實驗?zāi)康?02、實驗要求503、數(shù)據(jù)結(jié)構(gòu)分析514、程序結(jié)構(gòu)51操作

4、系統(tǒng)課程設(shè)計候選題目55操作系統(tǒng)課程設(shè)計報告要求57主要參考文獻(xiàn)59實驗1 熟悉Linux環(huán)境1、實驗?zāi)康模?)熟悉Linux下的基本操作,學(xué)會在Linux環(huán)境下使用各種簡單命令進(jìn)行操作。(2)學(xué)會在Linux環(huán)境下或者使用vi編輯器編輯簡單的C語言程序,并能對其編譯和調(diào)試。2、實驗內(nèi)容(1)登陸系統(tǒng),并使用各種簡單命令來實現(xiàn)基本的文件操作并觀察Linux文件系統(tǒng)的特點(diǎn);(2)寫一C程序,并對該程序進(jìn)行編譯和鏈接,輸出程序的運(yùn)行結(jié)果。3、實驗預(yù)習(xí)內(nèi)容參閱相關(guān)Linux的命令參考手冊,熟悉Linux下的操作命令。附錄一 AIX/LINUX簡單命令簡介11 命令的基本格式說明:1、格式:$ 命令

5、-命令選項 參數(shù)1 參數(shù)22、說明:字段間用一個或多個空格分開,Linux對大小寫敏感,只接受小寫命令。1.2 常用命令介紹1、who命令功能:可以列出當(dāng)前登錄到系統(tǒng)的所有用戶的登錄名、終端號和登錄時間$ whodavid tty04 Nov 28 08:27daniel tty01 Nov28 08:302、man命令可以顯示在線電子文檔3、pwd 顯示當(dāng)前目錄的絕對路徑名 $pwd /usr/james4、cd 改變工作目錄 $cd source (相對路徑) $cd /usr/david (絕對路徑) $cd $HOME 或者 cd 返回用戶主目錄5、mkdir 創(chuàng)建目錄$mkdir m

6、emos 在當(dāng)前目錄下創(chuàng)建子目錄$mkdir /source/memos 指定目錄的名字$mkdir p xx/yy/zz 創(chuàng)建多個分級目錄6、rmdir 刪除目錄$rmdir important 刪除一個空目錄如果目錄不空,則無法刪除必須在父目錄或者更高層刪除子目錄7、ls 顯示指定目錄的內(nèi)容$ls 列出當(dāng)前目錄內(nèi)容$ls source 顯示目錄source的文件列表$ls source/first.c 顯示指定的文件$ls a 列出所有文件,包括隱藏文件$ls R 循環(huán)列出子目錄的內(nèi)容$ls l 按照長格式列表,顯示文件的詳細(xì)信息total 3-rw-r-r- 1 david studen

7、t 1026 Jun25 12:30 123-rw-r-r- 1 david student 684 Jun25 12:30 REPORTdrw-r-r- 1 david student 48 Jun25 12:30 momos文件類型:第1列由10個字符組成,每行的第一個字符表示文件類型。-:普通文件d:目錄文件b:塊設(shè)備文件,例如磁盤c:字符設(shè)備文件,例如打印機(jī)文件的訪問模式:9個字符表示,R: 允許讀w:允許寫x:允許執(zhí)行第一組允許所有者的讀、寫和執(zhí)行權(quán)限。第二組允許用戶組的讀、寫和執(zhí)行權(quán)限。第三組允許其他用戶的讀、寫和執(zhí)行權(quán)限。如果是可執(zhí)行文件,標(biāo)記執(zhí)行許可權(quán)。8、rm 刪除文件rm既

8、可以刪除文件,也可以刪除目錄。rm命令沒有任何警告信息,當(dāng)刪除文件的時候,不出問題的話,文件就被刪除了。rm-I 刪除文件前,確認(rèn)rm-r 刪除指定的目錄及目錄中所有文件和子目錄9、cp 復(fù)制文件格式:cp 源目標(biāo) 目的目標(biāo)如果目的目標(biāo)已經(jīng)存在,那么他的內(nèi)容將被破壞。$cp file1 file210、mv 移動文件、更改名字格式:mv 源目標(biāo) 目的目標(biāo)$mv file1 file2 (更改名字)cp和mv命令都可以接受多于兩個的參數(shù),但最后參數(shù)必須是目錄$cp file1 file2 file3 directory111、uptime命令:用來得到有關(guān)系統(tǒng)負(fù)載的大致數(shù)據(jù)。$uptime 3:

9、20pm up 2days, 2:41, 16 users, load average: 1.90, 1.43, 1.33uptime報告當(dāng)前的時間,系統(tǒng)已經(jīng)啟動的時間以及有關(guān)任務(wù)負(fù)載的三個平均數(shù)據(jù)(最后1分鐘,最后5分鐘,最后15秒),該數(shù)據(jù)是對CPU使用量的大致接近。12、ps命令:生成一個報告,總結(jié)當(dāng)前進(jìn)程執(zhí)行的統(tǒng)計信息。該命令的選項控制要列出的進(jìn)程和要顯示的信息。最常用的格式就是 $ps ef-e:顯示所有進(jìn)程-f:顯示詳細(xì)信息UID PID PPID C STIME TTY TIME CMDroot 0 0 0 09:36:35 ?0:00 schedjames 888 113 15

10、 17:02:05 tty6 10:02 vi a.txt其中:UID:用戶IDPID:進(jìn)程IDPPID:父進(jìn)程IDC:當(dāng)前的調(diào)度程序的值STIME:進(jìn)程的開始時間TTY:和進(jìn)程相關(guān)的終端TIME:總的CPU運(yùn)行時間CMD:進(jìn)程運(yùn)行的命令13、nice命令:指定運(yùn)行程序的優(yōu)先值。格式:nice n +|- 數(shù)字 命令例:$nice n 10 myprog $nice n 10 myprog14、renice命令:指定進(jìn)程的優(yōu)先值。格式:renice n +|- 數(shù)字 PID例:$renice n +10 1001 $renice n 10 131315、kill命令:向進(jìn)程發(fā)信號并殺死進(jìn)程。格

11、式:kill -信號 PID(S)信號是要發(fā)給進(jìn)程的信號(可選),缺省是15,通知進(jìn)程終止有時候發(fā)出kill信號之后進(jìn)程依然可能存在。此時可以使用kill 9命令。一般這樣就能夠保證殺死進(jìn)程。當(dāng)殺死一個進(jìn)程的時候,也殺死了進(jìn)程的所有子進(jìn)程。附錄二 Linux的全屏幕程序應(yīng)用在Linux下設(shè)計全屏幕應(yīng)用程序要使用curses函數(shù)庫。假設(shè)我們的全屏幕應(yīng)用程序名為tc.c,以下介紹設(shè)計步驟。1. 開機(jī),登錄,進(jìn)入linux圖形用戶界面。2. 單擊任務(wù)欄上的主菜單,選擇“程序-應(yīng)用程序-gedit文本編輯器”,進(jìn)入gedit的文本編輯界面。選擇“文件-新建”命令,將創(chuàng)建一個新文檔,在文檔窗口中輸入以下

12、代碼:#include #include #include int main(int argc,char* argv )char select; /存放用戶的菜單選項bool end=false; /循環(huán)控制變量,若為true則跳出循環(huán),結(jié)束程序的執(zhí)行initscr( ); /初始化curses函數(shù)庫while(!end) /若用戶沒有選擇功能3則循環(huán)執(zhí)行以下代碼clear( ); /清屏refresh( ); /刷新物理屏幕printw(|-MAIN MENU-|n); /顯示菜單printw(| 1:fcfs |n);printw(| 2:round robin |n);printw(|

13、3:exit |n);printw(|-|n); printw(enter your choice(13):); refresh( );do select=(char)getch( ); /接收用戶的菜單選項 refresh( ); while(select!=1&select!=2&select!=3); /若用戶輸入的不是1、2、3則重新輸入clear( );refresh( ); switch(select) /根據(jù)用戶選項顯示相應(yīng)信息 case 1: printw(nfcfs.n); break; case 2: printw(nround robin.n); break; case

14、3:printw(n); end=true;printw(press any key to continue.n);getch( ); /按任意鍵繼續(xù)執(zhí)行refresh( );endwin( ); /恢復(fù)curses庫原來的設(shè)置return 0;輸入完成后,選擇“文件-另存為”命令,將文檔保存在當(dāng)前目錄下,并命名為tc.c。在作者的機(jī)器上,實際上是保存到/home/testbook/test_curses/tc.c中。3. 單擊任務(wù)欄上的終端仿真程序圖標(biāo),進(jìn)入外殼程序bash,用cd命令進(jìn)入tc.c所在的目錄。cd /home/testbook/test_curses4. 編譯tc.c生成可執(zhí)

15、行文件tc.o,即在命令提示符下鍵入下面的編譯命令:gcc tc.c o tc.o lcurses5. 運(yùn)行tc.o,即在命令提示符下鍵入下面的命令:./tc.o|-MAIN MENU-| 1:fcfs | 2:round robin | 3:exit |-|enter your choice(13):圖1-1可以看到程序首先顯示主菜單如圖1-1。在主菜單下輸入數(shù)字1,屏幕輸出如圖1-2。按任意鍵回到主菜單,在主菜單下輸入數(shù)字2,屏幕輸出如圖1-3。按任意鍵回到主菜單,在主菜單下輸入數(shù)字3,屏幕輸出如圖1-4。按任意鍵結(jié)束程序的執(zhí)行,回到bash。fcfs.press any key to c

16、ontinue.round robin.press any key to continue.圖1-2圖1-3press any key to continue.圖1-4附錄三 使用編輯器vi 編輯文件 字符界面的Linux系統(tǒng),在命令提示符下鍵入以下命令將進(jìn)入vi編輯器以便編輯源程序。1. 進(jìn)入linux的文本模式之后,在命令行鍵入vi filename.c 然后回車。vi命令是打開vi編輯器。后面的filename.c是用戶即將編輯的c文件名字。2. 最基本的命令I(lǐng) :當(dāng)進(jìn)入剛打開的文件時,不能寫入信息,這時按一下鍵盤上的I鍵(insert),插入的意思,就可以進(jìn)入編輯模式了。如圖1-5所示

17、: 圖1-53. 當(dāng)文件編輯完后,需要保存退出,這時需要經(jīng)過以下幾個步驟:1)按一下鍵盤上的Esc 鍵;2)鍵入冒號(:),緊跟在冒號后面是wq(意思是保存并退出)。如果不想保存退出,則在第二步鍵入冒號之后,鍵入q?。ú粠,機(jī)尾部保存)。如圖1-6所示:圖1-64. 退出vi編輯器的編輯模式之后,要對剛才編寫的程序進(jìn)行編譯。編譯的命令是:gcc filename.c -o outputfilename.out,其中g(shù)cc是c的編譯器。參數(shù):filename.c 是要編譯的源文件的名稱,outputfilename表示輸出文件名稱,中括號表示括號內(nèi)部的內(nèi)容可輸入也可以不輸入(中括號本身不再命令

18、行中出現(xiàn))。如果不輸入outputfilename.out,默認(rèn)的輸出文件是a.out 。5. 最后一步是運(yùn)行程序,方法如下:./outputfilename.out實驗2 進(jìn)程調(diào)度算法設(shè)計1、實驗?zāi)康倪M(jìn)程管理是操作系統(tǒng)中的重要功能,用來創(chuàng)建進(jìn)程、撤消進(jìn)程、實現(xiàn)進(jìn)程狀態(tài)轉(zhuǎn)換,它提供了在可運(yùn)行的進(jìn)程之間復(fù)用CPU的方法。在進(jìn)程管理中,進(jìn)程調(diào)度是核心,因為在采用多道程序設(shè)計的系統(tǒng)中,往往有若干個進(jìn)程同時處于就緒狀態(tài),當(dāng)就緒進(jìn)程個數(shù)大于處理器數(shù)目時,就必須依照某種策略決定哪些進(jìn)程優(yōu)先占用處理器。本實驗?zāi)M在單處理器情況下的進(jìn)程調(diào)度,目的是加深對進(jìn)程調(diào)度工作的理解,掌握不同調(diào)度算法的優(yōu)缺點(diǎn)。2、實驗內(nèi)

19、容選擇兩個調(diào)度算法作為兩個實驗題目,實現(xiàn)處理器調(diào)度。3、實驗要求要求完成以下功能:運(yùn)行處理器調(diào)度算法,顯示就緒進(jìn)程隊列、顯示運(yùn)行進(jìn)程隊列、顯示阻塞進(jìn)程隊列、創(chuàng)建新進(jìn)程、阻塞進(jìn)程、喚醒進(jìn)程、刪除進(jìn)程、退出程序。實驗報告中給出程序中使用的數(shù)據(jù)結(jié)構(gòu)及流程圖。4、實驗預(yù)習(xí)內(nèi)容(1)進(jìn)程控制塊為了管理和控制進(jìn)程,系統(tǒng)在創(chuàng)建每一個進(jìn)程時,都為其開辟一個專用的存儲區(qū),用以隨時記錄它在系統(tǒng)中的動態(tài)特性。而當(dāng)一個進(jìn)程被撤消時,系統(tǒng)就收回分配給它的存儲區(qū)。通常,把這一存儲區(qū)稱為該進(jìn)程的“進(jìn)程控制塊”(Process Control Block)。由于PCB是隨著進(jìn)程的創(chuàng)建而建立,隨著進(jìn)程的撤消而取消的,因此系統(tǒng)是

20、通過PCB來“感知”一個個進(jìn)程的,PCB是進(jìn)程存在的唯一標(biāo)志。(2)進(jìn)程控制塊隊列在多道程序設(shè)計環(huán)境里,同時會創(chuàng)建多個進(jìn)程。當(dāng)計算機(jī)系統(tǒng)只有一個CPU時,每次只能讓一個進(jìn)程運(yùn)行,其他的進(jìn)程或處于就緒狀態(tài),或處于阻塞狀態(tài)。為了對這些進(jìn)程進(jìn)行管理,操作系統(tǒng)要做三件事。把處于相同狀態(tài)的進(jìn)程的PCB,通過各自的隊列指針鏈接在一起,形成一個個隊列。通常有運(yùn)行隊列、就緒隊列、阻塞隊列。為每一個隊列設(shè)立一個隊列頭指針,它總是指向排在隊列之首的進(jìn)程的PCB。排在隊尾的進(jìn)程的PCB,它的“隊列指針”項內(nèi)容應(yīng)該為“NULL”,或一個特殊的符號,以表示這是該隊的隊尾PCB。在單CPU系統(tǒng)中,任何時刻都只有一個進(jìn)程處

21、于運(yùn)行狀態(tài),因此運(yùn)行隊列中只能有一個PCB;系統(tǒng)中所有處于就緒狀態(tài)的進(jìn)程的PCB排成一隊,稱其為“就緒隊列”。一般地,就緒隊列中會有多個進(jìn)程的PCB排在里面,它們形成處理機(jī)分配的候選對象。如果就緒隊列里沒有PCB存在,則稱該隊列為空;所有處于阻塞狀態(tài)進(jìn)程的PCB,應(yīng)該根據(jù)阻塞的原因進(jìn)行排隊,每一個都稱為一個“阻塞隊列”。比如等待磁盤輸入/輸出進(jìn)程的PCB排成一個隊列,等待打印機(jī)輸出進(jìn)程的PCB排成一個隊列等。所以,系統(tǒng)中可以有多個阻塞隊列,每個阻塞隊列中可以有多個進(jìn)程的PCB,也可以為空。(3)進(jìn)程調(diào)度算法進(jìn)程調(diào)度算法用于確定就緒隊列中的哪一個進(jìn)程即將獲得CPU。常用的進(jìn)程調(diào)度算法有先來先服務(wù)

22、法、時間片輪轉(zhuǎn)法、優(yōu)先數(shù)法等。先來先服務(wù)調(diào)度算法先來先服務(wù)調(diào)度算法的基本思想是:以到達(dá)就緒隊列的先后次序為標(biāo)準(zhǔn)來選擇占用處理機(jī)的進(jìn)程。一個進(jìn)程一旦占有處理機(jī),就一直使用下去,直至正常結(jié)束或因等待某事件的發(fā)生而讓出處理機(jī)。采用這種算法時,應(yīng)該這樣來管理就緒隊列:到達(dá)的進(jìn)程的PCB總是排在就緒隊列末尾;調(diào)度程序總是把CPU分配給就緒隊列中的第一個進(jìn)程使用。時間片輪轉(zhuǎn)法時間片輪轉(zhuǎn)調(diào)度算法的基本思想是:為就緒隊列中的每一個進(jìn)程分配一個稱為“時間片”的時間段,它是允許該進(jìn)程運(yùn)行的時間長度。在使用完一個時間片后,即使進(jìn)程還沒有運(yùn)行完畢,也要強(qiáng)迫其釋放處理機(jī),讓給另一個進(jìn)程使用。它自己則返回到就緒隊列末尾,

23、排隊等待下一次調(diào)度的到來。采用這種調(diào)度算法時,對就緒隊列的管理與先來先服務(wù)完全相同。主要區(qū)別是進(jìn)程每次占用處理機(jī)的時間由時間片決定,而不是只要占用處理機(jī)就一直運(yùn)行下去,直到運(yùn)行完畢或為等待某一事件的發(fā)生而自動放棄。優(yōu)先數(shù)調(diào)度算法優(yōu)先數(shù)調(diào)度算法的基本思想是:為每一個進(jìn)程確定一個優(yōu)先數(shù),進(jìn)程就緒隊列按照優(yōu)先數(shù)排序。如何確定進(jìn)程的優(yōu)先數(shù)(也就是進(jìn)程的優(yōu)先級)?可以從如下幾個方面考慮。)根據(jù)進(jìn)程的類型。系統(tǒng)中既有系統(tǒng)進(jìn)程,又有用戶進(jìn)程。系統(tǒng)進(jìn)程完成的任務(wù)是提供系統(tǒng)服務(wù),分配系統(tǒng)資源,因此,給予系統(tǒng)進(jìn)程較高的優(yōu)先數(shù)能夠提高系統(tǒng)的工作效率。)根據(jù)進(jìn)程執(zhí)行任務(wù)的重要性。重要性和緊迫性高的進(jìn)程應(yīng)當(dāng)被賦予較高的

24、優(yōu)先級。)根據(jù)進(jìn)程程序的性質(zhì)。一個CPU繁忙的進(jìn)程,由于需要占用較長的運(yùn)行時間,影響系統(tǒng)整體效率的發(fā)揮,因此只能給予較低的優(yōu)先數(shù)。一個I/O繁忙的進(jìn)程,給予它較高的優(yōu)先數(shù)后,就能充分發(fā)揮CPU和外部設(shè)備之間的并行工作能力。)根據(jù)對資源的要求。系統(tǒng)資源有處理機(jī)、內(nèi)存儲器和外部設(shè)備等??梢园凑找粋€進(jìn)程所需資源的類型和數(shù)量,確定它的優(yōu)先數(shù)。比如給予占用CPU時間短或內(nèi)存容量少的進(jìn)程以較高的優(yōu)先數(shù),這樣可以提高系統(tǒng)的吞吐量。)根據(jù)用戶的請求。系統(tǒng)可以根據(jù)用戶的請求,給予它的進(jìn)程很高的優(yōu)先數(shù),作“加急”處理。多級隊列調(diào)度算法多級隊列調(diào)度算法也稱多級反饋隊列調(diào)度算法,它是時間片調(diào)度算法與優(yōu)先數(shù)調(diào)度算法的結(jié)

25、合。實行這種調(diào)度算法時,系統(tǒng)中將維持多個就緒隊列,每個就緒隊列具有不同的調(diào)度級別,可以獲得不同長度的時間片。例如,系統(tǒng)維持N個就緒隊列,第1級就緒隊列中進(jìn)程的調(diào)度級別最高,可獲得的時間片最短,第N級就緒隊列中進(jìn)程的調(diào)度級別最低,可獲得的時間片最長。具體的調(diào)度方法是:創(chuàng)建一個新進(jìn)程時,它的PCB將進(jìn)入第1級就緒隊列的末尾。對于在第1級到第N-1級隊列中的進(jìn)程,如果在分配給它的時間片內(nèi)完成了全部工作,那么就撤離系統(tǒng);如果在時間片沒有用完時提出了輸入/輸出請求或要等待某事件發(fā)生,那么就進(jìn)入相應(yīng)的阻塞隊列里等待。在所等待的事件出現(xiàn)時,仍回到原隊列末尾,參與下一輪調(diào)度(也就是每個隊列實行先來先服務(wù)調(diào)度算

26、法);如果用完了時間片還沒有完成自己的工作,那么只能放棄對CPU的使用,降到低一級隊列的末尾,參與那個隊列的調(diào)度。對位于最后一個隊列里的進(jìn)程,實行時間片輪轉(zhuǎn)調(diào)度算法。整個系統(tǒng)最先調(diào)度1級就緒隊列;只有在上一級就緒隊列為空時,才去下一級隊列調(diào)度。當(dāng)比運(yùn)行進(jìn)程更高級別的隊列中到達(dá)一個進(jìn)程(可以肯定,在此之前比運(yùn)行進(jìn)程級別高的所有隊列全為空)時,系統(tǒng)將立即停止當(dāng)前運(yùn)行進(jìn)程的運(yùn)行,讓它回到自己隊列的末尾,轉(zhuǎn)去運(yùn)行級別高的那個進(jìn)程??梢钥闯?,多級隊列調(diào)度算法優(yōu)先照顧I/O繁忙的進(jìn)程。I/O繁忙的進(jìn)程在獲得一點(diǎn)CPU時間后就會提出輸入/輸出請求,因此它們總是被保持在1、2級等較前面的隊列中,總能獲得較多的

27、調(diào)度機(jī)會。對于CPU繁忙的進(jìn)程,它們需要較長的CPU時間,因此會逐漸地由級別高的隊列往下降,以獲得更多的CPU時間,它們“沉”得越深,被調(diào)度到的機(jī)會就越少。但是,一旦被調(diào)度到,就會獲得更多的CPU時間。5、實驗指導(dǎo)實驗中用到的主要數(shù)據(jù)結(jié)構(gòu)是進(jìn)程控制塊,其結(jié)構(gòu)如圖2-1所示。數(shù)據(jù)項作用next前向指針,指向下一個進(jìn)程控制塊,用來構(gòu)成進(jìn)程隊列process_name進(jìn)程名稱process_number進(jìn)程號,當(dāng)進(jìn)程有相同名稱時,用來區(qū)分進(jìn)程process_start_moment進(jìn)程啟動時刻process_need_time進(jìn)程要求運(yùn)行時間process_time_slice時間片process_

28、priority優(yōu)先數(shù)圖2-1 進(jìn)程控制塊參考源代碼:進(jìn)程調(diào)度算法編譯命令gcc process_schedule.cpp o process_schedule.o lcurses程序清單頭文件process_schedule.h#include #include #include #include #define MAX_PROCESS 10int process_number=0;typedef struct pcbstruct pcb *next;char process_name20;int process_number;int process_start_moment;int pro

29、cess_need_time;int process_time_slice;int process_priority;PCB;PCB pcb_tableMAX_PROCESS;PCB *pcb_run=NULL;PCB *pcb_free=NULL;PCB *pcb_ready=NULL;PCB *pcb_ready_rear=NULL;PCB *pcb_blocked=NULL;PCB *pcb_blocked_rear=NULL;void init_pcb_table();void display_process_queue(PCB *queue);PCB *create_process(

30、);void block_process_by_name();void wakeup_process();void FCFS();void RR();void HPF();void MFBQ();源文件process_schedule.cpp#include process_schedule.hint main(int argc,char *argv)char select; initscr();init_pcb_table();bool end=false;while(!end)clear();refresh();printw(|-MAIN MENU-|n);printw(| 1:first

31、 come first served |n);printw(| 2:round robin |n);printw(| 3:highest priority first |n);printw(| 4:multi_level feedback queue |n);printw(| 5:display ready process queue |n);printw(| 6:display blocked process queue |n);printw(| 7:display running queue |n);printw(| a:create a process |n);printw(| b:de

32、lete a process |n);printw(| c:block a process |n);printw(| d:wakeup a process |n);printw(| 8:exit |n);printw(|-|n);printw(select a function(18,ad):); refresh();doselect=(char)getch(); refresh();while(!(49=select&select=56)|(97=select&select=100);clear(); refresh();switch(select)case 1:FCFS();break;c

33、ase 2:RR();break;case 3:HPF();break;case 4:MFBQ();break;case 5:printw( ready queuen);display_process_queue(pcb_ready);break;case 6:printw( blocked queuen); display_process_queue(pcb_blocked);break;case 7:printw( running queuen); display_process_queue(pcb_run);break;case a:create_process();break;case

34、 b:break;case c:block_process_by_name();break;case d:wakeup_process();break;case 8:printw(n); end=true;printw(press any key to continue.n);getch();refresh();endwin();return 0;void init_pcb_table()int i=0;pcb_free=&pcb_table0;pcb_tableMAX_PROCESS-1.next=NULL;pcb_tableMAX_PROCESS-1.process_number=0;pc

35、b_tableMAX_PROCESS-1.process_start_moment=0; pcb_tableMAX_PROCESS-1.process_need_time=0;pcb_tableMAX_PROCESS-1.process_time_slice=0;pcb_tableMAX_PROCESS-1.process_priority=0;strcpy(pcb_tableMAX_PROCESS-1.process_name,);for(i=0;iprocess_name);move(i,12);printw(| );printw(%d,p-process_number);move(i,2

36、3);printw(| );printw(%d,p-process_start_moment);move(i,34);printw(| );printw(%d,p-process_need_time);move(i,45);printw(| );printw(%d,p-process_time_slice);move(i,56);printw(| );printw(%d,p-process_priority);move(i,67);printw(|);p=p-next;i+;move(i,1);printw(|-|-|-|-|-|-|n);refresh();void FCFS()if(pcb

37、_ready=NULL)printw(ready queue is empty,no process to run.n);elsepcb_run=pcb_ready;if(pcb_ready=pcb_ready_rear)pcb_ready=pcb_ready_rear=NULL;elsepcb_ready=pcb_ready-next;pcb_run-next=NULL;void RR()void HPF()void MFBQ()PCB *create_process()PCB *p=pcb_free;if(p=NULL)return NULL;elsepcb_free=pcb_free-n

38、ext;clear();refresh();printw(please enter the following fields:n);printw(| name | start_moment | need_time | time_slice | priority |n);scanw(%s%d%d%d%d,p-process_name,&(p-process_start_moment),&(p-process_need_time),&(p-process_time_slice),&(p-process_priority);p-process_number=(process_number+1)%10

39、0;process_number+;p-next=NULL;if(pcb_ready=NULL)pcb_ready=pcb_ready_rear=p;else pcb_ready_rear-next=p; pcb_ready_rear=p;return p;void block_process_by_name()char process_name20;PCB *p=pcb_ready;PCB *previous_p=pcb_ready;if(p=NULL)printw(ready queue is empty,no process can be blocked!n);return;displa

40、y_process_queue(pcb_ready);printw(enter the process name you want to block:n);scanw(%s,process_name);while(p!=NULL)if(!strcmp(p-process_name,process_name)break;previous_p=p;p=p-next;if(p=NULL)printw(no such a process in ready queue:%snyou typed the wrong namen,process_name);return;elseif(p=pcb_ready

41、_rear)pcb_ready_rear=previous_p; previous_p-next=p-next; if(pcb_blocked=NULL) pcb_blocked=pcb_blocked_rear=p; p-next=NULL; else pcb_blocked_rear-next=p; pcb_blocked_rear=pcb_blocked_rear-next; p-next=NULL; void wakeup_process()PCB *p=pcb_blocked;if(pcb_blocked=NULL)printw(blocked queue is empty,no p

42、rocess needs to be wakeuped.n); else if(pcb_blocked=pcb_blocked_rear) pcb_blocked=pcb_blocked_rear=NULL; else pcb_blocked=pcb_blocked-next; if(pcb_ready=NULL) pcb_ready=pcb_ready_rear=p; p-next=NULL; else pcb_ready_rear-next=p; pcb_ready_rear=pcb_ready_rear-next; p-next=NULL;/wakeup實驗3進(jìn)程間通信算法設(shè)計1、實驗?zāi)?/p>

43、的l 通過基礎(chǔ)實驗,基本掌握共享內(nèi)存的程序設(shè)計。l 通過編寫程序,使讀者掌握消息隊列的設(shè)計方法。l 通過編寫程序,掌握通道通信的設(shè)計方法2、實驗內(nèi)容l 共享內(nèi)存程序設(shè)計:創(chuàng)建兩個進(jìn)程,在A進(jìn)程中創(chuàng)建一個共享內(nèi)存,并向其寫入數(shù)據(jù),通過B進(jìn)程從共享內(nèi)存中讀出數(shù)據(jù)。l 消息隊列程序設(shè)計:創(chuàng)建一個消息隊列,如何使用消息隊列進(jìn)行兩個進(jìn)程(發(fā)送端和接受端)之間的通信,包括消息隊列的創(chuàng)建、消息發(fā)送與讀取、消息隊列的撤銷和刪除等多種操作。l 管道通信程序設(shè)計:編寫程序?qū)崿F(xiàn)進(jìn)程的管道通信,掌握有名管道的創(chuàng)建和讀寫方式,并熟悉LINUX支持的有名管道通信方式3、實驗要求理解進(jìn)程通信的不同方法,要求仿真實現(xiàn)共享內(nèi)存方式或消息傳遞方式或管道方式。運(yùn)行程序并分析實驗結(jié)果。實驗報告中給出程序中使用的數(shù)據(jù)結(jié)構(gòu)及流程圖。4、實驗預(yù)習(xí)內(nèi)容參閱相關(guān)資料,熟悉共享內(nèi)存、消息隊列、管道通信策略及實現(xiàn)技術(shù)。5、實驗指導(dǎo)(一)共享內(nèi)存程序設(shè)計 函數(shù)說明:共享內(nèi)存的實現(xiàn)分為兩個步驟,第一步是創(chuàng)建共享內(nèi)存,這里用到的函數(shù)是shmget(),也就是從內(nèi)存中獲得一段共享內(nèi)存區(qū)域。第二步映射共享內(nèi)存,也就是把這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間中,這里使用的函數(shù)是sh

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論