計算機操作系統(tǒng)實驗講義_第1頁
計算機操作系統(tǒng)實驗講義_第2頁
計算機操作系統(tǒng)實驗講義_第3頁
計算機操作系統(tǒng)實驗講義_第4頁
計算機操作系統(tǒng)實驗講義_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《計算機操作系統(tǒng)》實驗指導(dǎo)書

曲阜師范大學(xué)計算機科學(xué)學(xué)院

課程內(nèi)容簡介

操作系統(tǒng)是計算機教學(xué)中最重要的環(huán)節(jié)之一,也是計算機專業(yè)學(xué)生的一門重

要的專業(yè)課程。操作系統(tǒng)質(zhì)量的好壞,直接影響整個計算機系統(tǒng)的性能和用戶對

計算機的使用。一個精心設(shè)計的操作系統(tǒng)能極大地擴充計算機系統(tǒng)的功能,充分

發(fā)揮系統(tǒng)中各種設(shè)備的使用效率,提高系統(tǒng)工作的可靠性。由于操作系統(tǒng)涉及計

算機系統(tǒng)中各種軟硬件資源的管理,內(nèi)容比較繁瑣,具有很強的實踐性。要學(xué)好

這門課程,必須把理論與實踐緊密結(jié)合,才能取得較好的學(xué)習(xí)效果。培養(yǎng)計算機

專業(yè)的學(xué)生的系統(tǒng)程序設(shè)計能力,是操作系統(tǒng)課程的一個非常重要的環(huán)節(jié)。通過

操作系統(tǒng)上機實驗,可以培養(yǎng)學(xué)生程序設(shè)計的方法和技巧,提高學(xué)生編制清晰、

合理、可讀性好的系統(tǒng)程序的能力,加深對操作系統(tǒng)課程的理解。使學(xué)生更好地

掌握操作系統(tǒng)的基本概念、基本原理、及基本功能,具有分析實際操作系統(tǒng)、設(shè)

計、構(gòu)造和開發(fā)現(xiàn)代操作系統(tǒng)的基本能力。

本實驗指導(dǎo)書通過操作系統(tǒng)編程接口,提供一些編程指導(dǎo),以此加深學(xué)生對

操作系統(tǒng)工作原理的領(lǐng)會和對操作系統(tǒng)實現(xiàn)方法的理解,并且使學(xué)生在操作系統(tǒng)

層面的程序設(shè)計得到基本的訓(xùn)練。

本書提供了操作系統(tǒng)的安裝與使用、生產(chǎn)者和消費者的問題、銀行家調(diào)度算

法、操作系統(tǒng)內(nèi)存結(jié)構(gòu)、簡單文件系統(tǒng)的實現(xiàn)以及操作系統(tǒng)構(gòu)成實驗等6個實驗。

本書的使用對象是曲阜師范大學(xué)計算機科學(xué)與技術(shù)專業(yè)(本科)的學(xué)生。

實驗一操作系統(tǒng)的安裝與使用

1.實驗?zāi)康?/p>

(1)鞏固課程中講授的WINDOWSXP的使用知識,提高學(xué)生的WINDOWS

XP或WINDOWSSEVER2003等操作系統(tǒng)的實戰(zhàn)演練水平。

(2)熟悉WindowsXP等操作系統(tǒng)系統(tǒng)的定制安裝過程,明確各安裝部件的

作用。要求學(xué)生掌握圖形用戶接口元素和圖形用戶接口元素的基本操作;熟悉控

制面板中各組件的作用及設(shè)置;能夠了解Windows系統(tǒng)對各種軟件資源和硬件

資源管理的策略。

(3)結(jié)合教材緒論,讓學(xué)生對WINDOWS系統(tǒng)進(jìn)程管理、處理機的調(diào)度與

死鎖、存儲器管理、設(shè)備管理、文件管理以及系統(tǒng)接口有一個感性的認(rèn)識并熟悉

相關(guān)操作。

2.實驗預(yù)備知識

(1)閱讀教材第一章(操作系統(tǒng)引論),熟悉操作系統(tǒng)的目標(biāo)、作用和層次;

了解操作系統(tǒng)的發(fā)展過程;熟悉操作系統(tǒng)實現(xiàn)的功能(存儲器管理功能、處理機

管理功能、設(shè)備管理功能、文件管理功能以及用戶接口);了解操作系統(tǒng)的發(fā)展

的歷史和未來的發(fā)展趨勢。

(2)完成一本W(wǎng)INDOWS操作系統(tǒng)技術(shù)書籍的閱讀(根據(jù)個人情況任選)。

(3)學(xué)習(xí)微軟認(rèn)證(MCSE)中有關(guān)WINDOWS2003操作系統(tǒng)的知識(通

過課堂補充教授、閱讀有關(guān)書籍或網(wǎng)上資料)。

3.實驗環(huán)境

(1)PC計算機;

(2)WINDOWSXP或WINDOWSSEVER2003等操作系統(tǒng)的安裝盤。

4.實驗時間:2個機時。

5.實驗內(nèi)容

(1)了解安裝WINDOWSXP和WINDOWSSEVER2003的硬件需求;

熟悉安裝過程。熟悉安裝過程中各種組件的選擇;設(shè)置操作系統(tǒng)雙重啟動;

熟悉各種物理設(shè)備驅(qū)動程序的安裝。

(2)熟悉WINDOWSXP的用戶界面。重點掌握各類操作系統(tǒng)的各類用戶

接口;掌握資源管理器的使用。

(3)掌握對操作系統(tǒng)的配置和維護(hù),掌握控制面板的使用。掌握安裝和刪

除硬件設(shè)備的方法,熟練對打印機、鼠標(biāo)、鍵盤、網(wǎng)卡、顯示卡、聲卡等硬件設(shè)

備進(jìn)行配置。

