計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)講義_第1頁
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)講義_第2頁
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)講義_第3頁
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)講義_第4頁
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)講義_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論