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

下載本文檔

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

文檔簡(jiǎn)介

1、 目錄實(shí)驗(yàn)一 WINDOWS進(jìn)程初識(shí)31、實(shí)驗(yàn)?zāi)康?2、實(shí)驗(yàn)內(nèi)容和步驟33、實(shí)驗(yàn)結(jié)論44、程序清單4實(shí)驗(yàn)二 進(jìn)程管理7背景知識(shí)71、實(shí)驗(yàn)?zāi)康?02、實(shí)驗(yàn)內(nèi)容和步驟103、實(shí)驗(yàn)結(jié)論124、程序清單12實(shí)驗(yàn)三 進(jìn)程同步的經(jīng)典算法17背景知識(shí)171、實(shí)驗(yàn)?zāi)康?82、實(shí)驗(yàn)內(nèi)容和步驟183、實(shí)驗(yàn)結(jié)論194、程序清單20實(shí)驗(yàn)四 存儲(chǔ)管理24背景知識(shí)241、實(shí)驗(yàn)?zāi)康?82、實(shí)驗(yàn)內(nèi)容和步驟283、實(shí)驗(yàn)結(jié)論344、程序清單34實(shí)驗(yàn)五 文件和設(shè)備管理39背景知識(shí)391、實(shí)驗(yàn)?zāi)康?02、實(shí)驗(yàn)內(nèi)容與步驟413、實(shí)驗(yàn)結(jié)論44實(shí)驗(yàn)一 WINDOWS進(jìn)程初識(shí)1、 實(shí)驗(yàn)?zāi)康模?) 學(xué)會(huì)使用VC編寫(xiě)基本的Win32 Conso

2、l Application(控制臺(tái)應(yīng)用程序)。(2) 掌握WINDOWS API的使用方法。(3) 編寫(xiě)測(cè)試程序,理解用戶態(tài)運(yùn)行和核心態(tài)運(yùn)行。2、 實(shí)驗(yàn)內(nèi)容和步驟(1)編寫(xiě)基本的Win32 Consol Application步驟1:登錄進(jìn)入Windows,啟動(dòng)VC+ 6.0。步驟2:在“FILE”菜單中單擊“NEW”子菜單,在“projects”選項(xiàng)卡中選擇“Win32 Consol Application”,然后在“Project name”處輸入工程名,在“Location” 處輸入工程目錄。創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序工程。步驟3:在“FILE”菜單中單擊“NEW”子菜單,在“Files

3、”選項(xiàng)卡中選擇“C+ Source File”, 然后在“File” 處輸入C/C+源程序的文件名。 步驟4:將清單1-1所示的程序清單復(fù)制到新創(chuàng)建的C/C+源程序中。編譯成可執(zhí)行文件。步驟5:在“開(kāi)始”菜單中單擊“程序”-“附件”-“命令提示符”命令,進(jìn)入Windows“命令提示符”窗口,然后進(jìn)入工程目錄中的debug子目錄,執(zhí)行編譯好的可執(zhí)行程序:E:課程os課os實(shí)驗(yàn)程序os11debug>hello.exe運(yùn)行結(jié)果 (如果運(yùn)行不成功,則可能的原因是什么?) :(2)計(jì)算進(jìn)程在核心態(tài)運(yùn)行和用戶態(tài)運(yùn)行的時(shí)間步驟1:按照(1)中的步驟創(chuàng)建一個(gè)新的“Win32 Consol Applic

4、ation”工程,然后將清單1-2中的程序拷貝過(guò)來(lái),編譯成可執(zhí)行文件。步驟2: 在創(chuàng)建一個(gè)新的“Win32 Consol Application”工程,程序的參考程序如清單1-3所示,編譯成可執(zhí)行文件并執(zhí)行。步驟3:在“命令提示符”窗口中運(yùn)行步驟1中生成的可執(zhí)行文件,測(cè)試步驟2中可執(zhí)行文件在核心態(tài)運(yùn)行和用戶態(tài)運(yùn)行的時(shí)間。E:課程os課os實(shí)驗(yàn)程序os12debug>time TEST.exe步驟4:運(yùn)行結(jié)果 (如果運(yùn)行不成功,則可能的原因是什么?) :步驟5:分別屏蔽While循環(huán)中的兩個(gè)for循環(huán),或調(diào)整兩個(gè)for循環(huán)的次數(shù),寫(xiě)出運(yùn)行結(jié)果。屏蔽i循環(huán):屏蔽j循環(huán):調(diào)整循環(huán)變量i的循環(huán)次

5、數(shù):調(diào)整循環(huán)變量j的循環(huán)次數(shù):3、 實(shí)驗(yàn)結(jié)論對(duì)Win32 Consol Application有進(jìn)一步的認(rèn)識(shí),WIN32 API也就是Windows 32平臺(tái)的應(yīng)用程序編程接口。用戶態(tài)運(yùn)行和核心態(tài)運(yùn)行,核心態(tài)就是一個(gè)是直接的代碼運(yùn)行,即win32consol Application下代碼運(yùn)行;而用戶態(tài)是在DOS下運(yùn)行的,對(duì)編譯好的程序進(jìn)行的運(yùn)行,核心態(tài)速度較快,沒(méi)有太多的約束,而用戶態(tài)的運(yùn)行需要時(shí)間較長(zhǎng),由于有相應(yīng)的約束。 實(shí)驗(yàn)二 進(jìn)程管理背景知識(shí)Windows所創(chuàng)建的每個(gè)進(jìn)程都從調(diào)用CreateProcess() API函數(shù)開(kāi)始,該函數(shù)的任務(wù)是在對(duì)象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對(duì)象。每一進(jìn)程都以

6、調(diào)用ExitProcess() 或TerminateProcess() API函數(shù)終止。通常應(yīng)用程序的框架負(fù)責(zé)調(diào)用 ExitProcess() 函數(shù)。對(duì)于C+ 運(yùn)行庫(kù)來(lái)說(shuō),這一調(diào)用發(fā)生在應(yīng)用程序的main() 函數(shù)返回之后。 1. 創(chuàng)建進(jìn)程CreateProcess() 調(diào)用的核心參數(shù)是可執(zhí)行文件運(yùn)行時(shí)的文件名及其命令行。表 3-4詳細(xì)地列出了每個(gè)參數(shù)的類(lèi)型和名稱(chēng)。 表3-4 CreateProcess() 函數(shù)的參數(shù)參數(shù)名稱(chēng)使用目的LPCTSTR lpApplivationName全部或部分地指明包括可執(zhí)行代碼的EXE文件的文件名LPCTSTR lpCommandLine向可執(zhí)行文

7、件發(fā)送的參數(shù)LPSECURIITY_ATTRIBUTES lpProcessAttributes返回進(jìn)程句柄的安全屬性。主要指明這一句柄是否應(yīng)該由其他子進(jìn)程所繼承LPSECURIITY_ATTRIBUTES lpThreadAttributes返回進(jìn)程的主線程的句柄的安全屬性BOOL bInheritHandle一種標(biāo)志,告訴系統(tǒng)允許新進(jìn)程繼承創(chuàng)建者進(jìn)程的句柄DWORD dwCreationFlage特殊的創(chuàng)建標(biāo)志 (如CREATE_SUSPENDED) 的位標(biāo)記LPVOID lpEnvironment向新進(jìn)程發(fā)送的一套環(huán)境變量;如為null值則發(fā)送調(diào)用者環(huán)境LPCTSTR lpCurrent

