版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《計(jì)算機(jī)操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書
曲阜師范大學(xué)計(jì)算機(jī)科學(xué)學(xué)院
課程內(nèi)容簡(jiǎn)介
操作系統(tǒng)是計(jì)算機(jī)教學(xué)中最重要的環(huán)節(jié)之一,也是計(jì)算機(jī)專業(yè)學(xué)生的一門重
要的專業(yè)課程。操作系統(tǒng)質(zhì)量的好壞,直接影響整個(gè)計(jì)算機(jī)系統(tǒng)的性能和用戶對(duì)
計(jì)算機(jī)的使用。一個(gè)精心設(shè)計(jì)的操作系統(tǒng)能極大地?cái)U(kuò)充計(jì)算機(jī)系統(tǒng)的功能,充分
發(fā)揮系統(tǒng)中各種設(shè)備的使用效率,提高系統(tǒng)工作的可靠性。由于操作系統(tǒng)涉及計(jì)
算機(jī)系統(tǒng)中各種軟硬件資源的管理,內(nèi)容比較繁瑣,具有很強(qiáng)的實(shí)踐性。要學(xué)好
這門課程,必須把理論與實(shí)踐緊密結(jié)合,才能取得較好的學(xué)習(xí)效果。培養(yǎng)計(jì)算機(jī)
專業(yè)的學(xué)生的系統(tǒng)程序設(shè)計(jì)能力,是操作系統(tǒng)課程的一個(gè)非常重要的環(huán)節(jié)。通過
操作系統(tǒng)上機(jī)實(shí)驗(yàn),可以培養(yǎng)學(xué)生程序設(shè)計(jì)的方法和技巧,提高學(xué)生編制清晰、
合理、可讀性好的系統(tǒng)程序的能力,加深對(duì)操作系統(tǒng)課程的理解。使學(xué)生更好地
掌握操作系統(tǒng)的基本概念、基本原理、及基本功能,具有分析實(shí)際操作系統(tǒng)、設(shè)
計(jì)、構(gòu)造和開發(fā)現(xiàn)代操作系統(tǒng)的基本能力。
本實(shí)驗(yàn)指導(dǎo)書通過操作系統(tǒng)編程接口,提供一些編程指導(dǎo),以此加深學(xué)生對(duì)
操作系統(tǒng)工作原理的領(lǐng)會(huì)和對(duì)操作系統(tǒng)實(shí)現(xiàn)方法的理解,并且使學(xué)生在操作系統(tǒng)
層面的程序設(shè)計(jì)得到基本的訓(xùn)練。
本書提供了操作系統(tǒng)的安裝與使用、生產(chǎn)者和消費(fèi)者的問題、銀行家調(diào)度算
法、操作系統(tǒng)內(nèi)存結(jié)構(gòu)、簡(jiǎn)單文件系統(tǒng)的實(shí)現(xiàn)以及操作系統(tǒng)構(gòu)成實(shí)驗(yàn)等6個(gè)實(shí)驗(yàn)。
本書的使用對(duì)象是曲阜師范大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)(本科)的學(xué)生。
實(shí)驗(yàn)一操作系統(tǒng)的安裝與使用
1.實(shí)驗(yàn)?zāi)康?/p>
(1)鞏固課程中講授的WINDOWSXP的使用知識(shí),提高學(xué)生的WINDOWS
XP或WINDOWSSEVER2003等操作系統(tǒng)的實(shí)戰(zhàn)演練水平。
(2)熟悉WindowsXP等操作系統(tǒng)系統(tǒng)的定制安裝過程,明確各安裝部件的
作用。要求學(xué)生掌握?qǐng)D形用戶接口元素和圖形用戶接口元素的基本操作;熟悉控
制面板中各組件的作用及設(shè)置;能夠了解Windows系統(tǒng)對(duì)各種軟件資源和硬件
資源管理的策略。
(3)結(jié)合教材緒論,讓學(xué)生對(duì)WINDOWS系統(tǒng)進(jìn)程管理、處理機(jī)的調(diào)度與
死鎖、存儲(chǔ)器管理、設(shè)備管理、文件管理以及系統(tǒng)接口有一個(gè)感性的認(rèn)識(shí)并熟悉
相關(guān)操作。
2.實(shí)驗(yàn)預(yù)備知識(shí)
(1)閱讀教材第一章(操作系統(tǒng)引論),熟悉操作系統(tǒng)的目標(biāo)、作用和層次;
了解操作系統(tǒng)的發(fā)展過程;熟悉操作系統(tǒng)實(shí)現(xiàn)的功能(存儲(chǔ)器管理功能、處理機(jī)
管理功能、設(shè)備管理功能、文件管理功能以及用戶接口);了解操作系統(tǒng)的發(fā)展
的歷史和未來的發(fā)展趨勢(shì)。
(2)完成一本W(wǎng)INDOWS操作系統(tǒng)技術(shù)書籍的閱讀(根據(jù)個(gè)人情況任選)。
(3)學(xué)習(xí)微軟認(rèn)證(MCSE)中有關(guān)WINDOWS2003操作系統(tǒng)的知識(shí)(通
過課堂補(bǔ)充教授、閱讀有關(guān)書籍或網(wǎng)上資料)。
3.實(shí)驗(yàn)環(huán)境
(1)PC計(jì)算機(jī);
(2)WINDOWSXP或WINDOWSSEVER2003等操作系統(tǒng)的安裝盤。
4.實(shí)驗(yàn)時(shí)間:2個(gè)機(jī)時(shí)。
5.實(shí)驗(yàn)內(nèi)容
(1)了解安裝WINDOWSXP和WINDOWSSEVER2003的硬件需求;
熟悉安裝過程。熟悉安裝過程中各種組件的選擇;設(shè)置操作系統(tǒng)雙重啟動(dòng);
熟悉各種物理設(shè)備驅(qū)動(dòng)程序的安裝。
(2)熟悉WINDOWSXP的用戶界面。重點(diǎn)掌握各類操作系統(tǒng)的各類用戶
接口;掌握資源管理器的使用。
(3)掌握對(duì)操作系統(tǒng)的配置和維護(hù),掌握控制面板的使用。掌握安裝和刪
除硬件設(shè)備的方法,熟練對(duì)打印機(jī)、鼠標(biāo)、鍵盤、網(wǎng)卡、顯示卡、聲卡等硬件設(shè)
備進(jìn)行配置。
(4)了解網(wǎng)絡(luò)的配置和網(wǎng)絡(luò)協(xié)議的原理和設(shè)置,熟練對(duì)計(jì)算機(jī)進(jìn)行網(wǎng)絡(luò)設(shè)
置。
(5)熟練掌握WINDOWSXP的管理工具。利用“計(jì)算機(jī)管理”選項(xiàng)對(duì)計(jì)
算機(jī)進(jìn)行設(shè)置?!坝?jì)算機(jī)管理工具”為用戶提供六種系統(tǒng)工具:“事件查看器”,
“系統(tǒng)信息”、“性能日志和警報(bào)”,“共享文件夾”、設(shè)備管理器“和”本地用戶
和組。
(6)了解WINDOWSXP活動(dòng)目錄。目錄是一個(gè)存儲(chǔ)對(duì)象信息的分層結(jié)構(gòu),
要求學(xué)生掌握配置活動(dòng)目錄的方法。
(7)掌握WINDOWSXP的存儲(chǔ)管理。要求學(xué)生掌握以下內(nèi)容:WINDOWS
XP的基本存儲(chǔ)和動(dòng)態(tài)存儲(chǔ);智能鏡像、存儲(chǔ)工具、視圖的設(shè)置和硬盤轉(zhuǎn)換、動(dòng)
態(tài)磁盤中的卷以及相關(guān)卷的操作、磁盤碎片整理程序。
(8)熟悉用WINDOWS任務(wù)管理器來觀察計(jì)算機(jī)的應(yīng)用程序列表、進(jìn)程列
表以及系統(tǒng)的處理機(jī)使用情況、內(nèi)存分配和使用情況、句柄數(shù)、線程數(shù)等等。
6.思考
WINDOWS操作系統(tǒng)中如何實(shí)現(xiàn)了處理機(jī)管理、內(nèi)存管理、設(shè)備管理、文件
管理和磁盤管理?如何操作?
有條件的同學(xué)可參閱有關(guān)UNIX、LINUX或MINIX書籍和上機(jī)實(shí)踐,思考
和了解在UNIX、LINUX或MINIX操作系統(tǒng)中是如何實(shí)現(xiàn)了處理機(jī)管理、內(nèi)存
管理、設(shè)備管理、文件管理和磁盤管理?
實(shí)驗(yàn)二EOS實(shí)驗(yàn)環(huán)境的使用
實(shí)驗(yàn)性質(zhì):驗(yàn)證
建議學(xué)時(shí):2學(xué)時(shí)
一、實(shí)驗(yàn)?zāi)康?/p>
?熟悉操作系統(tǒng)集成實(shí)驗(yàn)環(huán)境OSLab的基本使用方法。
?練習(xí)編譯、調(diào)試EOS操作系統(tǒng)內(nèi)核以及EOS應(yīng)用程序。
二、預(yù)備知識(shí)
閱讀《EOS實(shí)驗(yàn)指南》第章,對(duì)EOS操作系統(tǒng)和集成實(shí)驗(yàn)環(huán)境有一個(gè)初步的了解。
三、實(shí)驗(yàn)內(nèi)容
3.1啟動(dòng)OSLab
1.在安裝有OSLab的主機(jī)上,可以使用兩種不同的方法來啟動(dòng)OSLab:
?在桌面上雙擊“TevationOSLab”圖標(biāo)。
?點(diǎn)擊“開始”菜單,在“程序”中的“TevationOSLabw中選擇“Tevation
OSLab”。
2.OSLab每次啟動(dòng)后都會(huì)首先彈出一個(gè)用于注冊(cè)用戶信息的對(duì)話框(可以選擇對(duì)話
框標(biāo)題欄上的“幫助”按鈕獲得關(guān)于此對(duì)話框的幫助信息)。在此對(duì)話框中填入學(xué)
號(hào)和姓名后,點(diǎn)擊“確定”按鈕完成本次注冊(cè)。
3.觀察OSLab主窗口的布局。OSLab主要由下面的若干元素組成:菜單欄、工具欄
以及停靠在左側(cè)和底部的各種工具窗口,余下的區(qū)域用來放置編輯器窗口。
3.2學(xué)習(xí)OSLab的基本使用方法
通過練習(xí)使用OSLab編寫一個(gè)Windows控制臺(tái)應(yīng)用程序,熟悉OSLab的基本使用方法
(主要包括新建項(xiàng)目、生成項(xiàng)目、調(diào)試項(xiàng)目等)。
3.2.1新建Windows控制臺(tái)應(yīng)用程序項(xiàng)目
新建一個(gè)Windows控制臺(tái)應(yīng)用程序項(xiàng)目的步驟如下:
1.在“文件”菜單中選擇“新建”,然后單擊“項(xiàng)目”。
2.在“新建項(xiàng)目”對(duì)話框中,選擇項(xiàng)目模板“控制臺(tái)應(yīng)用程序(c)”。
3.在“名稱”中輸入新項(xiàng)目使用的文件夾名稱“oslab”。
4.在“位置”中輸入新項(xiàng)目保存在磁盤上的位置“C:\Test”。
5.點(diǎn)擊“確定”按鈕。
新建完畢后,OSLab會(huì)自動(dòng)打開這個(gè)新建的項(xiàng)目。在“項(xiàng)目管理器”窗口中,樹的根
節(jié)點(diǎn)表示項(xiàng)目,可以看到項(xiàng)目的名稱是“console”,各個(gè)子節(jié)點(diǎn)是項(xiàng)目包含的文件夾或者
文件。此項(xiàng)目的源代碼主要包含一個(gè)頭文件“console/”和一個(gè)C語言源文件
Kconsole,c”,如圖1,
使用Windows資源管理器打開磁盤上的"C:\test\oslab”文件夾查看項(xiàng)目中包含的文
件(提示,在“項(xiàng)目管理器”窗口的項(xiàng)目節(jié)點(diǎn)上點(diǎn)擊右鍵,然后在彈出的快捷菜單中選擇“打
開所在的文件夾”即可)。
項(xiàng)目管理器
console項(xiàng)目節(jié)點(diǎn)
gu頭文件文件夾節(jié)點(diǎn)
_h]console,h文件節(jié)點(diǎn)
日D源文件
?console,c
圖1:打開Windows控制臺(tái)應(yīng)用程序項(xiàng)目后的“項(xiàng)目管理器”窗口
3.2.2生成項(xiàng)目
使用“生成項(xiàng)目”功能可以將程序的源代碼編譯為可執(zhí)行的二進(jìn)制文件,方法十分簡(jiǎn)
單:在“生成”菜單中選擇“生成項(xiàng)目”。
在項(xiàng)目的生成過程中,“輸出”窗口會(huì)實(shí)時(shí)顯示生成的進(jìn)度和結(jié)果。如果源代碼中不
包含語法錯(cuò)誤,會(huì)在最后提示生成成功,如圖2:
輸出
生成,,,款〔三
已啟動(dòng)生成:項(xiàng)目:console,配置:Debug
正在編譯...
console,c
正在鏈接...
console-統(tǒng)計(jì)到0個(gè)錯(cuò)誤,0個(gè)警告
====================生成:成功====================
圖2:成功生成Windows控制臺(tái)應(yīng)用程序項(xiàng)目后的“輸出”窗口
如果源代碼中存在語法錯(cuò)誤,“輸出”窗口會(huì)輸出相應(yīng)的錯(cuò)誤信息(包括錯(cuò)誤所在文件
的路徑,錯(cuò)誤在文件中的位置,以及錯(cuò)誤原因),并在最后提示生成失敗。此時(shí)在“輸出”
窗口中雙擊錯(cuò)誤信息所在的行,OSLab會(huì)使用源代碼編輯器打開錯(cuò)誤所在的文件,并自動(dòng)
定位到錯(cuò)誤對(duì)應(yīng)的代碼行??梢栽谠创a中故意輸入一些錯(cuò)誤的代碼(例如刪除一個(gè)代碼行
結(jié)尾的分號(hào)),然后再次生成項(xiàng)目,練習(xí)在“輸出”窗口中雙擊錯(cuò)誤信息來定位存在錯(cuò)誤的
代碼行,將代碼修改正確后再生成項(xiàng)目。
生成過程是將每個(gè)源代碼文件(.c、.cpp、.asm等文件)編譯為一個(gè)對(duì)象文件(.。文
件),然后再將多個(gè)對(duì)象文件鏈接為一個(gè)目標(biāo)文件(.exe、.dll等文件)。成功生成Windows
控制臺(tái)應(yīng)用程序項(xiàng)目后,默認(rèn)會(huì)在"C:\test\oslab\debug”目錄下生成一個(gè)名稱為
“console.?!钡膶?duì)象文件和名稱為wconsole.exew的Windows控制臺(tái)應(yīng)用程序,可以使
用Windows資源管理器查看這些文件。
3.2.3執(zhí)行項(xiàng)目
在OSLab中選擇“調(diào)試”菜單中的“開始執(zhí)行(不調(diào)試)”,可以執(zhí)行此控制臺(tái)應(yīng)用程
序.啟動(dòng)執(zhí)行后會(huì)彈出一個(gè)Windows控制臺(tái)窗口,顯示控制臺(tái)應(yīng)用程序輸出的內(nèi)容。按任意
健即可關(guān)閉此控制臺(tái)窗口。
3.2.4調(diào)試項(xiàng)目
OSLab提供的調(diào)試器是一個(gè)功能強(qiáng)大的工具,使用此調(diào)試器可以觀察程序的運(yùn)行時(shí)行
為并確定邏輯錯(cuò)誤的位置,可以中斷(或掛起)程序的執(zhí)行以檢查代碼,計(jì)算和編輯程序中
的變量,查看寄存器,以及查看從源代碼創(chuàng)建的指令。為了順利進(jìn)行后面的各項(xiàng)實(shí)驗(yàn),應(yīng)該
學(xué)會(huì)靈活使用這些調(diào)試功能。
在練習(xí)各種調(diào)試功能之前,需要對(duì)例子程序進(jìn)行必要的修改,步驟如下:
1.右鍵點(diǎn)擊“項(xiàng)目管理器”窗口中的“源文件”文件夾節(jié)點(diǎn),在彈出的快捷菜單中選
擇“添加”中的“添加新文件”。
2.在彈出的“添加新文件”對(duì)話框中選擇“C源文件”模板。
3.在“名稱”中輸入文件名稱“func”。
4.點(diǎn)擊“添加”按鈕添加并自動(dòng)打開文件func.c,此時(shí)的“項(xiàng)目管理器”窗口如圖3:
項(xiàng)目管理器
曰console
$&頭文件
h]console,h
白O源文件
?…回console,c
L向func.c
圖3:添加func.c文件后的“項(xiàng)目管理器”窗口
5.在func.c文件中添加函數(shù):
intFunc(intn)
n=n+1;
returnn;
6.點(diǎn)擊源代碼編輯器上方的console,c標(biāo)簽,切換到console,c文件。將main函數(shù)
修改為:
intmain(intargc,char*argv[])
intFunc(intn);//聲明Func函數(shù)
intn=0;
n=Func(10);
printf("HelloWorld!\n");
return0;
|
代碼修改完畢后按F7(“生成項(xiàng)目”功能的快捷鍵)。注意查看“輸出”窗口中的內(nèi)容,
如果代碼中存在語法錯(cuò)誤,就根據(jù)錯(cuò)誤信息進(jìn)行修改,直到成功生成項(xiàng)目。
3.2.4.1使用斷點(diǎn)中斷執(zhí)行
1.在main函數(shù)中定義變量n的代碼行
intn=0;
上點(diǎn)擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“插入/刪除斷點(diǎn)”,會(huì)在此行左側(cè)的
空白處顯示了一個(gè)紅色圓點(diǎn),表示已經(jīng)成功在此行代碼處添加了一個(gè)斷點(diǎn),如圖4:
intFunc(intn);//聲明Func函數(shù)
intn=0;
n=Func(10);
printf("HelioWorld!\n");
圖4:在console,c文件的main函數(shù)中添加斷點(diǎn)后的代碼行
2.在“調(diào)試”菜單中選擇“啟動(dòng)調(diào)試",Windows控制臺(tái)應(yīng)用程序開始執(zhí)行,隨后
OSLab窗口被自動(dòng)激活,并且在剛剛添加斷點(diǎn)的代碼行左側(cè)空白中顯示了一個(gè)黃
色箭頭,表示程序已經(jīng)在此行代碼處中斷執(zhí)行(也就是說下一個(gè)要執(zhí)行的就是此
行代碼),如圖5:
intFunc(intn);//聲明Func函數(shù)
intn=0;
n=Func(10);
printf("HelioWorld!\n");
圖5:Windows控制臺(tái)應(yīng)用程序啟動(dòng)調(diào)試后在斷點(diǎn)處中斷執(zhí)行
3.激活Windows控制臺(tái)應(yīng)用程序的窗口,可以看到窗口中沒有輸出任何內(nèi)容,因?yàn)?/p>
printf函數(shù)還沒有被執(zhí)行。
3.2.4.2單步調(diào)試
按照下面的步驟練習(xí)使用“逐過程”功能:
1.在OSLab的“調(diào)試”菜單中選擇“逐過程”,“逐過程”功能會(huì)執(zhí)行黃色箭頭當(dāng)
前指向的代碼行,并將黃色箭頭指向下?個(gè)要執(zhí)行的代碼行。
2.按F10(“逐過程”功能的快捷鍵),黃色箭頭就指向了調(diào)用printf函數(shù)的代碼行。
查看控制臺(tái)應(yīng)用程序窗口,仍然沒有任何輸出。
3.再次按F10執(zhí)行printf函數(shù),查看控制臺(tái)應(yīng)用程序窗口,可以看到已經(jīng)打印出了
內(nèi)容。
4.仔細(xì)體會(huì)“逐過程”調(diào)試功能后,在“調(diào)試”菜單中選擇“停止調(diào)試”,結(jié)束此
次調(diào)試。
按照下面的步驟練習(xí)使用“逐語句”功能和“跳出”功能:
1.按F5(“啟動(dòng)調(diào)試”功能的快捷鍵),仍然會(huì)在之前設(shè)置的斷點(diǎn)處中斷。
2.按F10逐過程調(diào)試,此時(shí)黃色箭頭指向了調(diào)用函數(shù)Func的代碼行。
3.在“調(diào)試”菜單中選擇“逐語句”,可以發(fā)現(xiàn)黃色箭頭指向了函數(shù)Func中,說明
“逐語句”功能可以進(jìn)入函數(shù)來調(diào)試函數(shù)中的語句。
4.選擇“調(diào)試”菜單中的“跳出”,會(huì)跳出Func函數(shù),返回到上級(jí)函數(shù)中繼續(xù)調(diào)試
(此時(shí)Func函數(shù)已經(jīng)執(zhí)行完畢)。
5.按SHIFT+F5(“停止調(diào)試”功能的快捷鍵),結(jié)束此次調(diào)試。
自己練習(xí)使用“逐過程”、“逐語句”和“跳出”功能,注意體會(huì)“逐過程”和“逐語
句”的不同。
3.2.4.3查看變量的值
在調(diào)試的過程中,OSLab提供了三種查看變量值的方法,按照下面的步驟練習(xí)這些方
法:
1.按F5啟動(dòng)調(diào)試,仍然會(huì)在之前設(shè)置的斷點(diǎn)處中斷。
2.將鼠標(biāo)移動(dòng)到源代碼編輯器中變量n的名稱上,此時(shí)會(huì)彈出一個(gè)窗口顯示出變量n
當(dāng)前的值(由于此時(shí)還沒有給變量n賦值,所以是一個(gè)隨機(jī)值)。
3.在源代碼編輯器中變量n的名稱上點(diǎn)擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“快
速監(jiān)視”,可以使用“快速監(jiān)視”對(duì)話框查看變量n的值。點(diǎn)擊“關(guān)閉”按鈕關(guān)
閉“快速監(jiān)視”對(duì)話框。
4.在源代碼編輯器中變量n的名稱上點(diǎn)擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添
加監(jiān)視”,變量n就被添加到了“監(jiān)視”窗口中。使用“監(jiān)視”窗口可以隨時(shí)查
看變量的值和類型。此時(shí)按F10進(jìn)行一次單步調(diào)試,可以看到“監(jiān)視”窗口中變
量n的值會(huì)變?yōu)?,如圖6:
監(jiān)視
名稱值類型
n0x0int
圖6:使用“監(jiān)視”窗口查看變量的值和類型
如果需要使用十進(jìn)制查看變量的值,可以點(diǎn)擊工具欄上的“十六進(jìn)制”按鈕,從而在
十六進(jìn)制和十進(jìn)制間切換。自己練習(xí)使用不同的進(jìn)制和不同的方法來查看變量的值,然后結(jié)
束此次調(diào)試。
3.2.4.4調(diào)用堆棧
使用“調(diào)用堆?!贝翱诳梢栽谡{(diào)試的過程中查看當(dāng)前堆棧上的函數(shù),幫助理解函數(shù)的
調(diào)用層次和調(diào)用過程。按照下面的步驟練習(xí)使用“調(diào)用堆棧”窗口:
1.按F5啟動(dòng)調(diào)試,仍然會(huì)在之前設(shè)置的斷點(diǎn)處中斷。
2.選擇“調(diào)試”菜單“窗口”中的“調(diào)用堆棧”,激活“調(diào)用堆?!贝翱???梢钥?/p>
到當(dāng)前“調(diào)用堆?!贝翱谥兄挥幸粋€(gè)main函數(shù)(包括參數(shù)值和函數(shù)地址)。
3.按FH(“逐語句”功能的快捷鍵)調(diào)試進(jìn)入Func函數(shù),查看“調(diào)用堆棧”窗口可
以發(fā)現(xiàn)在堆棧上有兩個(gè)函數(shù)Func和main,其中當(dāng)前正在調(diào)試的Func函數(shù)在棧頂
位置,main函數(shù)在棧底位置。說明是在main函數(shù)中調(diào)用了Func函數(shù)。
4.在“調(diào)用堆?!贝翱谥须p擊main函數(shù)所在的行,會(huì)有一個(gè)綠色箭頭指向main函
數(shù)所在的行,表示此函數(shù)是當(dāng)前調(diào)用堆棧中的活動(dòng)函數(shù)。同時(shí)會(huì)將main函數(shù)所在
的源代碼文件打開,并也使用一個(gè)綠色箭頭指向Func函數(shù)返回后的位置。
5.在“調(diào)用堆?!贝翱谥须p擊Func函數(shù)所在的行,可以重新激活此堆棧幀,并顯示
對(duì)應(yīng)的源代碼。
6.反復(fù)雙擊“調(diào)用堆?!贝翱谥蠪unc函數(shù)和main函數(shù)所在的行,查看“監(jiān)視”窗
口中變量n的值,可以看到在不同的堆棧幀被激活時(shí),OSLab調(diào)試器會(huì)自動(dòng)更新
“監(jiān)視”窗口中的數(shù)據(jù),顯示出對(duì)應(yīng)于當(dāng)前活動(dòng)堆棧幀的信息。
7.結(jié)束此次調(diào)試。
3.3EOS內(nèi)核項(xiàng)目的生成和調(diào)試
之前練習(xí)了對(duì)Windows控制臺(tái)應(yīng)用程序項(xiàng)目的各項(xiàng)操作,對(duì)EOS內(nèi)核項(xiàng)目的各項(xiàng)操作
(包括新建、生成和各種調(diào)試功能等)與對(duì)Windows控制臺(tái)項(xiàng)目的操作是完全一致的。所以,
接下來實(shí)驗(yàn)內(nèi)容的重點(diǎn)不再是各種操作的具體步驟,而應(yīng)將注意力放在對(duì)EOS內(nèi)核項(xiàng)目的理
解上。
3.3.1新建EOS內(nèi)核項(xiàng)目
新建一個(gè)EOS內(nèi)核項(xiàng)目的步驟如下:
1.在“文件”菜單中選擇“新建”,然后單擊“項(xiàng)目”。
2.在“新建項(xiàng)目”對(duì)話框中,選擇項(xiàng)目模板“EOSKernel”?
3.在“名稱”中輸入新項(xiàng)目使用的文件夾名稱“eos”。
4.在“位置”中輸入新項(xiàng)目保存在磁盤上的位置“C:\”。
5.點(diǎn)擊“確定”按鈕。
此項(xiàng)目就是一個(gè)EOS操作系統(tǒng)內(nèi)核項(xiàng)目,包含了EOS操作系統(tǒng)內(nèi)核的所有源代碼文件。
在“項(xiàng)目管理器”窗口中查看EOS內(nèi)核項(xiàng)目包含的文件夾和源代碼文件,可以看到不同
的文件夾包含了EOS操作系統(tǒng)不同模塊的源代碼文件,例如“mm”文件夾中包含了內(nèi)存管理
模塊的源代碼文件,“boot”文件夾中包含了軟盤引導(dǎo)扇區(qū)程序和加載程序的源代碼文件。
也可以使用Windows資源管理器打開項(xiàng)目所在的文件夾C:\eos,查看所有源代碼文件。
3.3.2生成項(xiàng)目
1.按F7生成項(xiàng)目,同時(shí)查看“輸出”窗口中的內(nèi)容,確認(rèn)生成成功。
2.打開C:\eos\debug文件夾,查看生成的對(duì)象文件和目標(biāo)文件。找到boot.bin、
loader,bin和kernel,dll三個(gè)二進(jìn)制文件,這三個(gè)文件就是EOS操作系統(tǒng)在運(yùn)行
時(shí)需要的可執(zhí)行文件。OSLab每次啟動(dòng)運(yùn)行EOS操作系統(tǒng)之前,都會(huì)將這三個(gè)文
件寫入個(gè)軟盤鏡像文件中,然后讓虛擬機(jī)運(yùn)行這個(gè)軟盤鏡像中的EOS(相當(dāng)于將
寫有這三個(gè)二進(jìn)制文件的軟盤放入一個(gè)物理機(jī)的軟盤驅(qū)動(dòng)器中,然后按下開機(jī)按
鈕)。找到libkernel.a文件,此文件是EOS內(nèi)核文件kernel,dll對(duì)應(yīng)的導(dǎo)入庫
文件。
3.3.3調(diào)試項(xiàng)目
1.在“項(xiàng)目管理器”窗口的ke文件夾中找到start.c文件節(jié)點(diǎn),雙擊此文件節(jié)點(diǎn)使
用源代碼編輯器打開start.c文件。
2.在start.c文件中KiSystemStartup函數(shù)的"KilnitializePicO;”語句所在行
(第61行)添加一個(gè)斷點(diǎn),如圖7:
60//
。61KilnitializePic();
62KilnitializePit();
圖7:在EOS內(nèi)核項(xiàng)目的ke/start.c文件的第61行添加一個(gè)斷點(diǎn)
3.按F5啟動(dòng)調(diào)試,虛擬機(jī)開始運(yùn)行軟盤鏡像中的EOS。在虛擬機(jī)窗口中可以看到EOS
啟動(dòng)的過程。隨后EOS會(huì)在剛剛添加的斷點(diǎn)處中斷執(zhí)行。激活虛擬機(jī)窗口可以看
到EOS也不再繼續(xù)運(yùn)行了。各種調(diào)試功能(包括單步調(diào)試、查看變量的值和各個(gè)
調(diào)試工具窗口)的使用方法與調(diào)試Windows控制臺(tái)程序完全相同,可以自己練習(xí)。
4.按F5繼續(xù)執(zhí)行。查看虛擬機(jī)窗口,顯示EOS操作系統(tǒng)已經(jīng)啟動(dòng),并且EOS的控制
臺(tái)程序已經(jīng)開始運(yùn)行了。
5.在“調(diào)試”菜單中選擇“停止調(diào)試”,結(jié)束此次調(diào)試。
3.3.4查看軟盤鏡像文件中的內(nèi)容
在''項(xiàng)目管理器“窗口中雙擊軟盤鏡像文件Floppy,img,就會(huì)使用FloppyImageEditor
工具打開此文件(在FloppyImageEditor工具中按Fl可以查看此工具的幫助文件)。在
FloppylmageEditor工具的文件列表中可以找到loader,bin文件和kernel,dll文件,這兩
個(gè)文件都是在啟動(dòng)調(diào)試時(shí)被寫入軟盤鏡像文件的(可以查看這兩個(gè)文件的修改日期)。
boot.bin文件在啟動(dòng)調(diào)試時(shí)被寫入了軟盤鏡像的引導(dǎo)扇區(qū)中,不受軟盤文件系統(tǒng)的管理,
所以在文件列表中找不到此文件。關(guān)閉FloppylmageEditor工具。
3.3.5查看EOSSDK(SoftwareDevelopmentKit)文件夾
1.點(diǎn)擊OSLab工具欄上的“項(xiàng)目配置”下拉列表,選擇下拉列表中的“Release”項(xiàng)
目配置,“Release”項(xiàng)目配置被設(shè)置為新的活動(dòng)項(xiàng)目配置(原來的活動(dòng)項(xiàng)目配置
是“Debug")。如圖8:
,?〔Debug漕WRITE_PORT_UCHAR內(nèi)國
[Debug
:事事:二2」GQ制》Q£幽Release
圖8:使用工具欄上的“項(xiàng)目配置”下拉列表切換活動(dòng)項(xiàng)目配置
2.按F7使用Release配置生成項(xiàng)目。
3.生成完畢后,使用Windows資源管理器打開C:\eos文件夾,可以發(fā)現(xiàn)在文件夾中
多出了一個(gè)SDK文件夾,此文件夾就是在生成EOSKernel項(xiàng)目的同時(shí)自動(dòng)生成的。
4.SDK文件夾中提供了開發(fā)EOS應(yīng)用程序需要的所有文件。打開SDK文件夾中的bin
文件夾,可以看到有兩個(gè)名稱分別為debug和release的文件夾。debug文件夾是
在使用debug配置生成項(xiàng)目時(shí)生成的,其中存放了調(diào)試版本的EOS二進(jìn)制文件。
release文件夾是在使用release配置生成項(xiàng)目時(shí)生成的,其中存放了發(fā)布版本的
EOS二進(jìn)制文件(不包含調(diào)試信息)。分別打開這兩個(gè)文件夾查看其中包含的文件。
5.打開SDK文件夾中的inc文件夾,可以看到此文件夾中存放了EOS用于導(dǎo)出API
函數(shù)和重要數(shù)據(jù)類型定義的頭文件,在編寫EOS應(yīng)用程序時(shí)必須包含這些頭文件。
每次在開發(fā)EOS應(yīng)用程序之前都應(yīng)該使用EOSKernel項(xiàng)目的debug配置和release配
置來生成EOSKernel項(xiàng)目,這樣才能夠得到完全版本的SDK文件夾供EOS應(yīng)用程序使用。
結(jié)合《EOS實(shí)驗(yàn)指南》第一章中關(guān)于EOS內(nèi)核從源代碼到可在虛擬機(jī)中運(yùn)行過程的介紹,
仔細(xì)體會(huì)EOS內(nèi)核項(xiàng)目生成、調(diào)試的過程,以及EOSSDK文件夾生成的過程和組織方式。
3.4EOS應(yīng)用程序項(xiàng)目的生成和調(diào)試
3.4.1新建EOS應(yīng)用程序項(xiàng)目
新建一個(gè)EOS內(nèi)核項(xiàng)目的步驟如下:
1.在“文件”菜單中選擇“新建”,然后單擊“項(xiàng)目”。
2.在“新建項(xiàng)目”對(duì)話框中,選擇項(xiàng)目模板“EOS應(yīng)用程序”。
3.在“名稱”中輸入新項(xiàng)目使用的文件夾名稱“eosapp”。
4.在“位置”中輸入新項(xiàng)目保存在磁盤上的位置“C:\”。
5.點(diǎn)擊“確定”按鈕。
此項(xiàng)目就是一個(gè)EOS應(yīng)用程序項(xiàng)目。
使用Windows資源管理器將之前生成的C:\eos\sdk文件夾拷貝覆蓋到C:\eosapp\sdk
位置。這樣EOS應(yīng)用程序就可以使用最新版本的EOSSDK文件夾了。
3.4.2生成項(xiàng)目
1.按F7生成項(xiàng)目,同時(shí)查看“輸出”窗口中的內(nèi)容,確認(rèn)生成成功。
2.打開C:\eosapp\debug文件夾,查看生成的對(duì)象文件和目標(biāo)文件。其中的
EOSApp.exe就是EOS應(yīng)用程序的可執(zhí)行文件。OSLab每次啟動(dòng)執(zhí)行EOS應(yīng)用程序
時(shí),都會(huì)將EOS應(yīng)用程序的可執(zhí)行文件寫入軟盤鏡像,并且會(huì)將SDK文件夾中時(shí)
應(yīng)配置(Debug或Release)的二進(jìn)制文件寫入軟盤鏡像,然后讓虛擬機(jī)運(yùn)行軟盤
鏡像中的EOS,待EOS啟動(dòng)后再自動(dòng)執(zhí)行EOS應(yīng)用程序。
3.4.3調(diào)試項(xiàng)目
調(diào)試EOS應(yīng)用程序項(xiàng)目與之前的兩個(gè)項(xiàng)目有較大的不同,之前的兩個(gè)項(xiàng)目在調(diào)試時(shí)都
是先添加斷點(diǎn)再啟動(dòng)調(diào)試,而EOS應(yīng)用程序項(xiàng)目必須先啟動(dòng)調(diào)試再添加斷點(diǎn),步驟如下:
1.按F5啟動(dòng)調(diào)試。OSLab會(huì)彈出?個(gè)調(diào)試異常對(duì)話框,選擇“是”調(diào)試異常,EOS
應(yīng)用程序會(huì)中斷執(zhí)行,黃色箭頭指向下一個(gè)要執(zhí)行的代碼行。
2.在eosapp.c的
printf("Helloworld!\n/z);
代碼行添加一個(gè)斷點(diǎn),然后按F5繼續(xù)調(diào)試,在此斷點(diǎn)處中斷。
3.按F10單步調(diào)試,查看虛擬機(jī)窗口,打印輸出了“Hell。world!”。
4.按F5繼續(xù)調(diào)試,查看虛擬機(jī)窗口,EOS應(yīng)用程序執(zhí)行完畢。
5.在“調(diào)試”菜單中選擇“停止調(diào)試”,調(diào)試被終止。
6.選擇“調(diào)試”菜單中的“刪除所有斷點(diǎn)”。只有刪除所有斷點(diǎn)后才能按F5再次啟
動(dòng)調(diào)試,否則啟動(dòng)調(diào)試會(huì)失敗。
3.4.4查看軟盤鏡像文件中的內(nèi)容
使用FloppyImageEditor工具打開該項(xiàng)目中的Floppy.img文件,查看軟盤鏡像中的文
件。loader,bin和kernel,dll是從C:\eosapp\sdk\bin\debug文件夾寫入的,
C:\eosapp\sdk\bin\debug\boot.bin被寫入了軟盤鏡像文件的引導(dǎo)扇區(qū)中。eosapp.exe就
是本項(xiàng)目生成的EOS應(yīng)用程序。EOS操作系統(tǒng)啟動(dòng)后會(huì)根據(jù)autorun.txt文本文件中的內(nèi)容
啟動(dòng)執(zhí)行eosapp.exe程序,雙擊autorun.txt文件查看其內(nèi)容。
結(jié)合《EOS實(shí)驗(yàn)指南》第一章中關(guān)于EOS應(yīng)用程序從源代碼到可在虛擬機(jī)中運(yùn)行過程的
介紹,仔細(xì)體會(huì)EOS應(yīng)用程序項(xiàng)目生成、調(diào)試的過程,以及EOS應(yīng)用程序是如何使用EOSSDK
文件夾的。
3.5退出OSLab
1.在“文件”菜單中選擇“退出”。
2.在OSLab關(guān)閉前會(huì)彈出一個(gè)保存數(shù)據(jù)對(duì)話框(可以選擇對(duì)話框標(biāo)題欄上的“幫
助”按鈕獲得幫助信息),核對(duì)學(xué)號(hào)和姓名無誤后點(diǎn)擊“保存”按鈕,OSLab關(guān)閉。
3.在OSLab關(guān)閉后默認(rèn)會(huì)自動(dòng)使用Windows資源管理器打開數(shù)據(jù)文件所在的文件夾,
并且選中剛剛保存的數(shù)據(jù)文件(OUD文件)。將數(shù)據(jù)文件備份(例如拷貝到自己的
U盤中或者發(fā)送到服務(wù)器上),做為本次實(shí)驗(yàn)的考評(píng)依據(jù)。
3.6保存EOS內(nèi)核項(xiàng)目
如果要在課余時(shí)間閱讀EOS源代碼,或者調(diào)試EOS源代碼,可以按照下面的步驟操作:
1.使用OSLab重新打開之前創(chuàng)建的EOS內(nèi)核項(xiàng)目(啟動(dòng)OSLab后,在“起始頁”的
“最近的項(xiàng)目”列表中會(huì)有之前創(chuàng)建的EOS內(nèi)核項(xiàng)目的快捷方式“kernel")。
2.使用Debug配置生成此項(xiàng)目。再次啟動(dòng)調(diào)試此項(xiàng)目后結(jié)束調(diào)試,從而制作包含Debug
版本EOS操作系統(tǒng)的軟盤鏡像文件。
3.將此項(xiàng)目文件夾復(fù)制到自己的計(jì)算機(jī)中。注意,項(xiàng)目文件夾在磁盤中的位置不能改
變,例如實(shí)驗(yàn)中此項(xiàng)目在C:\eos位置,就必須復(fù)制到自己計(jì)算機(jī)中的C:\eos位置。
4.在自己的計(jì)算機(jī)中安裝OSLab演示版,使用演示版程序閱讀EOS源代碼,或者調(diào)
試EOS源代碼。
OSLab演示版程序可以使用教師分發(fā)的安裝包進(jìn)行安裝。建議使用和正式版版本號(hào)相
同的演示版程序。
四、思考與練習(xí)
?練習(xí)使用單步調(diào)試功能(逐過程、逐語句),體會(huì)在哪些情況下應(yīng)該使用“逐過程”調(diào)
試,在哪些情況下應(yīng)該使用“逐語句”調(diào)試。練習(xí)使用各種調(diào)試工具(包括“監(jiān)視”窗
口、“調(diào)用堆?!贝翱诘龋?。
?思考生成EOSSDK文件夾的目的和作用。查看EOSSDK文件夾中的內(nèi)容,明白文件夾的
組織結(jié)構(gòu)和各個(gè)文件的來源和作用。查看EOS應(yīng)用程序包含了SDK文件夾中的哪些頭文
件,是如何包含的?
五、相關(guān)閱讀
?啟動(dòng)osLab后,選擇“幫助”菜單中的“幫助主題”,閱讀幫助開始頁中的“如何:
使用代碼閱讀工具”,熟練使用各種代碼閱讀工具可以大大提高閱讀EOS源代碼的效
率。
?打開OSLab幫助左側(cè)的“目錄”標(biāo)簽,閱讀“參考”文件夾中的“如何:打開項(xiàng)目屬
性頁”、“如何:更改活動(dòng)項(xiàng)目配置”、“如何:為項(xiàng)目添加文件”。閱讀其它主題,
了解更多關(guān)于OSLab的信息。
?訪問http://\v\v\v.tovation,com了解關(guān)于OSLab的最新信息。登陸網(wǎng)站中的論壇,可
以在論壇中進(jìn)行答疑或者參與討論。
實(shí)驗(yàn)三生產(chǎn)者和消費(fèi)者的問題
1.實(shí)驗(yàn)?zāi)康?/p>
(1)加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。
(2)進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)。
(3)驗(yàn)證用信號(hào)量機(jī)制實(shí)現(xiàn)進(jìn)程互斥的方法。
(4)驗(yàn)證用信號(hào)機(jī)制實(shí)現(xiàn)進(jìn)程同步的方法。
2.實(shí)驗(yàn)預(yù)備內(nèi)容
(1)閱讀課本有關(guān)進(jìn)程管理以及進(jìn)程同步的有關(guān)章節(jié),對(duì)臨界區(qū)和臨界資
源概念要清晰,充分理解信號(hào)信號(hào)量機(jī)制。
(2)閱讀兒種經(jīng)典進(jìn)程同步問題的算法并理解。熟練掌握生產(chǎn)者一消費(fèi)者
的算法思想。
3.實(shí)驗(yàn)環(huán)境
(1)一臺(tái)運(yùn)行WindowsXP操作系統(tǒng)的計(jì)算機(jī)。
(2)選用以C、C++、visualC++、Java等任何一種語言。建議采用Java
多線程編程技術(shù)
4.實(shí)驗(yàn)時(shí)間:4個(gè)機(jī)時(shí)。
5.實(shí)驗(yàn)內(nèi)容
問題描述:考慮有一些生產(chǎn)者和消費(fèi)者進(jìn)程,生產(chǎn)者進(jìn)程生產(chǎn)信息并把它們
放入緩沖池中,消費(fèi)者從緩沖池中取走信息。生產(chǎn)者一消費(fèi)者問題是相互合作的
進(jìn)程關(guān)系的一種抽象,如在輸入時(shí),輸入進(jìn)程是生產(chǎn)者,計(jì)算進(jìn)程是消費(fèi)者;而
在輸出時(shí),則計(jì)算進(jìn)程是生產(chǎn)者,打印進(jìn)程是消費(fèi)者。請(qǐng)使用信號(hào)量機(jī)制來解決
生產(chǎn)者一消費(fèi)者問題。
一次只可放一個(gè)產(chǎn)品
互斥關(guān)系:
(I)設(shè)緩沖池有n個(gè)單元。
(II)當(dāng)n個(gè)單元裝滿時(shí),生產(chǎn)者必須等待。
(III)當(dāng)緩沖池空時(shí),消費(fèi)者必須等待。
6.參考算法
importjavax.swing.JTextArea;/*
*定義臨界資源:緩沖隊(duì)列**/
publicclassBuffers{JTextAreata;staticfinalintproductBu
fferNum=10;〃緩沖單元數(shù)
ProductBufferpBuffer[]=newProductBuffer[productBufferNum];/
/緩沖隊(duì)列
intin=0;〃緩沖單元指針,用于放產(chǎn)品
get()intout=0;〃緩沖單元指針,用于取產(chǎn)品
put()intconsumeProductNo;〃記錄消費(fèi)產(chǎn)品的編號(hào)
intusedBufferNum=0;〃記錄緩沖隊(duì)列已使用的緩沖單元個(gè)數(shù)
publicBuffers(JTextAreata){this,ta=ta;〃初始化
for(intj=0;j<productBufferNum;j++){pBuffer[j]=newProduc
tBuffer0;}
for(inti=0;i<productBufferNum;i++){pBuffer[i].product=-1
;pBuffer[i].hasProduct=false;}}〃取產(chǎn)品
publicsynchronizedvoidget(intid){〃緩沖隊(duì)列空則等待
if(usedBufferNum==0){try{super,wait();}catch(Excep
tione){e.printStackTrace();}}consumeProductNo=p
Buffer[out],product;〃取出產(chǎn)品
pBuffer[out],product=0;〃清空緩沖單元
pBuffer[out].hasProduct=false;〃置〃無產(chǎn)品〃標(biāo)識(shí)
usedBufferNum--;〃輸出本次取產(chǎn)品后緩沖隊(duì)列的情況
ta.append(〃消費(fèi)者〃+id+〃將產(chǎn)品〃+consumeProductNo+〃從緩沖單元
〃+out+〃取出,緩沖隊(duì)列狀態(tài)如下:\n〃);
printBuffer();
out=(out+1)%productBufferNum;〃更新指針
〃喚醒等待線程
super,notify();}//放產(chǎn)品
publicsynchronizedvoidput(intproductNo,intid){〃緩沖隊(duì)列
滿則等待
if(usedBufferNum==productBufferNum){try{super,wait0
;}catch(Exceptione){e.printStackTrace();}}pBu
ffer[in].product=productNo;〃放產(chǎn)品
pBuffer[in].hasProduct=true;〃置“有產(chǎn)品”標(biāo)識(shí)
usedBufferNum++;〃/輸出本次放入產(chǎn)品后,緩沖隊(duì)列的情況
ta.append(〃生產(chǎn)者〃+id+〃將產(chǎn)品〃+productNo+〃放入緩沖單元〃+ir)+〃,緩沖
隊(duì)列狀態(tài)如下:\n〃);
printBuffer();in=(in+1)%productBufferNum;〃更新指
針〃喚醒等待線程
super,notify();}〃打印緩沖隊(duì)列當(dāng)前情況
privatevoidprintBuffer(){ta.appendC,緩沖單元
編號(hào)產(chǎn)品編號(hào)緩沖單元狀態(tài)\n〃);
for(inti=0;i<productBufferNum;i++){ta.append(〃\t〃+i+〃\t〃+p
Buffer[i]?product+〃\t〃+pBuffer[i]?hasProduct+〃\n〃);}}}
importjava.awt.BorderLayout;
importjava.awt.event.ActionEvent;importjava.awt.event.ActionLi
stener;
importjavax.swing.JButton;importjavax.swing.JFrame;importjav
ax.swing.JPanel;
importjavax.swing.JScrollPane;importjavax.swing.JTextArea;/*
*生產(chǎn)者消費(fèi)者問題實(shí)現(xiàn)(可以有多個(gè)生產(chǎn)者消費(fèi)者)**/
publicclassProducerConsumerMainimplementsActionListener{bo
oleanisRun=true;〃用于控制線程結(jié)束
JTextAreata=newJTextAreaO;Buffersbuffers=newBuffers(t
a);〃緩沖隊(duì)列
staticfinalintproducerNum=8;〃生產(chǎn)者個(gè)數(shù)
staticfinalintconsumerNum=2;〃消費(fèi)者個(gè)數(shù)
ProducerThreadproThread[]=newProducerThread[producerNum];Co
nsumerThreadconThread[]=newConsumerThread[consumerNum];
Threadproducer[]=newThread[producerNum];Threadconsumer[]
=newThread[consumerNum];
publicProducerConsumerMain(){createUI0;//創(chuàng)建界
面〃創(chuàng)建多個(gè)生產(chǎn)者和消費(fèi)者線程并開始執(zhí)行
for(inti=0;i<producerNum;i++){proThread[i]=newProducer!
hread(i+l);producer[i]=newThread(proThread[i]);produce
r[i].start();}for(intj=0;j〈consumerNum;j++){conTh
read[j]=newConsumerThread(j+1);consumer[j]=newThread(co
nThreadtj]);consumer[j].start();}}
〃創(chuàng)建界面
publicvoidcreateUI0{JFrameframe=newJFrame(〃生產(chǎn)者消
費(fèi)者
〃);JPanelpanel=newJPanel(newBorderLayout());JScrollP
anescrPane=newJScrollPane(ta);panel.add(scrPane,BorderLay
out.CENTER);JButtonbutton=newJButton(〃停止
〃);button.addActionListener(this);panel,add(button,BorderL
ayout.SOUTH);frame,add(panel);frame.setVisible(true);fra
me.setSize(1000,500);frame.setDefaultCloseOperation(JFrame.EXI
T_ON_CLOSE);}
7/按鈕響應(yīng)事件
publicvoidactionPerformed(ActionEvente){isRun=false;//
控制線程結(jié)束System.out.printin(〃停止〃);)
publicstaticvoidmain(Stringargs[J){ProducerConsumerMainp
roducerConsumer=newProducerConsumerMain();}
〃定義生產(chǎn)者線程
classProducerThreadimplementsRunnable{intproductNo=0;
〃產(chǎn)品編號(hào)intid;〃生產(chǎn)者
IDpublicProducerThread(intid){this,id=id;
publicvoidrun(){while(isRun){productNo++;//
生產(chǎn)產(chǎn)品buffers.put(productNo,id);〃將產(chǎn)品放入緩沖隊(duì)
列try{Thread,sleep(100);}catch(Exceptione){
e.printStackTrace();}}}}〃定義消費(fèi)者線
程classConsumerThreadimplementsRunnable{intid;〃消費(fèi)
者
IDpublicConsumerThread(intid){this,id=id;}p
ublicvoidrun(){while(isRun){buffers,get(id);//從緩沖
隊(duì)歹U中取出產(chǎn)
品try{Thread,sleep(100);}catch(Exceptione){
e.printStackTrace();}}}))/*
一個(gè)緩沖單元*/
publicclassProductBuffer{intproduct;〃存放產(chǎn)品編
號(hào)booleanhasProduct;〃標(biāo)識(shí)該緩沖區(qū)是否有產(chǎn)品,true有產(chǎn)品,
false無產(chǎn)品
7.實(shí)驗(yàn)要求
在程序編制中,應(yīng)有數(shù)據(jù)顯示,最好采用圖形界面顯示。生產(chǎn)者和消費(fèi)者的
進(jìn)程采用程序模擬的方法運(yùn)行。
實(shí)驗(yàn)四時(shí)間片輪轉(zhuǎn)算法和優(yōu)先級(jí)調(diào)
度算法C語言模擬實(shí)現(xiàn)
一、目的和要求
進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。本實(shí)驗(yàn)要求用高級(jí)語言編寫模擬進(jìn)程調(diào)度程序,以便加
深理解有關(guān)進(jìn)程控制快、進(jìn)程隊(duì)列等概念,并體會(huì)和了解優(yōu)先數(shù)算法和時(shí)間片輪轉(zhuǎn)算法的具
體實(shí)施辦法。
二、實(shí)驗(yàn)內(nèi)容
1.設(shè)計(jì)進(jìn)程控制塊PCB的結(jié)構(gòu),通常應(yīng)包括如下信息:
進(jìn)程名、進(jìn)程優(yōu)先數(shù)(或輪轉(zhuǎn)時(shí)間片數(shù))、進(jìn)程已占用的CPU時(shí)間、進(jìn)程到完成還需要的時(shí)
間、進(jìn)程的狀態(tài)、當(dāng)前隊(duì)列指針等。
2.編寫兩種調(diào)度算法程序:
優(yōu)先數(shù)調(diào)度算法程序
循環(huán)輪轉(zhuǎn)調(diào)度算法程序
3.按要求輸出結(jié)果。
三、提示和說明
分別用兩種調(diào)度算法對(duì)伍個(gè)進(jìn)程進(jìn)行調(diào)度。每個(gè)進(jìn)程可有三種狀態(tài);執(zhí)行狀態(tài)(RUN)、就
緒狀態(tài)(READY,包括等待狀態(tài))和完成狀態(tài)(FINISH),并假定初始狀態(tài)為就緒狀態(tài)。
(-)進(jìn)程控制塊結(jié)構(gòu)如下:
NAME進(jìn)程標(biāo)示符
PRIO/ROUND——進(jìn)程優(yōu)先數(shù)/進(jìn)程每次輪轉(zhuǎn)的時(shí)間片數(shù)(設(shè)為常數(shù)2)
CPUTIME——進(jìn)程累計(jì)占用CPU的時(shí)間片數(shù)
NEEDTIME——進(jìn)程到完成還需要的時(shí)間片數(shù)
STATE——進(jìn)程狀態(tài)
NEXT——鏈指針
注:
1.為了便于處理,程序中進(jìn)程的的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算;
2.各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時(shí)間片數(shù),以及進(jìn)程運(yùn)行時(shí)間片數(shù)的初值,均由用戶在程序運(yùn)行
時(shí)給定。
(-)進(jìn)程的就緒態(tài)和等待態(tài)均為鏈表結(jié)構(gòu),共有四個(gè)指針如下:
RUN——當(dāng)前運(yùn)行進(jìn)程指針
READY——就需隊(duì)列頭指針
TAIL一就需隊(duì)列尾指針
FINISH——完成隊(duì)列頭指針
(三)程序說明
1.在優(yōu)先數(shù)算法中,進(jìn)程優(yōu)先數(shù)的初值設(shè)為:
50-NEEDTIME
每執(zhí)行一次,優(yōu)先數(shù)減1,CPU時(shí)間片數(shù)加1,進(jìn)程還需要的時(shí)間片數(shù)減1。
在輪轉(zhuǎn)法中,采用固定時(shí)間片單位(兩個(gè)時(shí)間片為一個(gè)單位),進(jìn)程每輪轉(zhuǎn)一次,CPU時(shí)間
片數(shù)加2,進(jìn)程還需要的時(shí)間片數(shù)減2,并退出CPU,排到就緒隊(duì)列尾,等待下一次調(diào)度。
2.程序的模塊結(jié)構(gòu)提示如下:
整個(gè)程序可由主程序和如下7個(gè)過程組成:
(1)INSERT1——在優(yōu)先數(shù)算法中,將尚未完成的PCB按優(yōu)先數(shù)順序插入到就緒隊(duì)列中;
(2)INSERT2——在輪轉(zhuǎn)法中,將執(zhí)行了一個(gè)時(shí)間片單位(為2),但尚未完成的進(jìn)程的PCB,
插到就緒隊(duì)列的隊(duì)尾;
(3)FIRSTIN——調(diào)度就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)行;
(4)PRINT——顯示每執(zhí)行一次后所有進(jìn)程的狀態(tài)及有關(guān)信息。
(5)CREATE——?jiǎng)?chuàng)建新進(jìn)程,并將它的PCB插入就緒隊(duì)列;
(6)PRISCH——按優(yōu)先數(shù)算法調(diào)度進(jìn)程;
(7)ROUNDSCH——按時(shí)間片輪轉(zhuǎn)法調(diào)度進(jìn)程。
主程序定義PCB結(jié)構(gòu)和其他有關(guān)變量。
(四)運(yùn)行和顯示
程序開始運(yùn)行后,首先提示:請(qǐng)用戶選擇算法,輸入進(jìn)程名和相應(yīng)的NEEDTIME值。
每次顯示結(jié)果均為如下5個(gè)字段:
namecputimeneedtimeprioritystate
)注:
1.在state字段中,代表執(zhí)行態(tài),“W”代表就緒(等待)態(tài),“F”代表完成態(tài)。
2.應(yīng)先顯示“R"態(tài)的,再顯示“W"態(tài)的,再顯示態(tài)的。
3.在態(tài)中,以優(yōu)先數(shù)高低或輪轉(zhuǎn)順序排隊(duì);在態(tài)中,以完成先后順序排隊(duì)。
include"stdio.h"
#include"stdliLh"
include“string.h"
typedefstructnode
(
charname[10];/*進(jìn)程標(biāo)識(shí)符*/
intprio;/*進(jìn)程優(yōu)先數(shù)*/
intround;/*進(jìn)程時(shí)間輪轉(zhuǎn)時(shí)間片*/
intcputime;/*進(jìn)程占用CPU時(shí)間*/
intneedtime;/*進(jìn)程到完成還要的時(shí)間*/
intcount;/*計(jì)數(shù)器*/
charstate;/*進(jìn)程的狀態(tài)*/
structnode*next;/*鏈指針*/
}PCB;
PCB*finish,*ready,*tail,*run;/*隊(duì)列指針*/
intN;/*進(jìn)程數(shù)*/
/高?緒題中的第一i.進(jìn)程投入運(yùn)行*/
firstin()
(
run=ready;/航緒也回頭指針賦值給運(yùn)行頭指針*/
run->state='R';/*進(jìn)程狀態(tài)變?yōu)檫\(yùn)行態(tài)*/
/*■緒對(duì)列頭指針后潛
ready=ready->next;下進(jìn)程*/
)
/*標(biāo)題輸出函數(shù)*/
voidprt1(chara)
{
Mtoupper(a)==P)/*優(yōu)先數(shù)法*/
printf(Hnamecputimeneedtimeprioritystate\nM);
e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京市朝陽區(qū)北京中學(xué)2024-2025學(xué)年八年級(jí)上學(xué)期期中物理試卷(無答案)
- 滄州臨港經(jīng)濟(jì)技術(shù)開發(fā)區(qū)東區(qū)支三路道路及配套項(xiàng)目環(huán)評(píng)報(bào)告表
- 2014-2020年全球IP電話機(jī)行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 2014-2018年糖蜜行業(yè)戰(zhàn)略投資分析研究報(bào)告
- 2024至2030年中國抗靜電PVC托盤數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2012注冊(cè)會(huì)計(jì)師考試審計(jì)真題及答案B卷
- 2011-2015年氯磺化聚乙烯運(yùn)營態(tài)勢(shì)及前景預(yù)測(cè)分析報(bào)告
- 2024至2030年中國對(duì)夾式雙瓣止回閥數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國雙流程板網(wǎng)組合式板式換熱器行業(yè)投資前景及策略咨詢研究報(bào)告
- 2024至2030年中國三色果凍機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 鼻炎3講解-新吾穴課件
- 停車場(chǎng)土方開挖施工方案
- (完整word版)管理經(jīng)濟(jì)學(xué)案例分析
- 藥物動(dòng)物學(xué)課件藥用動(dòng)物學(xué)1111-課件
- 新人教版一年級(jí)音樂:《玩具進(jìn)行曲》課件01
- 初中校本課程教材《心理健康教育》
- 《沉淀溶解平衡》說播課課件(全國高中化學(xué)優(yōu)質(zhì)課大賽獲獎(jiǎng)案例)
- 《馬克思主義政治經(jīng)濟(jì)學(xué)概論》課程教學(xué)大綱
- 部編版五年級(jí)道德與法治上冊(cè)第8課《美麗文字 民族瑰寶》優(yōu)質(zhì)課件+說課稿
- 倉儲(chǔ)物流安全隱患排查表-附帶法規(guī)依據(jù)
- 引渡案例分析課件
評(píng)論
0/150
提交評(píng)論