(4)了解網(wǎng)絡(luò)的配置和網(wǎng)絡(luò)協(xié)議的原理和設(shè)置,熟練對計算機進(jìn)行網(wǎng)絡(luò)設(shè)

置。

(5)熟練掌握WINDOWSXP的管理工具。利用“計算機管理”選項對計

算機進(jìn)行設(shè)置?!坝嬎銠C管理工具”為用戶提供六種系統(tǒng)工具:“事件查看器”,

“系統(tǒng)信息”、“性能日志和警報”,“共享文件夾”、設(shè)備管理器“和”本地用戶

和組。

(6)了解WINDOWSXP活動目錄。目錄是一個存儲對象信息的分層結(jié)構(gòu),

要求學(xué)生掌握配置活動目錄的方法。

(7)掌握WINDOWSXP的存儲管理。要求學(xué)生掌握以下內(nèi)容:WINDOWS

XP的基本存儲和動態(tài)存儲;智能鏡像、存儲工具、視圖的設(shè)置和硬盤轉(zhuǎn)換、動

態(tài)磁盤中的卷以及相關(guān)卷的操作、磁盤碎片整理程序。

(8)熟悉用WINDOWS任務(wù)管理器來觀察計算機的應(yīng)用程序列表、進(jìn)程列

表以及系統(tǒng)的處理機使用情況、內(nèi)存分配和使用情況、句柄數(shù)、線程數(shù)等等。

6.思考

WINDOWS操作系統(tǒng)中如何實現(xiàn)了處理機管理、內(nèi)存管理、設(shè)備管理、文件

管理和磁盤管理?如何操作?

有條件的同學(xué)可參閱有關(guān)UNIX、LINUX或MINIX書籍和上機實踐,思考

和了解在UNIX、LINUX或MINIX操作系統(tǒng)中是如何實現(xiàn)了處理機管理、內(nèi)存

管理、設(shè)備管理、文件管理和磁盤管理?

實驗二EOS實驗環(huán)境的使用

實驗性質(zhì):驗證

建議學(xué)時:2學(xué)時

一、實驗?zāi)康?/p>

?熟悉操作系統(tǒng)集成實驗環(huán)境OSLab的基本使用方法。

?練習(xí)編譯、調(diào)試EOS操作系統(tǒng)內(nèi)核以及EOS應(yīng)用程序。

二、預(yù)備知識

閱讀《EOS實驗指南》第章,對EOS操作系統(tǒng)和集成實驗環(huán)境有一個初步的了解。

三、實驗內(nèi)容

3.1啟動OSLab

1.在安裝有OSLab的主機上,可以使用兩種不同的方法來啟動OSLab:

?在桌面上雙擊“TevationOSLab”圖標(biāo)。

?點擊“開始”菜單,在“程序”中的“TevationOSLabw中選擇“Tevation

OSLab”。

2.OSLab每次啟動后都會首先彈出一個用于注冊用戶信息的對話框(可以選擇對話

框標(biāo)題欄上的“幫助”按鈕獲得關(guān)于此對話框的幫助信息)。在此對話框中填入學(xué)

號和姓名后,點擊“確定”按鈕完成本次注冊。

3.觀察OSLab主窗口的布局。OSLab主要由下面的若干元素組成:菜單欄、工具欄

以及??吭谧髠?cè)和底部的各種工具窗口,余下的區(qū)域用來放置編輯器窗口。

3.2學(xué)習(xí)OSLab的基本使用方法

通過練習(xí)使用OSLab編寫一個Windows控制臺應(yīng)用程序,熟悉OSLab的基本使用方法

(主要包括新建項目、生成項目、調(diào)試項目等)。

3.2.1新建Windows控制臺應(yīng)用程序項目

新建一個Windows控制臺應(yīng)用程序項目的步驟如下:

1.在“文件”菜單中選擇“新建”,然后單擊“項目”。

2.在“新建項目”對話框中,選擇項目模板“控制臺應(yīng)用程序(c)”。

3.在“名稱”中輸入新項目使用的文件夾名稱“oslab”。

4.在“位置”中輸入新項目保存在磁盤上的位置“C:\Test”。

5.點擊“確定”按鈕。

新建完畢后,OSLab會自動打開這個新建的項目。在“項目管理器”窗口中,樹的根

節(jié)點表示項目,可以看到項目的名稱是“console”,各個子節(jié)點是項目包含的文件夾或者

文件。此項目的源代碼主要包含一個頭文件“console/”和一個C語言源文件

Kconsole,c”,如圖1,

使用Windows資源管理器打開磁盤上的"C:\test\oslab”文件夾查看項目中包含的文

件(提示,在“項目管理器”窗口的項目節(jié)點上點擊右鍵,然后在彈出的快捷菜單中選擇“打

開所在的文件夾”即可)。

項目管理器

console項目節(jié)點

gu頭文件文件夾節(jié)點

_h]console,h文件節(jié)點

日D源文件

?console,c

圖1:打開Windows控制臺應(yīng)用程序項目后的“項目管理器”窗口

3.2.2生成項目

使用“生成項目”功能可以將程序的源代碼編譯為可執(zhí)行的二進(jìn)制文件,方法十分簡

單:在“生成”菜單中選擇“生成項目”。

在項目的生成過程中,“輸出”窗口會實時顯示生成的進(jìn)度和結(jié)果。如果源代碼中不

包含語法錯誤,會在最后提示生成成功,如圖2:

輸出

生成,,,款〔三

已啟動生成:項目:console,配置:Debug

正在編譯...

console,c

正在鏈接...

console-統(tǒng)計到0個錯誤,0個警告

====================生成:成功====================

圖2:成功生成Windows控制臺應(yīng)用程序項目后的“輸出”窗口