8、Directory新進(jìn)程的啟動(dòng)目錄STARTUPINFO lpStartupInfoSTARTUPINFO結(jié)構(gòu),包括新進(jìn)程的輸入和輸出配置的詳情L(zhǎng)PPROCESS_INFORMATION lpProcessInformation調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的進(jìn)程和主線程的句柄和ID 可以指定第一個(gè)參數(shù),即應(yīng)用程序的名稱(chēng),其中包括相對(duì)于當(dāng)前進(jìn)程的當(dāng)前目錄的全路徑或者利用搜索方法找到的路徑;lpCommandLine參數(shù)允許調(diào)用者向新應(yīng)用程序發(fā)送數(shù)據(jù);接下來(lái)的三個(gè)參數(shù)與進(jìn)程和它的主線程以及返回的指向該對(duì)象的句柄的安全性有關(guān)。然后是標(biāo)志參數(shù),用以在dwCreationFlags參數(shù)中指明系

9、統(tǒng)應(yīng)該給予新進(jìn)程什么行為。經(jīng)常使用的標(biāo)志是CREATE_SUSPNDED,告訴主線程立刻暫停。當(dāng)準(zhǔn)備好時(shí),應(yīng)該使用ResumeThread() API來(lái)啟動(dòng)進(jìn)程。另一個(gè)常用的標(biāo)志是CREATE_NEW_CONSOLE,告訴新進(jìn)程啟動(dòng)自己的控制臺(tái)窗口,而不是利用父窗口。這一參數(shù)還允許設(shè)置進(jìn)程的優(yōu)先級(jí),用以向系統(tǒng)指明,相對(duì)于系統(tǒng)中所有其他的活動(dòng)進(jìn)程來(lái)說(shuō),給此進(jìn)程多少CPU時(shí)間。接著是CreateProcess() 函數(shù)調(diào)用所需要的三個(gè)通常使用缺省值的參數(shù)。第一個(gè)參數(shù)是lpEnvironment參數(shù),指明為新進(jìn)程提供的環(huán)境;第二個(gè)參數(shù)是lpCurrentDirectory,可用于向主創(chuàng)進(jìn)程發(fā)送與缺省

10、目錄不同的新進(jìn)程使用的特殊的當(dāng)前目錄;第三個(gè)參數(shù)是STARTUPINFO數(shù)據(jù)結(jié)構(gòu)所必需的,用于在必要時(shí)指明新應(yīng)用程序的主窗口的外觀。CreateProcess() 的最后一個(gè)參數(shù)是用于新進(jìn)程對(duì)象及其主線程的句柄和ID的返回值緩沖區(qū)。以PROCESS_INFORMATION結(jié)構(gòu)中返回的句柄調(diào)用CloseHandle() API函數(shù)是重要的,因?yàn)槿绻粚⑦@些句柄關(guān)閉的話,有可能危及主創(chuàng)進(jìn)程終止之前的任何未釋放的資源。 2. 正在運(yùn)行的進(jìn)程如果一個(gè)進(jìn)程擁有至少一個(gè)執(zhí)行線程,則為正在系統(tǒng)中運(yùn)行的進(jìn)程。通常,這種進(jìn)程使用主線程來(lái)指示它的存在。當(dāng)主線程結(jié)束時(shí),調(diào)用ExitProcess() API函數(shù),通

11、知系統(tǒng)終止它所擁有的所有正在運(yùn)行、準(zhǔn)備運(yùn)行或正在掛起的其他線程。當(dāng)進(jìn)程正在運(yùn)行時(shí),可以查看它的許多特性,其中少數(shù)特性也允許加以修改。首先可查看的進(jìn)程特性是系統(tǒng)進(jìn)程標(biāo)識(shí)符 (PID) ,可利用GetCurrentProcessId() API函數(shù)來(lái)查看,與GetCurrentProcess() 相似,對(duì)該函數(shù)的調(diào)用不能失敗,但返回的PID在整個(gè)系統(tǒng)中都可使用。其他的可顯示當(dāng)前進(jìn)程信息的API函數(shù)還有GetStartupInfo()和GetProcessShutdownParameters() ,可給出進(jìn)程存活期內(nèi)的配置詳情。通常,一個(gè)進(jìn)程需要它的運(yùn)行期環(huán)境的信息。例如API函數(shù)GetModule

12、FileName() 和GetCommandLine() ,可以給出用在CreateProcess() 中的參數(shù)以啟動(dòng)應(yīng)用程序。在創(chuàng)建應(yīng)用程序時(shí)可使用的另一個(gè)API函數(shù)是IsDebuggerPresent() ??衫肁PI函數(shù)GetGuiResources() 來(lái)查看進(jìn)程的GUI資源。此函數(shù)既可返回指定進(jìn)程中的打開(kāi)的GUI對(duì)象的數(shù)目,也可返回指定進(jìn)程中打開(kāi)的USER對(duì)象的數(shù)目。進(jìn)程的其他性能信息可通過(guò)GetProcessIoCounters()、GetProcessPriorityBoost() 、GetProcessTimes() 和GetProcessWorkingSetSize() A

13、PI得到。以上這幾個(gè)API函數(shù)都只需要具有PROCESS_QUERY_INFORMATION訪問(wèn)權(quán)限的指向所感興趣進(jìn)程的句柄。另一個(gè)可用于進(jìn)程信息查詢(xún)的API函數(shù)是GetProcessVersion() 。此函數(shù)只需感興趣進(jìn)程的PID (進(jìn)程標(biāo)識(shí)號(hào)) 。本實(shí)驗(yàn)程序清單3-6中列出了這一API函數(shù)與GetVersionEx() 的共同作用,可確定運(yùn)行進(jìn)程的系統(tǒng)的版本號(hào)。 3. 終止進(jìn)程所有進(jìn)程都是以調(diào)用ExitProcess() 或者TerminateProcess() 函數(shù)結(jié)束的。但最好使用前者而不要使用后者,因?yàn)檫M(jìn)程是在完成了它的所有的關(guān)閉“職責(zé)”之后以正常的終止方式來(lái)調(diào)用前者的。而外部進(jìn)程

14、通常調(diào)用后者即突然終止進(jìn)程的進(jìn)行,由于關(guān)閉時(shí)的途徑不太正常,有可能引起錯(cuò)誤的行為。TerminateProcess() API函數(shù)只要打開(kāi)帶有PROCESS_TERMINATE訪問(wèn)權(quán)的進(jìn)程對(duì)象,就可以終止進(jìn)程,并向系統(tǒng)返回指定的代碼。這是一種“野蠻”的終止進(jìn)程的方式,但是有時(shí)卻是需要的。如果開(kāi)發(fā)人員確實(shí)有機(jī)會(huì)來(lái)設(shè)計(jì)“謀殺”(終止別的進(jìn)程的進(jìn)程) 和“受害”進(jìn)程 (被終止的進(jìn)程) 時(shí),應(yīng)該創(chuàng)建一個(gè)進(jìn)程間通訊的內(nèi)核對(duì)象如一個(gè)互斥程序這樣一來(lái),“受害”進(jìn)程只在等待或周期性地測(cè)試它是否應(yīng)該終止。 4.進(jìn)程同步Windows 2000/XP提供的常用對(duì)象可分成三類(lèi):核心應(yīng)用服務(wù)、線程同步和線程間通訊。其

15、中,開(kāi)發(fā)人員可以使用線程同步對(duì)象來(lái)協(xié)調(diào)線程和進(jìn)程的工作,以使其共享信息并執(zhí)行任務(wù)。此類(lèi)對(duì)象包括互鎖數(shù)據(jù)、臨界段、事件、互斥體和信號(hào)等。多線程編程中關(guān)鍵的一步是保護(hù)所有的共享資源,工具主要有互鎖函數(shù)、臨界段和互斥體等;另一個(gè)實(shí)質(zhì)性部分是協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),為此,可利用內(nèi)核中的事件對(duì)象和信號(hào)。在進(jìn)程內(nèi)或進(jìn)程間實(shí)現(xiàn)線程同步的最方便的方法是使用事件對(duì)象,這一組內(nèi)核對(duì)象允許一個(gè)線程對(duì)其受信狀態(tài)進(jìn)行直接控制 (見(jiàn)表2-1) 。而互斥體則是另一個(gè)可命名且安全的內(nèi)核對(duì)象,其主要目的是引導(dǎo)對(duì)共享資源的訪問(wèn)。擁有單一訪問(wèn)資源的線程創(chuàng)建互斥體,所有想要訪問(wèn)該資源的線程應(yīng)該在實(shí)際執(zhí)行操作之前獲得互斥體,而

