版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 成都職業(yè)技術(shù)學(xué)院《資產(chǎn)評估概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 成都藝術(shù)職業(yè)大學(xué)《商務(wù)談判與禮儀》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版家具展覽展示合同范本:家具展覽展示服務(wù)合作協(xié)議3篇
- 2024年特許經(jīng)營合同范例詳述
- 2024煤礦安全生產(chǎn)信息化建設(shè)技術(shù)服務(wù)合同3篇
- 2025版?zhèn)€人健身教練服務(wù)及器材融資租賃合同3篇
- 計算機輔助設(shè)計與計算機輔助制造(CADCAM)技術(shù)在牙科正畸中的應(yīng)用
- 產(chǎn)業(yè)園區(qū)輻射帶動作用的實施路徑
- 二零二五年度養(yǎng)老產(chǎn)業(yè)股權(quán)質(zhì)押典當(dāng)借款服務(wù)協(xié)議書3篇
- 輕鋼結(jié)構(gòu)施工方案
- 中醫(yī)院醫(yī)院設(shè)備科工作總結(jié)
- JC/T 414-2017 硅藻土行業(yè)標(biāo)準(zhǔn)
- 組織學(xué)與胚胎學(xué)課程教學(xué)大綱
- 網(wǎng)絡(luò)傳播概論(第5版) 課件 第一章 網(wǎng)絡(luò)媒介的演變
- 2023-2024學(xué)年江西省鷹潭市余江區(qū)八年級(上)期末數(shù)學(xué)試卷(含解析)
- 2023北京西城六年級(上)期末英語試卷含答案
- 珠海金灣區(qū)2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)達(dá)標(biāo)卷(含答案)
- 京東五力模型分析報告
- XX學(xué)校2024年校長務(wù)虛會講話稿范文
- 大學(xué)英語四級考試模擬試卷(附答案)
- 廣西壯族自治區(qū)欽州市浦北縣2023-2024學(xué)年七年級上學(xué)期期末歷史試題
評論
0/150
提交評論