如果源代碼中存在語法錯誤,“輸出”窗口會輸出相應(yīng)的錯誤信息(包括錯誤所在文件

的路徑,錯誤在文件中的位置,以及錯誤原因),并在最后提示生成失敗。此時在“輸出”

窗口中雙擊錯誤信息所在的行,OSLab會使用源代碼編輯器打開錯誤所在的文件,并自動

定位到錯誤對應(yīng)的代碼行??梢栽谠创a中故意輸入一些錯誤的代碼(例如刪除一個代碼行

結(jié)尾的分號),然后再次生成項目,練習(xí)在“輸出”窗口中雙擊錯誤信息來定位存在錯誤的

代碼行,將代碼修改正確后再生成項目。

生成過程是將每個源代碼文件(.c、.cpp、.asm等文件)編譯為一個對象文件(.。文

件),然后再將多個對象文件鏈接為一個目標(biāo)文件(.exe、.dll等文件)。成功生成Windows

控制臺應(yīng)用程序項目后,默認(rèn)會在"C:\test\oslab\debug”目錄下生成一個名稱為

“console.?!钡膶ο笪募兔Q為wconsole.exew的Windows控制臺應(yīng)用程序,可以使

用Windows資源管理器查看這些文件。

3.2.3執(zhí)行項目

在OSLab中選擇“調(diào)試”菜單中的“開始執(zhí)行(不調(diào)試)”,可以執(zhí)行此控制臺應(yīng)用程

序.啟動執(zhí)行后會彈出一個Windows控制臺窗口,顯示控制臺應(yīng)用程序輸出的內(nèi)容。按任意

健即可關(guān)閉此控制臺窗口。

3.2.4調(diào)試項目

OSLab提供的調(diào)試器是一個功能強大的工具,使用此調(diào)試器可以觀察程序的運行時行

為并確定邏輯錯誤的位置,可以中斷(或掛起)程序的執(zhí)行以檢查代碼,計算和編輯程序中

的變量,查看寄存器,以及查看從源代碼創(chuàng)建的指令。為了順利進(jìn)行后面的各項實驗,應(yīng)該

學(xué)會靈活使用這些調(diào)試功能。

在練習(xí)各種調(diào)試功能之前,需要對例子程序進(jìn)行必要的修改,步驟如下:

1.右鍵點擊“項目管理器”窗口中的“源文件”文件夾節(jié)點,在彈出的快捷菜單中選

擇“添加”中的“添加新文件”。

2.在彈出的“添加新文件”對話框中選擇“C源文件”模板。

3.在“名稱”中輸入文件名稱“func”。

4.點擊“添加”按鈕添加并自動打開文件func.c,此時的“項目管理器”窗口如圖3:

項目管理器

曰console

$&頭文件

h]console,h

白O源文件

?…回console,c

L向func.c

圖3:添加func.c文件后的“項目管理器”窗口

5.在func.c文件中添加函數(shù):

intFunc(intn)

n=n+1;

returnn;

6.點擊源代碼編輯器上方的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(“生成項目”功能的快捷鍵)。注意查看“輸出”窗口中的內(nèi)容,

如果代碼中存在語法錯誤,就根據(jù)錯誤信息進(jìn)行修改,直到成功生成項目。

3.2.4.1使用斷點中斷執(zhí)行

1.在main函數(shù)中定義變量n的代碼行

intn=0;

上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“插入/刪除斷點”,會在此行左側(cè)的

空白處顯示了一個紅色圓點,表示已經(jīng)成功在此行代碼處添加了一個斷點,如圖4:

intFunc(intn);//聲明Func函數(shù)

intn=0;

n=Func(10);

printf("HelioWorld!\n");

圖4:在console,c文件的main函數(shù)中添加斷點后的代碼行

2.在“調(diào)試”菜單中選擇“啟動調(diào)試",Windows控制臺應(yīng)用程序開始執(zhí)行,隨后

OSLab窗口被自動激活,并且在剛剛添加斷點的代碼行左側(cè)空白中顯示了一個黃

色箭頭,表示程序已經(jīng)在此行代碼處中斷執(zhí)行(也就是說下一個要執(zhí)行的就是此

行代碼),如圖5:

intFunc(intn);//聲明Func函數(shù)

intn=0;

n=Func(10);

printf("HelioWorld!\n");

圖5:Windows控制臺應(yīng)用程序啟動調(diào)試后在斷點處中斷執(zhí)行

3.激活Windows控制臺應(yīng)用程序的窗口,可以看到窗口中沒有輸出任何內(nèi)容,因為

printf函數(shù)還沒有被執(zhí)行。

3.2.4.2單步調(diào)試

按照下面的步驟練習(xí)使用“逐過程”功能:

1.在OSLab的“調(diào)試”菜單中選擇“逐過程”,“逐過程”功能會執(zhí)行黃色箭頭當(dāng)

前指向的代碼行,并將黃色箭頭指向下?個要執(zhí)行的代碼行。

2.按F10(“逐過程”功能的快捷鍵),黃色箭頭就指向了調(diào)用printf函數(shù)的代碼行。

查看控制臺應(yīng)用程序窗口,仍然沒有任何輸出。

3.再次按F10執(zhí)行printf函數(shù),查看控制臺應(yīng)用程序窗口,可以看到已經(jīng)打印出了

內(nèi)容。

4.仔細(xì)體會“逐過程”調(diào)試功能后,在“調(diào)試”菜單中選擇“停止調(diào)試”,結(jié)束此

次調(diào)試。

按照下面的步驟練習(xí)使用“逐語句”功能和“跳出”功能:

1.按F5(“啟動調(diào)試”功能的快捷鍵),仍然會在之前設(shè)置的斷點處中斷。

2.按F10逐過程調(diào)試,此時黃色箭頭指向了調(diào)用函數(shù)Func的代碼行。

3.在“調(diào)試”菜單中選擇“逐語句”,可以發(fā)現(xiàn)黃色箭頭指向了函數(shù)Func中,說明