16、在訪問(wèn)結(jié)束時(shí)立即釋放互斥體,以允許下一個(gè)等待線程獲得互斥體,然后接著進(jìn)行下去。與事件對(duì)象類(lèi)似,互斥體容易創(chuàng)建、打開(kāi)、使用并清除。利用CreateMutex() API可創(chuàng)建互斥體,創(chuàng)建時(shí)還可以指定一個(gè)初始的擁有權(quán)標(biāo)志,通過(guò)使用這個(gè)標(biāo)志,只有當(dāng)線程完成了資源的所有的初始化工作時(shí),才允許創(chuàng)建線程釋放互斥體。 表2-1 用于管理事件對(duì)象的APIAPI名稱(chēng)描述CreateEvent()在內(nèi)核中創(chuàng)建一個(gè)新的事件對(duì)象。此函數(shù)允許有安全性設(shè)置、手工還是自動(dòng)重置的標(biāo)志以及初始時(shí)已接受還是未接受信號(hào)狀態(tài)的標(biāo)志OpenEvent()創(chuàng)建對(duì)已經(jīng)存在的事件對(duì)象的引用。此API函數(shù)需要名稱(chēng)、繼承標(biāo)志和所需的訪

17、問(wèn)級(jí)別SetEvent()將手工重置事件轉(zhuǎn)化為已接受信號(hào)狀態(tài)ResetEvent()將手工重置事件轉(zhuǎn)化為非接受信號(hào)狀態(tài)PulseEvent()將自動(dòng)重置事件對(duì)象轉(zhuǎn)化為已接受信號(hào)狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程時(shí)此種轉(zhuǎn)化立即發(fā)生 為了獲得互斥體,首先,想要訪問(wèn)調(diào)用的線程可使用OpenMutex() API來(lái)獲得指向?qū)ο蟮木浔?;然后,線程將這個(gè)句柄提供給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥體對(duì)象發(fā)送給等待線程時(shí),就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對(duì)共享資源的訪問(wèn)必須設(shè)法盡快地放棄互斥體。放棄共享資源時(shí)需要在該對(duì)象上調(diào)用ReleaseMute() API。然后系統(tǒng)負(fù)責(zé)

18、將互斥體擁有權(quán)傳遞給下一個(gè)等待著的線程 (由到達(dá)時(shí)間決定順序) 。1、實(shí)驗(yàn)?zāi)康?) 通過(guò)創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windows進(jìn)程的“一生”。2) 通過(guò)閱讀和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程、終止進(jìn)程以及父子進(jìn)程同步的基本程序設(shè)計(jì)方法。2、實(shí)驗(yàn)內(nèi)容和步驟 (1). 創(chuàng)建進(jìn)程本實(shí)驗(yàn)顯示了創(chuàng)建子進(jìn)程的基本框架。該程序只是再一次地啟動(dòng)自身,顯示它的系統(tǒng)進(jìn)程ID和它在進(jìn)程列表中的位置。步驟1:創(chuàng)建一個(gè)“Win32 Consol Application”工程,然后拷貝清單2-1中的程序,編譯成可執(zhí)行文件。步驟2:在“命令提示符”窗

19、口運(yùn)行步驟1中生成的可執(zhí)行文件。運(yùn)行結(jié)果:范例:E:課程os課os實(shí)驗(yàn)程序os11debug>os21 (假設(shè)編譯生成的可執(zhí)行文件是os21.exe)Process ID:5368, Clone ID:0Process ID:6664, Clone ID:1Process ID:756, Clone ID:2Process ID:8056, Clone ID:3Process ID:2856, Clone ID:4Process ID:1116, Clone ID:5按下ctrl+alt+del,調(diào)用windows的任務(wù)管理器,記錄進(jìn)程相關(guān)的行為屬性:步驟3:在“命令提示符”窗口加入?yún)?shù)

20、重新運(yùn)行生成的可執(zhí)行文件。運(yùn)行結(jié)果:范例:E:課程os課os實(shí)驗(yàn)程序os11debug>os21 3(假設(shè)編譯生成的可執(zhí)行文件是os21.exe)Process ID:8896, Clone ID:3Process ID:8572, Clone ID:4Process ID:9076, Clone ID:5按下ctrl+alt+del,調(diào)用windows的任務(wù)管理器,記錄進(jìn)程相關(guān)的行為屬性:步驟4:修改清單2-1中的程序,將nClone的定義和初始化方法按程序注釋中的修改方法進(jìn)行修改,編譯成可執(zhí)行文件(執(zhí)行前請(qǐng)先保存已經(jīng)完成的工作)。再按步驟2中的方式運(yùn)行,看看結(jié)果會(huì)有什么不一樣。運(yùn)行結(jié)

21、果:第一次修改:Process ID:1840, Clone ID:3Process ID:3376, Clone ID:4Process ID:4024, Clone ID:5第二次修改:一直循環(huán),不斷彈出新的DOS,Process ID:2376, Clone ID:0知道內(nèi)存耗盡從中你可以得出什么結(jié)論:賦值語(yǔ)句不同會(huì)影響到結(jié)果作用:控制ID的起始值,并控制其輸出窗口的數(shù)量。變量的定義和初始化方法(位置)對(duì)程序的執(zhí)行結(jié)果有影響嗎?為什么?有影響,變量的定義影響了程序的結(jié)果數(shù)目,還影響了ID的其實(shí)位置,由于變量的初始化使程序的循環(huán)次數(shù)發(fā)生改變,直接改變了結(jié)果,所以結(jié)果由變量的不同而不同。(2

22、). 父子進(jìn)程的簡(jiǎn)單通信及終止進(jìn)程步驟1:創(chuàng)建一個(gè)“Win32 Consol Application”工程,然后拷貝清單2-2中的程序,編譯成可執(zhí)行文件。步驟2:在VC的工具欄單擊“Execute Program”(執(zhí)行程序) 按鈕,或者按Ctrl + F5鍵,或者在“命令提示符”窗口運(yùn)行步驟1中生成的可執(zhí)行文件。運(yùn)行結(jié)果:范例:E:課程os課os實(shí)驗(yàn)程序os11debug>os22 (假設(shè)編譯生成的可執(zhí)行文件是os22.exe)Child waiting for suicide instructions.Creating the child process.Telling the ch

23、ild process to quit.步驟3:按源程序中注釋中的提示,修改源程序2-2,編譯執(zhí)行(執(zhí)行前請(qǐng)先保存已經(jīng)完成的工作)。運(yùn)行結(jié)果: 死循環(huán)在程序中加入跟蹤語(yǔ)句,或調(diào)試運(yùn)行程序,同時(shí)參考MSDN中的幫助文件CreateProcess()的使用方法,理解父子進(jìn)程如何傳遞參數(shù)。給出程序執(zhí)行過(guò)程的大概描述:產(chǎn)生的應(yīng)用程序的名稱(chēng) (本EXE文件), 告訴其行為像一個(gè)子進(jìn)程的標(biāo)志,不繼承句柄,使用新的控制臺(tái),新的環(huán)境,啟動(dòng)信息,返回的進(jìn)程信息。步驟4:填空 CreateProcess() 函數(shù)有_8_個(gè)核心參數(shù)?本實(shí)驗(yàn)程序中設(shè)置的各個(gè)參數(shù)的值是:a. szFilename;b. szCmdLi

24、ne,;c. NULL;d. NULL;e. FALSE;f. CREATE_NEW_CONSOLE;g. NULL;h. NULL。步驟5:按源程序中注釋中的提示,修改源程序2-2,編譯執(zhí)行。運(yùn)行結(jié)果: Creating the child process.Telling the child process to quit.步驟6:參考MSDN中的幫助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子進(jìn)程如何利用互斥體進(jìn)行同步的。給出父子進(jìn)程同步過(guò)程的一個(gè)大概描述: 首先,進(jìn)程創(chuàng)建一個(gè)互斥體,打

25、開(kāi)互斥體,如遇到互斥,則進(jìn)行處理,處理完后,釋放互斥體,下面便是進(jìn)程等待下一個(gè)要處理的項(xiàng)目。3、 實(shí)驗(yàn)結(jié)論每個(gè)進(jìn)程都從調(diào)用CreateProcess() API函數(shù)開(kāi)始,該函數(shù)的任務(wù)是在對(duì)象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對(duì)象。每一進(jìn)程都以調(diào)用ExitProcess() 或TerminateProcess() API函數(shù)終止。通常應(yīng)用程序的框架負(fù)責(zé)調(diào)用 ExitProcess() 函數(shù)。進(jìn)程都是有始有終,其中有中斷,還有處理進(jìn)程間互斥的函數(shù),已達(dá)到進(jìn)程的完成后自然終止。實(shí)驗(yàn)三 進(jìn)程同步的經(jīng)典算法背景知識(shí)Windows 2000提供的常用對(duì)象可分成三類(lèi):核心應(yīng)用服務(wù)、線程同步和線程間通訊。其中,開(kāi)發(fā)人員

26、可以使用線程同步對(duì)象來(lái)協(xié)調(diào)線程和進(jìn)程的工作,以使其共享信息并執(zhí)行任務(wù)。此類(lèi)對(duì)象包括互鎖數(shù)據(jù)、臨界段、事件、互斥體和信號(hào)等。多線程編程中關(guān)鍵的一步是保護(hù)所有的共享資源,工具主要有互鎖函數(shù)、臨界段和互斥體等;另一個(gè)實(shí)質(zhì)性部分是協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),為此,可利用內(nèi)核中的事件對(duì)象和信號(hào)。在進(jìn)程內(nèi)或進(jìn)程間實(shí)現(xiàn)線程同步的最方便的方法是使用事件對(duì)象,這一組內(nèi)核對(duì)象允許一個(gè)線程對(duì)其受信狀態(tài)進(jìn)行直接控制 (見(jiàn)表3-1) 。而互斥體則是另一個(gè)可命名且安全的內(nèi)核對(duì)象,其主要目的是引導(dǎo)對(duì)共享資源的訪問(wèn)。擁有單一訪問(wèn)資源的線程創(chuàng)建互斥體,所有想要訪問(wèn)該資源的線程應(yīng)該在實(shí)際執(zhí)行操作之前獲得互斥體,而在訪問(wèn)結(jié)束時(shí)

27、立即釋放互斥體,以允許下一個(gè)等待線程獲得互斥體,然后接著進(jìn)行下去。與事件對(duì)象類(lèi)似,互斥體容易創(chuàng)建、打開(kāi)、使用并清除。利用CreateMutex() API可創(chuàng)建互斥體,創(chuàng)建時(shí)還可以指定一個(gè)初始的擁有權(quán)標(biāo)志,通過(guò)使用這個(gè)標(biāo)志,只有當(dāng)線程完成了資源的所有的初始化工作時(shí),才允許創(chuàng)建線程釋放互斥體。 表3-1 用于管理事件對(duì)象的APIAPI名稱(chēng)描述CreateEvent()在內(nèi)核中創(chuàng)建一個(gè)新的事件對(duì)象。此函數(shù)允許有安全性設(shè)置、手工還是自動(dòng)重置的標(biāo)志以及初始時(shí)已接受還是未接受信號(hào)狀態(tài)的標(biāo)志OpenEvent()創(chuàng)建對(duì)已經(jīng)存在的事件對(duì)象的引用。此API函數(shù)需要名稱(chēng)、繼承標(biāo)志和所需的訪問(wèn)級(jí)別Set

28、Event()將手工重置事件轉(zhuǎn)化為已接受信號(hào)狀態(tài)ResetEvent()將手工重置事件轉(zhuǎn)化為非接受信號(hào)狀態(tài)PulseEvent()將自動(dòng)重置事件對(duì)象轉(zhuǎn)化為已接受信號(hào)狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程時(shí)此種轉(zhuǎn)化立即發(fā)生 為了獲得互斥體,首先,想要訪問(wèn)調(diào)用的線程可使用OpenMutex() API來(lái)獲得指向?qū)ο蟮木浔?;然后,線程將這個(gè)句柄提供給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥體對(duì)象發(fā)送給等待線程時(shí),就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對(duì)共享資源的訪問(wèn)必須設(shè)法盡快地放棄互斥體。放棄共享資源時(shí)需要在該對(duì)象上調(diào)用ReleaseMute() API。然后系統(tǒng)負(fù)責(zé)將互斥體擁有

29、權(quán)傳遞給下一個(gè)等待著的線程 (由到達(dá)時(shí)間決定順序) 。1、實(shí)驗(yàn)?zāi)康?) 回顧系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows 2000線程的理解。2) 了解互斥體對(duì)象,通過(guò)對(duì)生產(chǎn)者消費(fèi)者等進(jìn)程間同步與互斥經(jīng)典算法的實(shí)現(xiàn),加深對(duì)P、V原語(yǔ)以及利用P、V原語(yǔ)進(jìn)行進(jìn)程間同步與互斥操作的理解。2、實(shí)驗(yàn)內(nèi)容和步驟 (1). 生產(chǎn)者消費(fèi)者問(wèn)題步驟1:創(chuàng)建一個(gè)“Win32 Consol Application”工程,然后拷貝清單3-1中的程序,編譯成可執(zhí)行文件。步驟2:在“命令提示符”窗口運(yùn)行步驟1中生成的可執(zhí)行文件。運(yùn)行結(jié)果:范例:E:課程os課os實(shí)驗(yàn)程序os11debug>os31 (假設(shè)編譯生成

30、的可執(zhí)行文件是os31.exe)步驟3:仔細(xì)閱讀源程序,找出創(chuàng)建線程的WINDOWS API函數(shù),回答下列問(wèn)題:線程的第一個(gè)執(zhí)行函數(shù)是什么(從哪里開(kāi)始執(zhí)行)?它位于創(chuàng)建線程的API函數(shù)的第幾個(gè)參數(shù)中?第一個(gè)執(zhí)行函數(shù)是:DWORD WINAPI Producer(LPVOID lpPara)Produce();它位于創(chuàng)建線程的API函數(shù)的第3個(gè)參數(shù)中。步驟4:修改清單3-1中的程序,調(diào)整生產(chǎn)者線程和消費(fèi)者線程的個(gè)數(shù),使得消費(fèi)者數(shù)目大與生產(chǎn)者,看看結(jié)果有何不同。運(yùn)行結(jié)果:從中你可以得出什么結(jié)論:進(jìn)程執(zhí)行中,有一定的次序,如程序運(yùn)行結(jié)果是:首先是consuming,然后producing,其次是ap

31、pending,最后是taking aproduct,步驟5:修改清單3-1中的程序,按程序注釋中的說(shuō)明修改信號(hào)量EmptySemaphore的初始化方法,看看結(jié)果有何不同。運(yùn)行結(jié)果:步驟6:根據(jù)步驟4的結(jié)果,并查看MSDN,回答下列問(wèn)題1)CreateMutex中有幾個(gè)參數(shù),各代表什么含義。三個(gè):lpMutexAttributes SECURITY_ATTRIBUTES,指定一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu),或傳遞零值,表示使用不允許繼承的默認(rèn)描述符 ;bInitialOwner Long,如創(chuàng)建進(jìn)程希望立即擁有互斥體,則設(shè)為T(mén)RUE。一個(gè)互斥體同時(shí)只能由一個(gè)線程擁有 ;lpN