“逐語句”功能可以進(jìn)入函數(shù)來調(diào)試函數(shù)中的語句。

4.選擇“調(diào)試”菜單中的“跳出”,會跳出Func函數(shù),返回到上級函數(shù)中繼續(xù)調(diào)試

(此時Func函數(shù)已經(jīng)執(zhí)行完畢)。

5.按SHIFT+F5(“停止調(diào)試”功能的快捷鍵),結(jié)束此次調(diào)試。

自己練習(xí)使用“逐過程”、“逐語句”和“跳出”功能,注意體會“逐過程”和“逐語

句”的不同。

3.2.4.3查看變量的值

在調(diào)試的過程中,OSLab提供了三種查看變量值的方法,按照下面的步驟練習(xí)這些方

法:

1.按F5啟動調(diào)試,仍然會在之前設(shè)置的斷點處中斷。

2.將鼠標(biāo)移動到源代碼編輯器中變量n的名稱上,此時會彈出一個窗口顯示出變量n

當(dāng)前的值(由于此時還沒有給變量n賦值,所以是一個隨機值)。

3.在源代碼編輯器中變量n的名稱上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“快

速監(jiān)視”,可以使用“快速監(jiān)視”對話框查看變量n的值。點擊“關(guān)閉”按鈕關(guān)

閉“快速監(jiān)視”對話框。

4.在源代碼編輯器中變量n的名稱上點擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“添

加監(jiān)視”,變量n就被添加到了“監(jiān)視”窗口中。使用“監(jiān)視”窗口可以隨時查

看變量的值和類型。此時按F10進(jìn)行一次單步調(diào)試,可以看到“監(jiān)視”窗口中變

量n的值會變?yōu)?,如圖6:

監(jiān)視

名稱值類型

n0x0int

圖6:使用“監(jiān)視”窗口查看變量的值和類型

如果需要使用十進(jì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)用堆?!贝翱冢?/p>

1.按F5啟動調(diào)試,仍然會在之前設(shè)置的斷點處中斷。

2.選擇“調(diào)試”菜單“窗口”中的“調(diào)用堆?!?,激活“調(diào)用堆?!贝翱???梢钥?/p>

到當(dāng)前“調(diào)用堆?!贝翱谥兄挥幸粋€main函數(shù)(包括參數(shù)值和函數(shù)地址)。

3.按FH(“逐語句”功能的快捷鍵)調(diào)試進(jìn)入Func函數(shù),查看“調(diào)用堆?!贝翱诳?/p>

以發(fā)現(xiàn)在堆棧上有兩個函數(shù)Func和main,其中當(dāng)前正在調(diào)試的Func函數(shù)在棧頂

位置,main函數(shù)在棧底位置。說明是在main函數(shù)中調(diào)用了Func函數(shù)。

4.在“調(diào)用堆棧”窗口中雙擊main函數(shù)所在的行,會有一個綠色箭頭指向main函

數(shù)所在的行,表示此函數(shù)是當(dāng)前調(diào)用堆棧中的活動函數(shù)。同時會將main函數(shù)所在

的源代碼文件打開,并也使用一個綠色箭頭指向Func函數(shù)返回后的位置。

5.在“調(diào)用堆?!贝翱谥须p擊Func函數(shù)所在的行,可以重新激活此堆棧幀,并顯示

對應(yīng)的源代碼。

6.反復(fù)雙擊“調(diào)用堆?!贝翱谥蠪unc函數(shù)和main函數(shù)所在的行,查看“監(jiān)視”窗

口中變量n的值,可以看到在不同的堆棧幀被激活時,OSLab調(diào)試器會自動更新

“監(jiān)視”窗口中的數(shù)據(jù),顯示出對應(yīng)于當(dāng)前活動堆棧幀的信息。

7.結(jié)束此次調(diào)試。

3.3EOS內(nèi)核項目的生成和調(diào)試

之前練習(xí)了對Windows控制臺應(yīng)用程序項目的各項操作,對EOS內(nèi)核項目的各項操作

(包括新建、生成和各種調(diào)試功能等)與對Windows控制臺項目的操作是完全一致的。所以,

接下來實驗內(nèi)容的重點不再是各種操作的具體步驟,而應(yīng)將注意力放在對EOS內(nèi)核項目的理

解上。

3.3.1新建EOS內(nèi)核項目

新建一個EOS內(nèi)核項目的步驟如下:

1.在“文件”菜單中選擇“新建”,然后單擊“項目”。

2.在“新建項目”對話框中,選擇項目模板“EOSKernel”?

3.在“名稱”中輸入新項目使用的文件夾名稱“eos”。

4.在“位置”中輸入新項目保存在磁盤上的位置“C:\”。

5.點擊“確定”按鈕。

此項目就是一個EOS操作系統(tǒng)內(nèi)核項目,包含了EOS操作系統(tǒng)內(nèi)核的所有源代碼文件。

在“項目管理器”窗口中查看EOS內(nèi)核項目包含的文件夾和源代碼文件,可以看到不同

的文件夾包含了EOS操作系統(tǒng)不同模塊的源代碼文件,例如“mm”文件夾中包含了內(nèi)存管理

模塊的源代碼文件,“boot”文件夾中包含了軟盤引導(dǎo)扇區(qū)程序和加載程序的源代碼文件。

也可以使用Windows資源管理器打開項目所在的文件夾C:\eos,查看所有源代碼文件。

3.3.2生成項目

1.按F7生成項目,同時查看“輸出”窗口中的內(nèi)容,確認(rèn)生成成功。

2.打開C:\eos\debug文件夾,查看生成的對象文件和目標(biāo)文件。找到boot.bin、

loader,bin和kernel,dll三個二進(jìn)制文件,這三個文件就是EOS操作系統(tǒng)在運行