32、ame String,指定互斥體對(duì)象的名字。2)CreateSemaphore中有幾個(gè)參數(shù),各代表什么含義,信號(hào)量的初值在第幾個(gè)參數(shù)中。四個(gè): lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu),或傳遞零值表示采用不允許繼承的默認(rèn)描述符。該參數(shù)定義了信號(hào)機(jī)的安全特性 ;lInitialCount Long,設(shè)置信號(hào)機(jī)的初始計(jì)數(shù)??稍O(shè)置零到lMaximumCount之間的一個(gè)值 ;lMaximumCount Long,設(shè)置信號(hào)機(jī)的最大計(jì)數(shù) ;lpName String,指定信號(hào)機(jī)對(duì)象的名稱(chēng)。3)程序中P、V原語(yǔ)所

33、對(duì)應(yīng)的實(shí)際Windows API函數(shù)是什么,寫(xiě)出這幾條語(yǔ)句。HANDLE Mutex;HANDLE FullSemaphore;HANDLE EmptySemaphore;DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); 4)CreateMutex能用CreateSemaphore替代嗎?嘗試修改程序3-1,將信號(hào)量Mutex完全用CreateSemaphore及相關(guān)函數(shù)實(shí)現(xiàn)。寫(xiě)出要修改的語(yǔ)句:1、 可以。2、 修改的語(yǔ)句為:Mutex = CreateSemaphore(NULL,0,0,NULL);(2). 讀者寫(xiě)者

34、問(wèn)題根據(jù)實(shí)驗(yàn)(1)中所熟悉的P、V原語(yǔ)對(duì)應(yīng)的實(shí)際Windows API函數(shù),并參考教材中讀者、寫(xiě)者問(wèn)題的算法原理,嘗試?yán)肳indows API函數(shù)實(shí)現(xiàn)第一類(lèi)讀者寫(xiě)者問(wèn)題(讀者優(yōu)先)。3、 實(shí)驗(yàn)結(jié)論通過(guò)對(duì)生產(chǎn)者、消費(fèi)者問(wèn)題的處理,加深理解了進(jìn)程是可并發(fā)執(zhí)行的程序在某個(gè)數(shù)據(jù)集合上的一次計(jì)算活動(dòng),也是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。線程是繼進(jìn)程之后引進(jìn)的,為了減少程序并發(fā)執(zhí)行的時(shí)空開(kāi)銷(xiāo),使得并發(fā)粒度更細(xì),并發(fā)性更好。生產(chǎn)者、消費(fèi)者不但解決進(jìn)程間同步,還解決了進(jìn)程的互斥,其算法思想很經(jīng)典,對(duì)P,V原語(yǔ)的理解有很大的幫助。實(shí)驗(yàn)四 存儲(chǔ)管理背景知識(shí)耗盡內(nèi)存是Windows 2000/XP系統(tǒng)中最常

35、見(jiàn)的問(wèn)題之一。當(dāng)系統(tǒng)耗盡內(nèi)存時(shí),所有進(jìn)程對(duì)內(nèi)存的總需求超出了系統(tǒng)的物理內(nèi)存總量。隨后,Windows 2000/XP必須借助它的虛擬內(nèi)存來(lái)維持系統(tǒng)和進(jìn)程的運(yùn)行。虛擬內(nèi)存機(jī)制是Windows 2000/XP操作系統(tǒng)的重要組成部分,但它的速度比物理內(nèi)存慢得多,因此,應(yīng)該盡量避免耗盡物理內(nèi)存資源,以免導(dǎo)致性能下降。解決內(nèi)存不足問(wèn)題的一個(gè)有效的方法就是添加更多的內(nèi)存。但是,一旦提供了更多的內(nèi)存,Windows 2000/XP很可以會(huì)立即“吞食”。而事實(shí)上,添加更多的內(nèi)存并非總是可行的,也可能只是推遲了實(shí)際問(wèn)題的發(fā)生。因此,應(yīng)該相信,優(yōu)化所擁有的內(nèi)存是非常關(guān)鍵的。1. 分頁(yè)過(guò)程當(dāng)Windows 2000

36、/XP求助于硬盤(pán)以獲得虛擬內(nèi)存時(shí),這個(gè)過(guò)程被稱(chēng)為分頁(yè) (paging) 。分頁(yè)就是將信息從主內(nèi)存移動(dòng)到磁盤(pán)進(jìn)行臨時(shí)存儲(chǔ)的過(guò)程。應(yīng)用程序?qū)⑽锢韮?nèi)存和虛擬內(nèi)存視為一個(gè)獨(dú)立的實(shí)體,甚至不知道Windows 2000/XP使用了兩種內(nèi)存方案,而認(rèn)為系統(tǒng)擁有比實(shí)際內(nèi)存更多的內(nèi)存。例如,系統(tǒng)的內(nèi)存數(shù)量可能只有16MB,但每一個(gè)應(yīng)用程序仍然認(rèn)為有4GB內(nèi)存可供使用。使用分頁(yè)方案帶來(lái)了很多好處,不過(guò)這是有代價(jià)的。當(dāng)進(jìn)程需要已經(jīng)交換到硬盤(pán)上的代碼或數(shù)據(jù)時(shí),系統(tǒng)要將數(shù)據(jù)送回物理內(nèi)存,并在必要時(shí)將其他信息傳輸?shù)接脖P(pán)上,而硬盤(pán)與物理內(nèi)存在性能上的差異極大。例如,硬盤(pán)的訪問(wèn)時(shí)間通常大約為4-10毫秒,而物理內(nèi)存的訪問(wèn)時(shí)

37、間為60 us,甚至更快。2. 內(nèi)存共享應(yīng)用程序經(jīng)常需要彼此通信和共享信息。為了提供這種能力,Windows 2000/XP必須允許訪問(wèn)某些內(nèi)存空間而不危及它和其他應(yīng)用程序的安全性和完整性。從性能的角度來(lái)看,共享內(nèi)存的能力大大減少了應(yīng)用程序使用的內(nèi)存數(shù)量。運(yùn)行一個(gè)應(yīng)用程序的多個(gè)副本時(shí),每一個(gè)實(shí)例都可以使用相同的代碼和數(shù)據(jù),這意味著不必維護(hù)所加載應(yīng)用程序代碼的單獨(dú)副本并使用相同的內(nèi)存資源。無(wú)論正在運(yùn)行多少個(gè)應(yīng)用程序?qū)嵗浞种С謶?yīng)用程序代碼所需求的內(nèi)存數(shù)量都相對(duì)保持不變。3. 未分頁(yè)合并內(nèi)存與分頁(yè)合并內(nèi)存Windows 2000/XP決定了系統(tǒng)內(nèi)存組件哪些可以以及哪些不可以交換到磁盤(pán)上。顯然,不

38、應(yīng)該將某些代碼 (例如內(nèi)核) 交換出主內(nèi)存。因此,Windows 2000/XP將系統(tǒng)使用的內(nèi)存進(jìn)一步劃分為未分頁(yè)合并內(nèi)存和分頁(yè)合并內(nèi)存。分頁(yè)合并內(nèi)存是存儲(chǔ)遲早需要的可分頁(yè)代碼或數(shù)據(jù)的內(nèi)存部分。雖然可以將分頁(yè)合并內(nèi)存中的任何系統(tǒng)進(jìn)程交換到磁盤(pán)上,但是它臨時(shí)存儲(chǔ)在主內(nèi)存的這一部分,以防系統(tǒng)立刻需要它。在將系統(tǒng)進(jìn)程交換到磁盤(pán)上之前,Windows 2000/XP會(huì)交換其他進(jìn)程。未分頁(yè)合并內(nèi)存包含必須駐留在內(nèi)存中的占用代碼或數(shù)據(jù)。這種結(jié)構(gòu)類(lèi)似于早期的MS-DOS程序使用的結(jié)構(gòu),在MS-DOS中,相對(duì)較小的終止并駐留程序 (Terminate and Stay Resident,TSR) 在啟動(dòng)時(shí)加載

39、到內(nèi)存中。這些程序在系統(tǒng)重新啟動(dòng)或關(guān)閉之前一直駐留在內(nèi)存的特定部分中。例如,防病毒程序?qū)⒓虞d為T(mén)SR程序,以預(yù)防可能的病毒襲擊。未分頁(yè)合并內(nèi)存中包含的進(jìn)程保留在主內(nèi)存中,并且不能交換到磁盤(pán)上。物理內(nèi)存的這個(gè)部分用于內(nèi)核模式操作(例如,驅(qū)動(dòng)程序)和必須保留在主內(nèi)存中才能有效工作的其他進(jìn)程。沒(méi)有主內(nèi)存的這個(gè)部分,內(nèi)核組件就將是可分頁(yè)的,系統(tǒng)本身就有變得不穩(wěn)定的危險(xiǎn)。分配到未分頁(yè)內(nèi)存池的主內(nèi)存數(shù)量取決于服務(wù)器擁有的物理內(nèi)存數(shù)量以及進(jìn)程對(duì)系統(tǒng)上的內(nèi)存地空間的需求。不過(guò),Windows 2000/XP將未分頁(yè)合并內(nèi)存限制為256MB (在Windows NT 4中的限制為128MB) 。根據(jù)系統(tǒng)中的物理

40、內(nèi)存數(shù)量,復(fù)雜的算法在啟動(dòng)時(shí)動(dòng)態(tài)確定Windows 2000/XP系統(tǒng)上的未分頁(yè)合并內(nèi)存的最大數(shù)量。Windows 2000/XP內(nèi)部的這一自我調(diào)節(jié)機(jī)制可以根據(jù)當(dāng)前的內(nèi)存配置自動(dòng)調(diào)整大小。例如,如果增加或減少系統(tǒng)中的內(nèi)存數(shù)量,那么Windows2000將自動(dòng)調(diào)整未分頁(yè)合并內(nèi)存的大小,以反映這一更改。4. 提高分頁(yè)性能只有一個(gè)物理硬盤(pán)驅(qū)動(dòng)器的系統(tǒng)限制了優(yōu)化分頁(yè)性能的能力。驅(qū)動(dòng)器必須處理系統(tǒng)和應(yīng)用程序的請(qǐng)求以及對(duì)分頁(yè)文件的訪問(wèn)。雖然物理驅(qū)動(dòng)器可能有多個(gè)分區(qū),但是將分頁(yè)文件分布到多個(gè)分區(qū)的分頁(yè)文件并不能提高硬盤(pán)驅(qū)動(dòng)器的能力。只有當(dāng)一個(gè)分區(qū)沒(méi)有足夠的空間來(lái)包含整個(gè)分頁(yè)文件時(shí),才將分頁(yè)文件放在同一個(gè)硬盤(pán)

41、的多個(gè)分區(qū)上。擁有多個(gè)物理驅(qū)動(dòng)器的服務(wù)器可以使用多個(gè)分頁(yè)文件來(lái)提高分頁(yè)性能。關(guān)鍵是將分頁(yè)請(qǐng)求的負(fù)載分布到多個(gè)物理硬盤(pán)上。實(shí)際上,使用獨(dú)立物理驅(qū)動(dòng)器上的分頁(yè)文件,系統(tǒng)可以同時(shí)處理多個(gè)分頁(yè)請(qǐng)求。各個(gè)物理驅(qū)動(dòng)器可以同時(shí)訪問(wèn)它自己的分頁(yè)文件并寫(xiě)入信息,這將增加可以傳輸?shù)男畔⒘俊6鄠€(gè)分頁(yè)文件的最佳配置是將各個(gè)分頁(yè)文件放在擁有自己的控制器的獨(dú)立驅(qū)動(dòng)器上。不過(guò),由于額外的費(fèi)用并且系統(tǒng)上的可用中斷很有限,因此對(duì)于大多數(shù)基于服務(wù)器的配置來(lái)說(shuō),這可能是不切實(shí)際的解決方案。分頁(yè)文件最重要的配置參數(shù)是大小。無(wú)論系統(tǒng)中有多少個(gè)分頁(yè)文件,如果它們的大小不合適,那么系統(tǒng)就可能遇到性能問(wèn)題。如果初始值太小,那么系統(tǒng)可能必須擴(kuò)

42、大分頁(yè)文件,以補(bǔ)償額外的分頁(yè)活動(dòng)。當(dāng)系統(tǒng)臨時(shí)增加分頁(yè)文件時(shí),它必須在處理分頁(yè)請(qǐng)求的同時(shí)創(chuàng)建新的空間。這時(shí),系統(tǒng)將出現(xiàn)大量的頁(yè)面錯(cuò)誤,甚至可能出現(xiàn)系統(tǒng)失效。當(dāng)系統(tǒng)必須在進(jìn)程的工作區(qū)外部 (在物理內(nèi)存或分頁(yè)文件中的其他位置) 查找信息時(shí),就會(huì)出現(xiàn)頁(yè)面錯(cuò)誤。當(dāng)系統(tǒng)缺乏存儲(chǔ)資源 (物理內(nèi)存及虛擬內(nèi)存) 來(lái)滿足使用需求,從而遇到過(guò)多的分頁(yè)時(shí),就會(huì)出現(xiàn)系統(tǒng)失效。系統(tǒng)將花更多的時(shí)間來(lái)分頁(yè)而不是執(zhí)行應(yīng)用程序。當(dāng)系統(tǒng)失效時(shí),Memory:Pages/see計(jì)數(shù)器將持續(xù)高于每秒100頁(yè)。系統(tǒng)失效嚴(yán)重降低了系統(tǒng)的性能。此外,動(dòng)態(tài)擴(kuò)展分頁(yè)文件將導(dǎo)致碎片化。分頁(yè)文件將散布在整個(gè)磁盤(pán)上而不是在啟動(dòng)時(shí)的連續(xù)空間中創(chuàng)建,從而

43、增加了系統(tǒng)的開(kāi)銷(xiāo),并導(dǎo)致系統(tǒng)性能降低。因此,應(yīng)該盡量避免系統(tǒng)增加分頁(yè)文件的大小。提示:1) WINDOWS中采用的虛擬存儲(chǔ)管理方案是請(qǐng)求頁(yè)式存儲(chǔ)管理,分頁(yè)文件就是我們?cè)碚n中所說(shuō)的交換/對(duì)換文件,存放的內(nèi)容是暫時(shí)被交換到外存中的進(jìn)程頁(yè)面。UNIX使用的是交換分區(qū),WINDOWS使用的是交換文件。2)在NTFS驅(qū)動(dòng)器上,總是至少保留25的空閑驅(qū)動(dòng)器空間,以確??梢栽谶B續(xù)的空間中創(chuàng)建分頁(yè)文件。3) Windows 2000使用內(nèi)存數(shù)量的1.5倍作為分頁(yè)文件的最小容量,這個(gè)最小容量的兩倍作為最大容量。它減少了系統(tǒng)因?yàn)殄e(cuò)誤配置的分頁(yè)文件而崩潰的可能性。系統(tǒng)在崩潰之后能夠?qū)?nèi)存轉(zhuǎn)儲(chǔ)寫(xiě)入磁盤(pán),所以系統(tǒng)分區(qū)