時需要的可執(zhí)行文件。OSLab每次啟動運行EOS操作系統(tǒng)之前,都會將這三個文

件寫入個軟盤鏡像文件中,然后讓虛擬機運行這個軟盤鏡像中的EOS(相當(dāng)于將

寫有這三個二進(jìn)制文件的軟盤放入一個物理機的軟盤驅(qū)動器中,然后按下開機按

鈕)。找到libkernel.a文件,此文件是EOS內(nèi)核文件kernel,dll對應(yīng)的導(dǎo)入庫

文件。

3.3.3調(diào)試項目

1.在“項目管理器”窗口的ke文件夾中找到start.c文件節(jié)點,雙擊此文件節(jié)點使

用源代碼編輯器打開start.c文件。

2.在start.c文件中KiSystemStartup函數(shù)的"KilnitializePicO;”語句所在行

(第61行)添加一個斷點,如圖7:

60//

。61KilnitializePic();

62KilnitializePit();

圖7:在EOS內(nèi)核項目的ke/start.c文件的第61行添加一個斷點

3.按F5啟動調(diào)試,虛擬機開始運行軟盤鏡像中的EOS。在虛擬機窗口中可以看到EOS

啟動的過程。隨后EOS會在剛剛添加的斷點處中斷執(zhí)行。激活虛擬機窗口可以看

到EOS也不再繼續(xù)運行了。各種調(diào)試功能(包括單步調(diào)試、查看變量的值和各個

調(diào)試工具窗口)的使用方法與調(diào)試Windows控制臺程序完全相同,可以自己練習(xí)。

4.按F5繼續(xù)執(zhí)行。查看虛擬機窗口,顯示EOS操作系統(tǒng)已經(jīng)啟動,并且EOS的控制

臺程序已經(jīng)開始運行了。

5.在“調(diào)試”菜單中選擇“停止調(diào)試”,結(jié)束此次調(diào)試。

3.3.4查看軟盤鏡像文件中的內(nèi)容

在''項目管理器“窗口中雙擊軟盤鏡像文件Floppy,img,就會使用FloppyImageEditor

工具打開此文件(在FloppyImageEditor工具中按Fl可以查看此工具的幫助文件)。在

FloppylmageEditor工具的文件列表中可以找到loader,bin文件和kernel,dll文件,這兩

個文件都是在啟動調(diào)試時被寫入軟盤鏡像文件的(可以查看這兩個文件的修改日期)。

boot.bin文件在啟動調(diào)試時被寫入了軟盤鏡像的引導(dǎo)扇區(qū)中,不受軟盤文件系統(tǒng)的管理,

所以在文件列表中找不到此文件。關(guān)閉FloppylmageEditor工具。

3.3.5查看EOSSDK(SoftwareDevelopmentKit)文件夾

1.點擊OSLab工具欄上的“項目配置”下拉列表,選擇下拉列表中的“Release”項