44、必須有一個(gè)至少等于物理內(nèi)存數(shù)量加上1的分頁(yè)文件。5. Windows虛擬內(nèi)存 Windows 2000是32位的操作系統(tǒng),它使計(jì)算機(jī)CPU可以用32位地址對(duì)32位內(nèi)存塊進(jìn)行操作。內(nèi)存中的每一個(gè)字節(jié)都可以用一個(gè)32位的指針來(lái)尋址。這樣,最大的存儲(chǔ)空間就是232字節(jié)或4000兆字節(jié) (4GB) 。這樣,在Windows下運(yùn)行的每一個(gè)應(yīng)用程序都認(rèn)為能獨(dú)占可能的4GB大小的空間。而另一方面,實(shí)際上沒(méi)有幾臺(tái)機(jī)器的RAM能達(dá)到4GB,更不必說(shuō)讓每個(gè)進(jìn)程都獨(dú)享4GB內(nèi)存了。Windows在幕后將虛擬內(nèi)存 (virtual memory,VM) 地址映射到了各進(jìn)程的物理內(nèi)存地址上。而所謂物理內(nèi)存是指

45、計(jì)算機(jī)的RAM和由Windows分配到用戶驅(qū)動(dòng)器根目錄上的換頁(yè)文件。物理內(nèi)存完全由系統(tǒng)管理。在Windows 2000環(huán)境下,4GB的虛擬地址空間被劃分成兩個(gè)部分:低端2GB提供給進(jìn)程使用,高端2GB提供給系統(tǒng)使用。這意味著用戶的應(yīng)用程序代碼,包括DLL以及進(jìn)程使用的各種數(shù)據(jù)等,都裝在用戶進(jìn)程地址空間內(nèi) (低端2GB) 。用戶進(jìn)程的虛擬地址空間也被分成三部分:1) 虛擬內(nèi)存的已調(diào)配區(qū) (committed) :具有備用的物理內(nèi)存,根據(jù)該區(qū)域設(shè)定的訪問(wèn)權(quán)限,用戶可以進(jìn)行寫(xiě)、讀或在其中執(zhí)行程序等操作。2) 虛擬內(nèi)存的保留區(qū) (reserved) :沒(méi)有備用的物理內(nèi)存,但有一定的訪問(wèn)權(quán)限。3) 虛擬

46、內(nèi)存的自由區(qū) (free) :不限定其用途,有相應(yīng)的PAGE_NOACCESS權(quán)限。與虛擬內(nèi)存區(qū)相關(guān)的訪問(wèn)權(quán)限告知系統(tǒng)進(jìn)程可在內(nèi)存中進(jìn)行何種類(lèi)型的操作。例如,用戶不能在只有PAGE_READONLY權(quán)限的區(qū)域上進(jìn)行寫(xiě)操作或執(zhí)行程序;也不能在只有PAGE_EXECUTE權(quán)限的區(qū)域里進(jìn)行讀、寫(xiě)操作。而具有PAGE_ NOACCESS權(quán)限的特殊區(qū)域,則意味著不允許進(jìn)程對(duì)其地址進(jìn)行任何操作。在進(jìn)程裝入之前,整個(gè)虛擬內(nèi)存的地址空間都被設(shè)置為只有PAGE_NOACCESS權(quán)限的自由區(qū)域。當(dāng)系統(tǒng)裝入進(jìn)程代碼和數(shù)據(jù)后,才將內(nèi)存地址的空間標(biāo)記為已調(diào)配區(qū)或保留區(qū),并將諸如EXECUTE、READWRITE和REA

47、DONLY的權(quán)限與這些區(qū)域相關(guān)聯(lián)。程序清單4-1還顯示了如何理解Virtual QueryEX() API填充的MEMORY_BASIC_ INFORMATION結(jié)構(gòu),如表4-l所示。此數(shù)據(jù)描述了進(jìn)程虛擬內(nèi)存空間中一組虛擬內(nèi)存頁(yè)面的當(dāng)前狀態(tài)。其中State項(xiàng)表明這些區(qū)域是否為自由區(qū)、已調(diào)配區(qū)或保留區(qū);Protect項(xiàng)則包含了Windows系統(tǒng)為這些區(qū)域添加了何種訪問(wèn)保護(hù);Type項(xiàng)則表明這些區(qū)域是可執(zhí)行圖像、內(nèi)存映射文件還是簡(jiǎn)單的私有內(nèi)存。VirtualQueryEX() API能讓用戶在指定的進(jìn)程中,對(duì)虛擬內(nèi)存地址的大小和屬性進(jìn)行檢測(cè)。 表4-1 MEMORY_BASIC_INFO

48、RMATION結(jié)構(gòu)的成員成員名稱(chēng)目的PVOID BaseAddress虛擬內(nèi)存區(qū)域開(kāi)始處的指針PVOID AllocationBase如果這個(gè)特定的區(qū)域?yàn)樽臃峙鋮^(qū)的話,則為虛擬內(nèi)存外面區(qū)域的指針;否則此值與BaseAddress相同DWORD AllocationProtect虛擬內(nèi)存最初分配區(qū)域的保護(hù)屬性。其可能值包括:PAGE_NOACCESS,PAGE_READONLY,PAGE_READWRITE和PAGE _EXECUTE_READDWORD RegionSize虛擬內(nèi)存區(qū)域的字節(jié)數(shù)DWORD State區(qū)域的當(dāng)前分配狀態(tài)。其可能值為MEM_COMMIT,MEM_FREE和MEM_R

49、ESERVEDWORD Protect虛擬內(nèi)存當(dāng)前區(qū)域的保護(hù)屬性。可能值與AllocationProtect成員的相同DWORD Type虛擬內(nèi)存區(qū)域中出現(xiàn)的頁(yè)面類(lèi)型。可能值為MEM_IMAGE, MEM_MAPPED和MEM_PRIVATE  Windows還提供了一整套能使用戶精確控制應(yīng)用程序的虛擬地址空間的虛擬內(nèi)存API。一些用于虛擬內(nèi)存操作及檢測(cè)的API見(jiàn)表4-2所示。提供虛擬內(nèi)存分配功能的是VirtualAlloc() API。該API支持用戶向系統(tǒng)要求新的虛擬內(nèi)存或改變已分配內(nèi)存的當(dāng)前狀態(tài)。用戶若想通過(guò)VirtualAlloc() 函數(shù)使用虛擬內(nèi)存,可以采用兩種

50、方式通知系統(tǒng):1) 簡(jiǎn)單地將內(nèi)存內(nèi)容保存在地址空間內(nèi);2) 請(qǐng)求系統(tǒng)返回帶有物理存儲(chǔ)區(qū) (RAM的空間或換頁(yè)文件) 的部分地址空間。用戶可以用flAllocation Type參數(shù) (commit和reserve) 來(lái)定義這些方式,用戶可以通知Windows按只讀、讀寫(xiě)、不可讀寫(xiě)、執(zhí)行或特殊方式來(lái)處理新的虛擬內(nèi)存。與VirtualAlloc() 函數(shù)對(duì)應(yīng)的是VirtualFree() 函數(shù),其作用是釋放虛擬內(nèi)存中的已調(diào)配頁(yè)或保留頁(yè)。用戶可利用dwFree Type參數(shù)將已調(diào)配頁(yè)修改成保留頁(yè)屬性。VirtualProtect() 是VirtualAlloc() 的一個(gè)輔助函數(shù),利用它可以改變虛擬