目配置,“Release”項目配置被設(shè)置為新的活動項目配置(原來的活動項目配置

是“Debug")。如圖8:

,?〔Debug漕WRITE_PORT_UCHAR內(nèi)國

[Debug

:事事:二2」GQ制》Q£幽Release

圖8:使用工具欄上的“項目配置”下拉列表切換活動項目配置

2.按F7使用Release配置生成項目。

3.生成完畢后,使用Windows資源管理器打開C:\eos文件夾,可以發(fā)現(xiàn)在文件夾中

多出了一個SDK文件夾,此文件夾就是在生成EOSKernel項目的同時自動生成的。

4.SDK文件夾中提供了開發(fā)EOS應(yīng)用程序需要的所有文件。打開SDK文件夾中的bin

文件夾,可以看到有兩個名稱分別為debug和release的文件夾。debug文件夾是

在使用debug配置生成項目時生成的,其中存放了調(diào)試版本的EOS二進(jìn)制文件。

release文件夾是在使用release配置生成項目時生成的,其中存放了發(fā)布版本的

EOS二進(jìn)制文件(不包含調(diào)試信息)。分別打開這兩個文件夾查看其中包含的文件。

5.打開SDK文件夾中的inc文件夾,可以看到此文件夾中存放了EOS用于導(dǎo)出API

函數(shù)和重要數(shù)據(jù)類型定義的頭文件,在編寫EOS應(yīng)用程序時必須包含這些頭文件。

每次在開發(fā)EOS應(yīng)用程序之前都應(yīng)該使用EOSKernel項目的debug配置和release配

置來生成EOSKernel項目,這樣才能夠得到完全版本的SDK文件夾供EOS應(yīng)用程序使用。

結(jié)合《EOS實驗指南》第一章中關(guān)于EOS內(nèi)核從源代碼到可在虛擬機中運行過程的介紹,

仔細(xì)體會EOS內(nèi)核項目生成、調(diào)試的過程,以及EOSSDK文件夾生成的過程和組織方式。

3.4EOS應(yīng)用程序項目的生成和調(diào)試

3.4.1新建EOS應(yīng)用程序項目

新建一個EOS內(nèi)核項目的步驟如下:

1.在“文件”菜單中選擇“新建”,然后單擊“項目”。

2.在“新建項目”對話框中,選擇項目模板“EOS應(yīng)用程序”。

3.在“名稱”中輸入新項目使用的文件夾名稱“eosapp”。

4.在“位置”中輸入新項目保存在磁盤上的位置“C:\”。

5.點擊“確定”按鈕。

此項目就是一個EOS應(yīng)用程序項目。

使用Windows資源管理器將之前生成的C:\eos\sdk文件夾拷貝覆蓋到C:\eosapp\sdk

位置。這樣EOS應(yīng)用程序就可以使用最新版本的EOSSDK文件夾了。

3.4.2生成項目

1.按F7生成項目,同時查看“輸出”窗口中的內(nèi)容,確認(rèn)生成成功。

2.打開C:\eosapp\debug文件夾,查看生成的對象文件和目標(biāo)文件。其中的

EOSApp.exe就是EOS應(yīng)用程序的可執(zhí)行文件。OSLab每次啟動執(zhí)行EOS應(yīng)用程序

時,都會將EOS應(yīng)用程序的可執(zhí)行文件寫入軟盤鏡像,并且會將SDK文件夾中時

應(yīng)配置(Debug或Release)的二進(jìn)制文件寫入軟盤鏡像,然后讓虛擬機運行軟盤

鏡像中的EOS,待EOS啟動后再自動執(zhí)行EOS應(yīng)用程序。

3.4.3調(diào)試項目

調(diào)試EOS應(yīng)用程序項目與之前的兩個項目有較大的不同,之前的兩個項目在調(diào)試時都

是先添加斷點再啟動調(diào)試,而EOS應(yīng)用程序項目必須先啟動調(diào)試再添加斷點,步驟如下:

1.按F5啟動調(diào)試。OSLab會彈出?個調(diào)試異常對話框,選擇“是”調(diào)試異常,EOS

應(yīng)用程序會中斷執(zhí)行,黃色箭頭指向下一個要執(zhí)行的代碼行。

2.在eosapp.c的

printf("Helloworld!\n/z);

代碼行添加一個斷點,然后按F5繼續(xù)調(diào)試,在此斷點處中斷。

3.按F10單步調(diào)試,查看虛擬機窗口,打印輸出了“Hell。world!”。

4.按F5繼續(xù)調(diào)試,查看虛擬機窗口,EOS應(yīng)用程序執(zhí)行完畢。

5.在“調(diào)試”菜單中選擇“停止調(diào)試”,調(diào)試被終止。

6.選擇“調(diào)試”菜單中的“刪除所有斷點”。只有刪除所有斷點后才能按F5再次啟

動調(diào)試,否則啟動調(diào)試會失敗。

3.4.4查看軟盤鏡像文件中的內(nèi)容

使用FloppyImageEditor工具打開該項目中的Floppy.img文件,查看軟盤鏡像中的文

件。loader,bin和kernel,dll是從C:\eosapp\sdk\bin\debug文件夾寫入的,

C:\eosapp\sdk\bin\debug\boot.bin被寫入了軟盤鏡像文件的引導(dǎo)扇區(qū)中。eosapp.exe就

是本項目生成的EOS應(yīng)用程序。EOS操作系統(tǒng)啟動后會根據(jù)autorun.txt文本文件中的內(nèi)容

啟動執(zhí)行eosapp.exe程序,雙擊autorun.txt文件查看其內(nèi)容。

結(jié)合《EOS實驗指南》第一章中關(guān)于EOS應(yīng)用程序從源代碼到可在虛擬機中運行過程的

介紹,仔細(xì)體會EOS應(yīng)用程序項目生成、調(diào)試的過程,以及EOS應(yīng)用程序是如何使用EOSSDK

文件夾的。

3.5退出OSLab

1.在“文件”菜單中選擇“退出”。

2.在OSLab關(guān)閉前會彈出一個保存數(shù)據(jù)對話框(可以選擇對話框標(biāo)題欄上的“幫

助”按鈕獲得幫助信息),核對學(xué)號和姓名無誤后點擊“保存”按鈕,OSLab關(guān)閉。

3.在OSLab關(guān)閉后默認(rèn)會自動使用Windows資源管理器打開數(shù)據(jù)文件所在的文件夾,

并且選中剛剛保存的數(shù)據(jù)文件(OUD文件)。將數(shù)據(jù)文件備份(例如拷貝到自己的

U盤中或者發(fā)送到服務(wù)器上),做為本次實驗的考評依據(jù)。

3.6保存EOS內(nèi)核項目

如果要在課余時間閱讀EOS源代碼,或者調(diào)試EOS源代碼,可以按照下面的步驟操作:

1.使用OSLab重新打開之前創(chuàng)建的EOS內(nèi)核項目(啟動OSLab后,在“起始頁”的

“最近的項目”列表中會有之前創(chuàng)建的EOS內(nèi)核項目的快捷方式“kernel")。

2.使用Debug配置生成此項目。再次啟動調(diào)試此項目后結(jié)束調(diào)試,從而制作包含Debug

版本EOS操作系統(tǒng)的軟盤鏡像文件。

3.將此項目文件夾復(fù)制到自己的計算機中。注意,項目文件夾在磁盤中的位置不能改

變,例如實驗中此項目在C:\eos位置,就必須復(fù)制到自己計算機中的C:\eos位置。

4.在自己的計算機中安裝OSLab演示版,使用演示版程序閱讀EOS源代碼,或者調(diào)

試EOS源代碼。

OSLab演示版程序可以使用教師分發(fā)的安裝包進(jìn)行安裝。建議使用和正式版版本號相

同的演示版程序。

四、思考與練習(xí)

?練習(xí)使用單步調(diào)試功能(逐過程、逐語句),體會在哪些情況下應(yīng)該使用“逐過程”調(diào)

試,在哪些情況下應(yīng)該使用“逐語句”調(diào)試。練習(xí)使用各種調(diào)試工具(包括“監(jiān)視”窗

口、“調(diào)用堆?!贝翱诘龋?/p>

?思考生成EOSSDK文件夾的目的和作用。查看EOSSDK文件夾中的內(nèi)容,明白文件夾的

組織結(jié)構(gòu)和各個文件的來源和作用。查看EOS應(yīng)用程序包含了SDK文件夾中的哪些頭文

件,是如何包含的?

五、相關(guān)閱讀

?啟動osLab后,選擇“幫助”菜單中的“幫助主題”,閱讀幫助開始頁中的“如何:

使用代碼閱讀工具”,熟練使用各種代碼閱讀工具可以大大提高閱讀EOS源代碼的效

率。

?打開OSLab幫助左側(cè)的“目錄”標(biāo)簽,閱讀“參考”文件夾中的“如何:打開項目屬

性頁”、“如何:更改活動項目配置”、“如何:為項目添加文件”。閱讀其它主題,

了解更多關(guān)于OSLab的信息。

?訪問http://\v\v\v.tovation,com了解關(guān)于OSLab的最新信息。登陸網(wǎng)站中的論壇,可

以在論壇中進(jìn)行答疑或者參與討論。

實驗三生產(chǎn)者和消費者的問題

1.實驗?zāi)康?/p>

(1)加深對進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。

(2)進(jìn)一步認(rèn)識并發(fā)執(zhí)行的實質(zhì)。

(3)驗證用信號量機制實現(xiàn)進(jìn)程互斥的方法。

(4)驗證用信號機制實現(xiàn)進(jìn)程同步的方法。

2.實驗預(yù)備內(nèi)容

(1)閱讀課本有關(guān)進(jìn)程管理以及進(jìn)程同步的有關(guān)章節(jié),對臨界區(qū)和臨界資

源概念要清晰,充分理解信號信號量機制。

(2)閱讀兒種經(jīng)典進(jìn)程同步問題的算法并理解。熟練掌握生產(chǎn)者一消費者

的算法思想。

3.實驗環(huán)境

(1)一臺運行WindowsXP操作系統(tǒng)的計算機。

(2)選用以C、C++、visualC++、Java等任何一種語言。建議采用Java

多線程編程技術(shù)

4.實驗時間:4個機時。

5.實驗內(nèi)容

問題描述:考慮有一些生產(chǎn)者和消費者進(jìn)程,生產(chǎn)者進(jìn)程生產(chǎn)信息并把它們

放入緩沖池中,消費者從緩沖池中取走信息。生產(chǎn)者一消費者問題是相互合作的

進(jìn)程關(guān)系的一種抽象,如在輸入時,輸入進(jìn)程是生產(chǎn)者,計算進(jìn)程是消費者;而

在輸出時,則計算進(jìn)程是生產(chǎn)者,打印進(jìn)程是消費者。請使用信號量機制來解決

生產(chǎn)者一消費者問題。

一次只可放一個產(chǎn)品

互斥關(guān)系:

(I)設(shè)緩沖池有n個單元。

(II)當(dāng)n個單元裝滿時,生產(chǎn)者必須等待。

(III)當(dāng)緩沖池空時,消費者必須等待。

6.參考算法

importjavax.swing.JTextArea;/*

*定義臨界資源:緩沖隊列**/

publicclassBuffers{JTextAreata;staticfinalintproductBu

fferNum=10;〃緩沖單元數(shù)

ProductBufferpBuffer[]=newProductBuffer[productBufferNum];/

/緩沖隊列

intin=0;〃緩沖單元指針,用于放產(chǎn)品

get()intout=0;〃緩沖單元指針,用于取產(chǎn)品

put()intconsumeProductNo;〃記錄消費產(chǎn)品的編號

intusedBufferNum=0;〃記錄緩沖隊列已使用的緩沖單元個數(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){〃緩沖隊列空則等待

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)識

usedBufferNum--;〃輸出本次取產(chǎn)品后緩沖隊列的情況

ta.append(〃消費者〃+id+〃將產(chǎn)品〃+consumeProductNo+〃從緩沖單元

〃+out+〃取出,緩沖隊列狀態(tài)如下:\n〃);

printBuffer();

out=(out+1)%productBufferNum;〃更新指針

〃喚醒等待線程

super,notify();}//放產(chǎn)品

publicsynchronizedvoidput(intproductNo,intid){〃緩沖隊列

滿則等待

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)識

usedBufferNum++;〃/輸出本次放入產(chǎn)品后,緩沖隊列的情況

ta.append(〃生產(chǎn)者〃+id+〃將產(chǎn)品〃+productNo+〃放入緩沖單元〃+ir)+〃,緩沖

隊列狀態(tài)如下:\n〃);

printBuffer();in=(in+1)%productBufferNum;〃更新指

針〃喚醒等待線程

super,notify();}〃打印緩沖隊列當(dāng)前情況

privatevoidprintBuffer(){ta.appendC,緩沖單元

編號產(chǎn)品編號緩沖單元狀態(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)者消費者問題實現(xiàn)(可以有多個生產(chǎn)者消費者)**/

publicclassProducerConsumerMainimplementsActionListener{bo

oleanisRun=true;〃用于控制線程結(jié)束

JTextAreata=newJTextAreaO;Buffersbuffers=newBuffers(t

a);〃緩沖隊列

staticfinalintproducerNum=8;〃生產(chǎn)者個數(shù)

staticfinalintconsumerNum=2;〃消費者個數(shù)

ProducerThreadproThread[]=newProducerThread[producerNum];Co

nsumerThreadconThread[]=newConsumerThread[consumerNum];

Threadproducer[]=newThread[producerNum];Threadconsumer[]

=newThread[consumerNum];

publicProducerConsumerMain(){createUI0;//創(chuàng)建界

面〃創(chuàng)建多個生產(chǎn)者和消費者線程并開始執(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)者消

費者

〃);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)品編號intid;〃生產(chǎn)者

IDpublicProducerThread(intid){this,id=id;

publicvoidrun(){while(isRun){productNo++;//

生產(chǎn)產(chǎn)品buffers.put(productNo,id);〃將產(chǎn)品放入緩沖隊

列try{Thread,sleep(100);}catch(Exceptione){

e.printStackTrace();}}}}〃定義消費者線

程classConsumerThreadimplementsRunnable{intid;〃消費

IDpublicConsumerThread(intid){this,id=id;}p

ublicvoidrun(){while(isRun){buffers,get(id);//從緩沖

隊歹U中取出產(chǎn)

品try{Thread,sleep(100);}catch(Exceptione){

e.printStackTrace();}}}))/*

一個緩沖單元*/

publicclassProductBuffer{intproduct;〃存放產(chǎn)品編

號booleanhasProduct;〃標(biāo)識該緩沖區(qū)是否有產(chǎn)品,true有產(chǎn)品,

false無產(chǎn)品

7.實驗要求

在程序編制中,應(yīng)有數(shù)據(jù)顯示,最好采用圖形界面顯示。生產(chǎn)者和消費者的

進(jìn)程采用程序模擬的方法運行。

實驗四時間片輪轉(zhuǎn)算法和優(yōu)先級調(diào)

度算法C語言模擬實現(xiàn)

一、目的和要求

進(jìn)程調(diào)度是處理機管理的核心內(nèi)容。本實驗要求用高級語言編寫模擬進(jìn)程調(diào)度程序,以便加

深理解有關(guān)進(jìn)程控制快、進(jìn)程隊列等概念,并體會和了解優(yōu)先數(shù)算法和時間片輪轉(zhuǎn)算法的具

體實施辦法。

二、實驗內(nèi)容

1.設(shè)計進(jìn)程控制塊PCB的結(jié)構(gòu),通常應(yīng)包括如下信息:

進(jìn)程名、進(jìn)程優(yōu)先數(shù)(或輪轉(zhuǎn)時間片數(shù))、進(jìn)程已占用的CPU時間、進(jìn)程到完成還需要的時

間、進(jìn)程的狀態(tài)、當(dāng)前隊列指針等。

2.編寫兩種調(diào)度算法程序:

優(yōu)先數(shù)調(diào)度算法程序

循環(huán)輪轉(zhuǎn)調(diào)度算法程序

3.按要求輸出結(jié)果。

三、提示和說明

分別用兩種調(diào)度算法對伍個進(jìn)程進(jìn)行調(diào)度。每個進(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ù)2)

CPUTIME——進(jìn)程累計占用CPU的時間片數(shù)

NEEDTIME——進(jìn)程到完成還需要的時間片數(shù)

STATE——進(jìn)程狀態(tài)

NEXT——鏈指針

注:

1.為了便于處理,程序中進(jìn)程的的運行時間以時間片為單位進(jìn)行計算;

2.各進(jìn)程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù),以及進(jìn)程運行時間片數(shù)的初值,均由用戶在程序運行

時給定。

(-)進(jìn)程的就緒態(tài)和等待態(tài)均為鏈表結(jié)構(gòu),共有四個指針如下:

RUN——當(dāng)前運行進(jìn)程指針

READY——就需隊列頭指針

TAIL一就需隊列尾指針

FINISH——完成隊列頭指針

(三)程序說明

1.在優(yōu)先數(shù)算法中,進(jìn)程優(yōu)先數(shù)的初值設(shè)為:

50-NEEDTIME

每執(zhí)行一次,優(yōu)先數(shù)減1,CPU時間片數(shù)加1,進(jìn)程還需要的時間片數(shù)減1。

在輪轉(zhuǎn)法中,采用固定時間片單位(兩個時間片為一個單位),進(jìn)程每輪轉(zhuǎn)一次,CPU時間

片數(shù)加2,進(jìn)程還需要的時間片數(shù)減2,并退出CPU,排到就緒隊列尾,等待下一次調(diào)度。

2.程序的模塊結(jié)構(gòu)提示如下:

整個程序可由主程序和如下7個過程組成:

(1)INSERT1——在優(yōu)先數(shù)算法中,將尚未完成的PCB按優(yōu)先數(shù)順序插入到就緒隊列中;

(2)INSERT2——在輪轉(zhuǎn)法中,將執(zhí)行了一個時間片單位(為2),但尚未完成的進(jìn)程的PCB,

插到就緒隊列的隊尾;

(3)FIRSTIN——調(diào)度就緒隊列的第一個進(jìn)程投入運行;

(4)PRINT——顯示每執(zhí)行一次后所有進(jìn)程的狀態(tài)及有關(guān)信息。

(5)CREATE——創(chuàng)建新進(jìn)程,并將它的PCB插入就緒隊列;

(6)PRISCH——按優(yōu)先數(shù)算法調(diào)度進(jìn)程;

(7)ROUNDSCH——按時間片輪轉(zhuǎn)法調(diào)度進(jìn)程。

主程序定義PCB結(jié)構(gòu)和其他有關(guān)變量。

(四)運行和顯示

程序開始運行后,首先提示:請用戶選擇算法,輸入進(jìn)程名和相應(yīng)的NEEDTIME值。

每次顯示結(jié)果均為如下5個字段:

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)順序排隊;在態(tài)中,以完成先后順序排隊。

include"stdio.h"

#include"stdliLh"

include“string.h"

typedefstructnode

(

charname[10];/*進(jìn)程標(biāo)識符*/

intprio;/*進(jìn)程優(yōu)先數(shù)*/

intround;/*進(jìn)程時間輪轉(zhuǎn)時間片*/

intcputime;/*進(jìn)程占用CPU時間*/

intneedtime;/*進(jìn)程到完成還要的時間*/

intcount;/*計數(shù)器*/

charstate;/*進(jìn)程的狀態(tài)*/

structnode*next;/*鏈指針*/

}PCB;

PCB*finish,*ready,*tail,*run;/*隊列指針*/

intN;/*進(jìn)程數(shù)*/

/高?緒題中的第一i.進(jìn)程投入運行*/

firstin()

(

run=ready;/航緒也回頭指針賦值給運行頭指針*/

run->state='R';/*進(jìn)程狀態(tài)變?yōu)檫\行態(tài)*/

/*■緒對列頭指針后潛

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等.壓縮文件請下載最新的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

提交評論