51、內(nèi)存區(qū)的保護(hù)規(guī)范。表4-2 虛擬內(nèi)存的APIAPI名稱(chēng)描述VirtualQueryEx()通過(guò)填充MEMORY_BASIC_INFORMATION結(jié)構(gòu)檢測(cè)進(jìn)程內(nèi)虛擬內(nèi)存的區(qū)域VirtualAlloc()保留或調(diào)配進(jìn)程的部分虛擬內(nèi)存,設(shè)置分配和保護(hù)標(biāo)志VirtualFree()釋放或收回應(yīng)用程序使用的部分虛擬地址VirtualProtect()改變虛擬內(nèi)存區(qū)域保護(hù)規(guī)范VirtualLock()防止系統(tǒng)將虛擬內(nèi)存區(qū)域通過(guò)系統(tǒng)交換到頁(yè)面文件中VirtualUnlock()釋放虛擬內(nèi)存的鎖定區(qū)域,必要時(shí),允許系統(tǒng)將其交換到頁(yè)面文件中 1、 實(shí)驗(yàn)?zāi)康模?) 通過(guò)對(duì)Windows 2000“任務(wù)

52、管理器”、“計(jì)算機(jī)管理”、“我的電腦”屬性、“系統(tǒng)信息”、“系統(tǒng)監(jiān)視器”等程序的應(yīng)用,學(xué)習(xí)如何察看和調(diào)整Windows的內(nèi)存性能,加深對(duì)操作系統(tǒng)存儲(chǔ)管理、虛擬存儲(chǔ)管理等理論知識(shí)的理解。(2) 了解Windows 2000的內(nèi)存結(jié)構(gòu)和虛擬內(nèi)存的管理,理解進(jìn)程的虛擬內(nèi)存空間和物理內(nèi)存的映射關(guān)系。2、 實(shí)驗(yàn)內(nèi)容和步驟(1)觀察和調(diào)整Windows 2000/XP的內(nèi)存性能。步驟1:閱讀“背景知識(shí)”,請(qǐng)回答:1) 什么是“分頁(yè)過(guò)程”?當(dāng)Windows 2000/XP求助于硬盤(pán)以獲得虛擬內(nèi)存時(shí),這個(gè)過(guò)程被稱(chēng)為分頁(yè) (paging) 。分頁(yè)就是將信息從主內(nèi)存移動(dòng)到磁盤(pán)進(jìn)行臨時(shí)存儲(chǔ)的過(guò)程。2) 什么是“內(nèi)存

53、共享”?Windows 2000/XP必須允許訪問(wèn)某些內(nèi)存空間而不危及它和其他應(yīng)用程序的安全性和完整性。3) 什么是“未分頁(yè)合并內(nèi)存”和“分頁(yè)合并內(nèi)存”?未分頁(yè)合并內(nèi)存包含必須駐留在內(nèi)存中的占用代碼或數(shù)據(jù)。分頁(yè)合并內(nèi)存是存儲(chǔ)遲早需要的可分頁(yè)代碼或數(shù)據(jù)的內(nèi)存部分。雖然可以將分頁(yè)合并內(nèi)存中的任何系統(tǒng)進(jìn)程交換到磁盤(pán)上,但是它臨時(shí)存儲(chǔ)在主內(nèi)存的這一部分,以防系統(tǒng)立刻需要它。在將系統(tǒng)進(jìn)程交換到磁盤(pán)上之前,Windows 2000/XP會(huì)交換其他進(jìn)程。Windows 2000中,未分頁(yè)合并內(nèi)存的最大限制是多少?Windows 2000/XP將未分頁(yè)合并內(nèi)存限制為256MB (在Windows NT 4中的

54、限制為128MB) 。4) Windows 2000分頁(yè)文件默認(rèn)設(shè)置的最小容量和最大容量是多少?Windows 2000使用內(nèi)存數(shù)量的1.5倍作為分頁(yè)文件的最小容量,這個(gè)最小容量的兩倍作為最大容量。步驟2:登錄進(jìn)入Windows 2000 Professional。步驟3:查看包含多個(gè)實(shí)例的應(yīng)用程序的內(nèi)存需求。1) 啟動(dòng)想要監(jiān)視的應(yīng)用程序,例如Word。2) 右鍵單擊任務(wù)欄以啟動(dòng)“任務(wù)管理器”。3) 在“Windows任務(wù)管理器”對(duì)話框中選定“進(jìn)程”選項(xiàng)卡。4) 向下滾動(dòng)在系統(tǒng)上運(yùn)行的進(jìn)程列表,查找想要監(jiān)視的應(yīng)用程序。請(qǐng)?jiān)诒?-3中記錄: 表4-3 實(shí)驗(yàn)記錄映像名稱(chēng)PIDCPUCPU

55、時(shí)間內(nèi)存使用 Winword.exe  4036 02 0:02:51 28448k “內(nèi)存使用”列顯示了該應(yīng)用程序的一個(gè)實(shí)例正在使用的內(nèi)存數(shù)量。5) 啟動(dòng)應(yīng)用程序的另一個(gè)實(shí)例并觀察它的內(nèi)存需求。請(qǐng)描述使用第二個(gè)實(shí)例占用的內(nèi)存與使用第一個(gè)實(shí)例時(shí)的內(nèi)存對(duì)比情況:沒(méi)什么太大的變化步驟4:未分頁(yè)合并內(nèi)存。估算未分頁(yè)合并內(nèi)存大小的最簡(jiǎn)單方法是使用“任務(wù)管理器”。未分頁(yè)合并內(nèi)存的估計(jì)值顯示在“任務(wù)管理器”的“性能”選項(xiàng)卡的“核心內(nèi)存”部分。總數(shù) (K): 64736分頁(yè)數(shù):48932未分頁(yè) (K) :15804還可以使用“任務(wù)管理器”查看一個(gè)獨(dú)

56、立進(jìn)程正在使用的未分頁(yè)合并內(nèi)存數(shù)量和分頁(yè)合并內(nèi)存數(shù)量。操作步驟如下:1) 單擊“Windows任務(wù)管理器”的“進(jìn)程”選項(xiàng)卡,然后從“查看”菜單中選擇“選擇列”命令,顯示“進(jìn)程”選項(xiàng)卡的可查看選項(xiàng)。2) 在“選擇列”對(duì)話框中,選定“頁(yè)面緩沖池”選項(xiàng)和“非頁(yè)面緩沖池”選項(xiàng)旁邊的復(fù)選框,然后單擊“確定”按鈕。返回Windows 2000“任務(wù)管理器”的“進(jìn)程”選項(xiàng)卡時(shí),將看到其中增加顯示了各個(gè)進(jìn)程占用的分頁(yè)合并內(nèi)存數(shù)量和未分頁(yè)合并內(nèi)存數(shù)量。仍以剛才打開(kāi)觀察的應(yīng)用程序 (例如Word) 為例,請(qǐng)?jiān)诒?-4中記錄: 表4-4 實(shí)驗(yàn)記錄映像名稱(chēng)PID內(nèi)存使用頁(yè)面緩沖池非頁(yè)面緩沖池 winword 4036 37460k 1188k 20k 從性能的角度來(lái)看,未分頁(yè)合并內(nèi)存越多,可以加載到這個(gè)空間的數(shù)據(jù)就越多。擁有的物理內(nèi)存越多,未分頁(yè)合并內(nèi)存就越多。但未分頁(yè)合并內(nèi)存被限制為256MB,因此添加超出這個(gè)限制的內(nèi)存對(duì)未分頁(yè)合并內(nèi)存沒(méi)有影響。步驟5:提高分頁(yè)性能。在Windows 2000的安裝過(guò)程中,將使用連續(xù)的磁盤(pán)空間自動(dòng)創(chuàng)建分頁(yè)文件(pagefile.sys) 。用戶可以事先監(jiān)視變化的內(nèi)存需求并正確配置分頁(yè)文件,使得當(dāng)系統(tǒng)必須借助于分頁(yè)時(shí)的性能達(dá)到最高。雖然分頁(yè)文件一般都放在系統(tǒng)分區(qū)的根目錄下面,但這并不總是該文件

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論