版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄
實驗一WINDOWS進程初識3
1.實驗?zāi)康?
2.實驗內(nèi)容和步驟3
3.實驗結(jié)論4
4.程序清單4
實驗二進程管理6
背景知識6
1.實驗?zāi)康?0
2.實驗內(nèi)容和步驟10
3.實驗結(jié)論12
4.程序清單12
實驗三進程同步的經(jīng)典算法19
背景知識19
1.實驗?zāi)康?8
2.實臉內(nèi)農(nóng)和步驟18
3.實驗結(jié)論19
4.程序清單20
實驗四存儲管理24
背景知識25
1.實驗?zāi)康?8
2.實驗內(nèi)容和步驟28
3.實驗結(jié)論34
4.程序清單34
實驗五文件和設(shè)備管理53
背景知識53
1.實驗?zāi)康?0
2.實驗內(nèi)容與步驟41
3.實驗結(jié)論44
實驗一WINDOWS進程初識
1、實驗?zāi)康?/p>
(1)號本的Win32ConsolApplication
(2)掌握WINDOWSAPI的使用方法。
2、編寫測試程序,理解用戶態(tài)運行和核心態(tài)運行。
3、實驗內(nèi)容和步驟
(1)編寫基本的Win32ConsolApplication
步驟1:登錄進入Windows,啟動VC++6.0。
步驟2:在“FILE”菜單中單擊“NEW”子菜單,在
“projects”選項卡中選擇“Win32ConsolApplication”,
然后在“Projectname”處輸入工程名,在"Location”處
輸入工程目錄。創(chuàng)建一個新的控制臺應(yīng)用程序工程。
步驟3:在“FILE”菜單中單擊“NEW”子菜單,在“Files”
選項卡中選擇“C++SourceFile”,然后在“File”處輸
入C/C++源程序的文件名。
步驟4:將清單1-1所示的程序清單復(fù)制到新創(chuàng)建的
C/C++源程序中。編譯成可執(zhí)行文件。
步驟5:在“開始”菜單中單擊“程序”-“附件”-“命
令提示符”命令,進入Windows"命令提示符"窗口,然后
進入工程目錄中的debug子目錄,執(zhí)行編譯好的可執(zhí)行程
序:
E:\課程\os課\os實驗、程序\osll\debug>hello.exe
運行結(jié)果(如果運行不成功,則可能的原因是什
么?):
命令提示符
MicrosoftWindows6.2.9200]
<c>2012MicrosoftCorporation<?保留所有權(quán)利。
C:\Users\wshss>e:
E:\>cdE:\ProgranFiles<x86>\MicrosoftUisualStudio\MyProjects\test01\Debug
E:\ProgramFiles<x86>\MicrosoftUisualStudio\MyProjects\test01\Debug>test01
Hello,Win32ConsolApplication
E:\Prograr?Files<x86>\MicrosoftUisualStudio\MyProjects\test01\Debug>
(2)計算進程在核心態(tài)運行和用戶態(tài)運行的時間
步驟1:按照(1)中的步驟創(chuàng)建一個新的“Win32Consol
Application”工程,然后將清單1-2中的程序拷貝過來,編
譯成可執(zhí)行文件。
步驟2:在創(chuàng)建一個新的“Win32ConsolApplication
工程,程序的參考程序如清單一3所示,編譯成可執(zhí)行文件
并執(zhí)行。
步驟3:在“命令提示符"窗口中運行步驟1中生成的
可執(zhí)行文件,測試步驟2中可執(zhí)行文件在核心態(tài)運行和用戶
態(tài)運行的時間。
E:\課程\os課\os實驗\程序\os12\debug>time
TEST.exe
步驟4:運行結(jié)果(如果運行不成功,則可能的原因是
什么?):
E3叩令拉不何
HicrosoftWindows6.2.9200]
<c>2012MicrosoftCorporation),保留所有權(quán)利。
C:\Users\wshss>e:
fe:\>cdProgramFiles<x86>\HicrosoftUisualStudio\MyProJects\test02\Debug
E:\ProgranFiles<x86>\MicrosoftUisualStudioXMyProjects\test02\Debug>test02te
st03.exe
processID:5100,EXEfile:test03.exe,zdinKernelnode:84
步驟5:分別屏蔽While循環(huán)中的兩個for循環(huán),或調(diào)整兩個
for循環(huán)的次數(shù),寫出運行結(jié)果。
屏蔽i循環(huán):
E:\ProgranFiles<x86>\MicrosoftUisualStudioXMyProjects\test02\Debug>test02te
pt03.exe
processID:7388,EXEfile:test03.exe,zdinKernelnode:72
屏蔽j循環(huán):
E:\ProgranFiles<x86>M1icrosoftUisualStudioXMyProjectsXtest02\Debug>test02te
st03.exe
processID:7088,EXE£ile:test03.exe,zdinKernelnode:62
調(diào)整循環(huán)變量i的循環(huán)次數(shù):
E:\ProgranFiles<x86>vi1icrosoftUisualStudioXMyProjects\test02\Debug>test02te
st03.exe
processID:4224,EXEFile:test03.exe,zdinKernelnode:76
調(diào)整循環(huán)變量j的循環(huán)次數(shù):
E:\ProgranFiles<x86>\MicrosoftUisualStudioXMyProjects\test02\Debug>test02te
st03.exe
processID:3024,EXEfile:test03.exe,zdinKernelmode:76
4、實驗結(jié)論
對Win32ConsolApplication有進一步的認識,WIN32API也就是
Windows32平臺的應(yīng)用程序編程接口。用戶態(tài)運行和核心態(tài)運行,核
心態(tài)就是一個是直接的代碼運行,即*ir)32consolApplication卜代
碼運行;而用戶態(tài)是在DOS下運行的,對編譯好的程序進行的運行,
核心態(tài)速度較快,沒有太多的約束,而用戶態(tài)的運行需要時間較長,
由于有相應(yīng)的約束。
實驗二進程管理
背景知識
Windows所創(chuàng)建的每個進程都從調(diào)用CreateProcess()API
函數(shù)開始,該函數(shù)的任務(wù)是在對象管理器子系統(tǒng)內(nèi)初始化
進程對象。每一進程都以調(diào)用ExitProcess()或
TerminateProcess()API函數(shù)終止。通常應(yīng)用程序的框架負
責(zé)調(diào)用ExitProcess()函數(shù)。對于C++運行庫來說,這一
調(diào)用發(fā)生在應(yīng)用程序的main。函數(shù)返回之后。
」.創(chuàng)建進程
CreateProcessO調(diào)用的核心參數(shù)是可執(zhí)行文件運行時的
文件名及其命令行。表3-4詳細地列出了每個參數(shù)的類型和
名稱。
表3-4CreateProcess0函數(shù)的參數(shù)
參數(shù)名稱""使用目的
LPCTSTR
全部或部分地指明包括可執(zhí)行代碼
IpApplivationNa
的EXE文件的文件名
me
LPCTSTR
向可執(zhí)行文件發(fā)送的參數(shù)
IpCommandLine
LPSECURIITY.
返回進程句柄的安全屬性。主要指
ATTRIBUTES
明這一句柄是否應(yīng)該由其他子進程
IpProcessAttribut
所繼承
es
LPSECURIITY_
ATTRIBUTES返回進程的主線程的句柄的安全屬
IpThreadAttribute性
s
一種標志,告訴系統(tǒng)允許新進程繼
BOOL
承創(chuàng)建者進程的句柄
blnheritHandle
DWORD特殊的創(chuàng)建標志(如
dwCreationFlageCREATE_SUSPENDED)的位標1己
LPVOID向新進程發(fā)送的一套環(huán)境變量;如
IpEnvironment為null值則發(fā)送調(diào)用者環(huán)境
LPCTSTR
新進程的啟動目錄
IpCurrentDirector
y
STARTUPINFO結(jié)構(gòu),包括新進程
STARTUPINFO
的輸入和輸出配置的詳情
IpStartuplnfo
LPPROCESSJN
FORMATION調(diào)用的結(jié)果塊;發(fā)送新應(yīng)用程序的
IpProcessInformat進程和主線程的句柄和ID
ion
可以指定第一個參數(shù),即應(yīng)用程序的名稱,其中包括相
對于當(dāng)前進程的當(dāng)前目錄的全路徑或者利用搜索方法找到
的路徑;IpCommandLine參數(shù)允許調(diào)用者向新應(yīng)用程序發(fā)送
數(shù)據(jù);接下來的三個參數(shù)與進程和它的主線程以及返回的指
向該對象的句柄的安全性有關(guān)。
然后是標志參數(shù),用以在dwCreationFlags參數(shù)中指明系
統(tǒng)應(yīng)該給予新進程什么行為g經(jīng)常使用的標志是
CREATE_SUSPNDED,告訴主線程立刻暫停。當(dāng)準備好時,
應(yīng)該使用ResumeThread()API來啟動進程。另一個常用的標
志是CREATE_NEW_CONSOLE,告訴新進程啟動自己的控
制臺窗口,而木是利南父窗口。這一參數(shù)還允許設(shè)置進程的
優(yōu)先級,用以向系統(tǒng)指明,相對于系統(tǒng)中所有其他的活動進
程來說,給此進程多少CPU時間。
接著是CreateProcessO函數(shù)調(diào)用所需要的三個通常使用
缺省值的參數(shù)。第一個參數(shù)是IpEnvironment參數(shù),指明為
新進程提供的環(huán)境;第二個參數(shù)是IpCurrentDirectory,可
用于向主創(chuàng)進程發(fā)送與缺省目錄不同的新進程使用的特殊
的當(dāng)前目錄;第三個參數(shù)是STARTUPINFO數(shù)據(jù)結(jié)構(gòu)所必需的,
用于在必要時指明新應(yīng)用程序的主窗口的外觀。
CreateProcess0的最后一個參數(shù)是用于新進程對象及其
主線程的句柄和ID的返回值緩沖區(qū)。以
PROCESS_INFORMATION結(jié)構(gòu)中返回的句柄調(diào)用CloseHandle()
API函數(shù)是重要的,因為如果不將這些句柄關(guān)閉的話,有可
能危及主創(chuàng)進程終止之前的任何未釋放的資源。
.2正在運行的進程
如果一個進程擁有至少一個執(zhí)行線程,則為正在系統(tǒng)中
運行的進程。通常,這種進程使用主線程來指示它的存在。
當(dāng)主線程結(jié)束時,調(diào)用ExitProcess()API函數(shù),通知系統(tǒng)終止
它所擁有的所有正在運行、準備運行或正在掛起的其他線
程。當(dāng)進程正在運行時,可以查看它的許多特性,其中少數(shù)
特性也允許加以修改。
首先可查看的進程特性是系統(tǒng)進程標識符(PID),可利
用GetCurrentProcessId()API函數(shù)來查看,與
GetCuiTentProcess()相似,對該函數(shù)的調(diào)用不能失敗,但返
回的PID在整個系統(tǒng)中都可使用。其他的可顯示當(dāng)前進程信
息的API函數(shù)還有GetStailupInfo()和
GetProcessShutdownParameters(),可給出進程存活期內(nèi)的配
置詳情。
通常,一個進程需要它的運行期環(huán)境的信息。例如API
函數(shù)GetModuleFileName()和GetCommandLine(),可以給
出用在CreateProcess。中的參數(shù)以啟動應(yīng)用程序。在創(chuàng)建應(yīng)
用程序時可使用的另一個API函數(shù)是IsDebuggerPresent()。
可利用API函數(shù)GetGuiResources0來查看進程的GUI資
源。此函數(shù)既可返回指定進程中的打開的GUI對象的數(shù)目,
也可返回指定進程中打開的USER對象的數(shù)目。進程的其他
性能信息可通過GetProcessIoCounters()、
GetProcessPriorityBoost()、GetProcessTimes()和
GetProcessWorkingSetSize()API得到。以上這幾個API
函數(shù)都只需要具有PROCESS_QUERY_INFORMATION訪問權(quán)限的
指向所感興趣進程的句柄。
另一個可用于進程信息查詢的API函數(shù)是
GetProcessVersion()。此函數(shù)只需感興趣進程的PID(進
程標識號)。本實驗程序清單3-6中列出了這一API函數(shù)與
GetVersionExO的共同作用,可確定運行進程的系統(tǒng)的版
本號。.
..3.終止進程
所有進程都是以調(diào)用ExitProcessO或者
TerminateProcess()函數(shù)結(jié)束的。但最好使用前者而不要使用
后者,因為進程是在完成了它的所有的關(guān)閉“職責(zé)”之后以
正常的終止方式來調(diào)用前者的。而外部進程通常調(diào)用后者即
突然終止進程的進行,由于關(guān)閉時的途徑不太正?!?,有可能
引起錯誤的行為°
TerminateProcess()API函數(shù)只要打開帶有
PROCESS.TERMINATE訪問權(quán)的進程對象,就可以終止進程,
并向系統(tǒng)返回指定的代碼。這是一種“野蠻”的終止進程的
方式,但是有時卻是需要的。
如果開發(fā)人員確實有機會來設(shè)計“謀殺”(終止別的進程的
進程)和“受害”進程(被終止的進程)時,應(yīng)該創(chuàng)建一個
進程間通訊的內(nèi)核對象一一如一個互斥程序一一這樣一來,
“受害”進程只在等待或周期性地測試它是否應(yīng)該終止。
4.進程同步
Windows2000/XP提供的常用對象可分成三類:核心應(yīng)
用服務(wù)、線程同步和線程間通訊。其中,開發(fā)人員可以使用
線程同步對象來協(xié)調(diào)線程和進程的工作,以使其共享信息并
執(zhí)行任務(wù)C此類對象包括互鎖數(shù)據(jù)、臨界段、事件、互斥體
和信號等。
多線程編程中關(guān)鍵的一步是保護所有的共享資源,工具
主要有互鎖函數(shù)、臨界段和互斥體等;另一個實質(zhì)性部分是
協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),為此,可利用內(nèi)核中的
事件對象和信號。
在進程內(nèi)或進程間實現(xiàn)線程同步的最方便的方法是使
用事件對象,這一組內(nèi)核對象允許一個線程對其受信狀態(tài)進
行直接控制(見表2-1)o
而互斥體則是另一個可命名且安全的內(nèi)核對象,其主要目的
是引導(dǎo)對共享資源的訪問。擁有單一訪問資源的線程創(chuàng)建互
斥體,所有想要訪問該資源的線程應(yīng)該在實際執(zhí)行操作之前
獲得互斥體,而在訪問結(jié)束時立即釋放互斥體,以允許下一
個等待線程獲得互斥體,然后接著進行下去。
與事件對象類似,互斥體容易創(chuàng)建、打開、使用并清除。利
用CreateMutex。API可創(chuàng)建互斥體,創(chuàng)建時還可以指定一個
初始的擁有權(quán)標志,通過使用這個標志,只有當(dāng)線程完成了
資源的所有的初始化工作時,才允許創(chuàng)建線程釋放互斥體。
表27用于管理事件對象的API
API名稱描述
在內(nèi)核中創(chuàng)建一個新的事件對象。此函
CreateEven數(shù)允許有安全性設(shè)置、手工還是自動重
t()置的標志以及初始時已接受還是未接受
信號狀態(tài)的標志
創(chuàng)建對已經(jīng)存在的事件對象的引用。此
OpenEvent
API函數(shù)需要名稱、繼承標志和所需的訪
0
問級別
SetEvent()將手工重置事件轉(zhuǎn)化為己接受信號狀態(tài)
ResetEvent
將手工重置事件轉(zhuǎn)化為非接受信號狀態(tài)
0
將自動重置事件對象轉(zhuǎn)化為已接受信號
PulseEvent
狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程
0
時此種轉(zhuǎn)化立即發(fā)生
為了獲得互斥體,首先,想要訪問調(diào)用的線程可使用
OpenMutex()API來獲得指向?qū)ο蟮木浔?;然后,線程將這個
句柄提供給一個等待函數(shù)。當(dāng)內(nèi)核將互斥體對象發(fā)送給等待
線程時,就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得
擁有權(quán)時,線程控制了對共享資源的訪問一一必須設(shè)法盡快
地放棄互斥體。放棄共享資源時需要在該對象上調(diào)用
ReleaseMuteOAPL然后系統(tǒng)負責(zé)將互斥體擁有權(quán)傳遞給下
一個等待著的線程(由到達時間決定順序)。
1.實驗?zāi)康?/p>
1)通過創(chuàng)建進程、觀察正在運行的進程和終止進程的程序設(shè)
計和調(diào)試操作,進一步熟悉操作系統(tǒng)的進程概念,理解
Windows進程的“一生”。
2)通過閱讀和分析實驗程序,學(xué)習(xí)創(chuàng)建進程、觀察進程、終
止進程以及父子進程同步的基本程序設(shè)計方法。
2.實驗內(nèi)容和步驟
..(1).創(chuàng)建進程
本實驗顯示了創(chuàng)建子進程的基本框架。該程序只是再一
次地啟動自身,顯示它的系統(tǒng)進程ID和它在進程列表中的
位置。
步驟1:創(chuàng)建一個“Win32ConsolApplication^工程,
然后拷貝清單2-1中的程序,編譯成可執(zhí)行文件。
步驟2:在“命令提示符"窗口運行步驟1中生成的可執(zhí)行
文件。運行結(jié)果:
范例:E:\課程\os課\os實驗、程序\osll\debug>os21
(假設(shè)編譯生成的可執(zhí)行文件是os2Lexe)
ProcessID:5368,CloneID:0
ProcessID:6664,CloneID:1
ProcessID:756,CloneID:2
ProcessID:8056,CloneID:3
ProcessID:2856,CloneID:4
ProcessID:1116,CloneID:5
按下ctrl+alt+del,調(diào)用windows的任務(wù)管理器,記錄進程
相關(guān)的行為屬性:
叵Xest2.exe5368正在運行wshss00336Ktest2.exe
[Ltest2.exe6664正在運行wshss00336Ktest2.exe
Htest2.exe756正在運行wshss00332Ktest2.exe
[■Jtest2.exe8056正在運行wshss00332Ktest2.exe
叵test2.exe2856正在運行wshss00332Ktest2.exe
11^test2.exe1116正在運行wshss00340Ktest2.exe
步驟3:在“命令提示符"窗口加入?yún)?shù)重新運行生成的可
執(zhí)行文件。運行結(jié)果:
范例:E:\課程\os課\os實驗\程序\osll\debug>os213
(假設(shè)編譯生成的可執(zhí)行文件是os2Lexe)
Process11):8896,CloneID:3
ProcessID:8572,CloneID:4
ProcessID:9076,CloneID:5
按下ctrl+alt+del,調(diào)用windows的任務(wù)管理器,記錄進程
相關(guān)的行為屬性:
[Eltest2.exe8896正在運行wshss00336Ktest2.exe
!■'test2.exe8572正在運行wshss00340Ktest2.exe
EZtest2.exe9076正在運行wshss00336Ktest2.exe
I-?r.—A——1-A.A—?“
步驟4:修改清單2-1中的程序,將nClone的定義和初
始化方法按程序注釋中的修改方法進行修改,編譯成可執(zhí)
行文件(執(zhí)行前請先保存已經(jīng)完成的工作)。再按步驟2中
的方式運行,看看結(jié)果會有什么不一樣。運行結(jié)果:
第一次修改:
ProcessID:1840,CloneID:3
ProcessID:3376,CloneID:4
ProcessID:4024,CloneID:5
[■3test2.exe1840正在運行wshss00336Ktest2.exe
!Ltest2.exe3376正在運行wshss00332Ktest2.exe
[■3test2,exe4024正在運行wshss00336Ktest2.exe
第二次修改:
——直循環(huán),不斷彈出新的DOS,ProcessID:2376,CloneID:0
知道內(nèi)存耗盡
從中你可以得出什么結(jié)論:
賦值語句不同會影響到結(jié)果
作用:控制TD的起始值,并控制其輸出窗口的數(shù)量。
變量的定義和初始化方法(位置)對程序的執(zhí)行結(jié)果有影響
嗎?為什么?
有影響,變量的定義影響了程序的結(jié)果數(shù)亂還影響了ID的其實位
置,由于變量的初始化使程序的循環(huán)次數(shù)發(fā)生改變,直接改變了結(jié)
果,所以結(jié)果由變量的不同而不同。
(2).父子進程的簡單通信及終止進程
步驟1:創(chuàng)建一^個“Win32ConsolApplicationw工程,然后
拷貝清單2?2中的程序,編譯成可執(zhí)行文件。
步驟2:在VC的工具欄單擊“ExecuteProgram”(執(zhí)行程序)
按鈕,或者按Ctrl+F5鍵,或者在“命令提示符"窗口運行
步驟1中生成的可執(zhí)行文件。運行結(jié)果:
范例:E:\課程\os課\os實驗、程序\osn\debug>os22
(假設(shè)編譯生成的可執(zhí)行文件是os22.exe)
Childwaitingforsuicideinstructions.
Creatingthechildprocess.
Tellingthechildprocesstoquit.
步驟3:按源程序中注釋中的提示,修改源程序2-2,編譯執(zhí)
行(執(zhí)行前請先保存已經(jīng)完成的工作)。運行結(jié)果:
死循環(huán)
在程序中加入跟蹤語句,或調(diào)試運行程序,同時參考
MSDN中的幫助文件CreateProcess。的使用方法,理解父子
進程如何傳遞參數(shù)。給出程序執(zhí)行過程的大概描述:
產(chǎn)生的應(yīng)用程序的名稱(本EXE文件),告訴其行為像一個子進程
的標志,不繼承句柄,使用新的控制臺,新的環(huán)境,啟動信息,返回
的進程信息。
步驟4:填空
CreateProcess()函數(shù)有8個核心參數(shù)?本實驗程序
中設(shè)置的各個參數(shù)的值是:
a.szFilename;
b.szCmdLine,;
c.NULL;
d.NULL;
e.FALSE;
f.CREATE_NEW_CONSOLE;
g.NULL;
h.NULLo
步驟5:按源程序中注釋中的提示,修改源程序2?2,編譯
執(zhí)行。運行結(jié)果:
Creatingthechildprocess.
Tellingthechildprocesstoquit.
3、步驟6:參考MSDN中的幫助文件CreateMutex()^
OpenMutex()>ReleaseMutex。和WaitForSingleObjectQ
的使用方法,理解父子進程如何利用互斥體進行同步
的。給出父子進程同步過程的一個大概描述:
4、首先,進程創(chuàng)建一個互斥體,打開互斥體,如遇到互斥,則進
行處理,處理完后,釋放互斥體,下面便是進程等待下一個要
處理的項目。
5、實驗結(jié)論
每個進程都從調(diào)用CreateProcessQAPI函數(shù)開始,該函數(shù)的任務(wù)是在
對象管理器子系統(tǒng)內(nèi)初始化進程對象。每一進程都以調(diào)用
ExitProcess?;騎crminateProcessOAPI函數(shù)終止。通常應(yīng)用程序的框
架負責(zé)調(diào)用ExitProcessQ函數(shù)。進程都是有始有終,其中有中斷.還
有處理進程間互斥的函數(shù),已達到進程的完成后自然終止。
實驗三進程同步的經(jīng)典算法
背景知識
Windows2000提供的常用對象可分成三類:核心應(yīng)用服
務(wù)、線程同步和線程間通訊。其中,開發(fā)人員可以使用線程
同步對象來協(xié)調(diào)線程和進程的工作,以使其共享信息并執(zhí)行
任務(wù)。此類對象包括互鎖數(shù)據(jù)、臨界段、事件、互斥體和信
號等。
多線程編程中關(guān)鍵的一步是保護所有的共享資源,工具
主要有互鎖函數(shù)、臨界段和互斥體等;另一個實質(zhì)性部分是
協(xié)調(diào)線程使其完成應(yīng)用程序的任務(wù),為此,可利用內(nèi)核中的
事件對象和信號C
在進程內(nèi)或進程間實現(xiàn)線程同步的最方便的方法是使
用事件對象,這一組內(nèi)核對象允許一個線程對其受信狀態(tài)進
行直接控制(見表3-1)o
而互斥體則是另一個可命名且安全的內(nèi)核對象,其主要目的
是引導(dǎo)對共享資源的訪問。擁有單一訪問資源的線程創(chuàng)建互
斥體,所有想要訪問該資源的線程應(yīng)該在實際執(zhí)行操作之前
獲得互斥體,而在訪問結(jié)束時立即釋放互斥體,以允許下一
個等待線程獲得互斥體,然后接著進行下去。
與事件對象類似,互斥體容易創(chuàng)建、打開、使用并清除。利
用CreateMutex()API可創(chuàng)建互斥體,創(chuàng)建時還可以指定一個
初始的擁有權(quán)標志,通過使用這個標志,只有當(dāng)線程完成了
資源的所有的初始化工作時,才允許創(chuàng)建線程釋放互斥體。
表37用于管理事件對象的API
API名稱描述
在內(nèi)核中創(chuàng)建一個新的事件對象。此函
CreateEven數(shù)允許有安全性設(shè)置、手工還是自動重
t()置的標志以及初始時已接受還是未接受
信號狀態(tài)的標志
創(chuàng)建對已經(jīng)存在的事件對象的引用。此
OpenEvent
API函數(shù)需要名稱、繼承標志和所需的訪
0
問級別
SetEvent()將手工重置事件轉(zhuǎn)化為已接受信號狀態(tài)
ResetEvent
將手工重置事件轉(zhuǎn)化為非接受信號狀態(tài)
0
將自動重置事件對象轉(zhuǎn)化為已接受信號
PulseEvent
狀態(tài)。當(dāng)系統(tǒng)釋放所有的等待它的線程
0
時此種轉(zhuǎn)化立即發(fā)生
為了獲得互斥體,首先,想要訪問調(diào)用的線程可使用
OpenMutex()API來獲得指向?qū)ο蟮木浔蝗缓?,線程將這個
句柄提供給一個等待函數(shù)。當(dāng)內(nèi)核將互斥體對象發(fā)送給等待
線程時,就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得
擁有權(quán)時,線程控制了對共享資源的訪問一一必須設(shè)法盡快
地放棄互斥體。放棄共享資源時需要在該對象上調(diào)用
ReleaseMute()API。然后系統(tǒng)負責(zé)將互斥體擁有權(quán)傳遞給下
一個等待著的線程(由到達時間決定順序)。
1.實驗?zāi)康?/p>
1)回顧系統(tǒng)進程、線程的有關(guān)概念,加深對Windows2000
線程的理解。
2)了解互斥體對象,通過對生產(chǎn)者消費者等進程間同步與
互斥經(jīng)典算法的實現(xiàn),加深對P、V原語以及利用P、V原語
進行進程間同步與互斥操作的理解。
2.實驗內(nèi)容和步驟
..(1).生產(chǎn)者消費者問題
步驟1:創(chuàng)建一個“Win32ConsolApplication”工程,
然后拷貝清單3-1中的程序,編譯成可執(zhí)行文件。
步驟2:在“命令提示符"窗口運行步驟1中生成的可執(zhí)行
文件。運行結(jié)果:
范例:E:\課程\os課\os實驗、程序\osll\debug>os31
(假設(shè)編譯生成的可執(zhí)行文件是os3Lexe)
■"E:\ProgramFiles(x86)\MicrosoftVisualStudio\MyProjects\test03\Debug...
Producing1...Succeed
Appendingaproduct...Succeed
0=1<—道整
1:0<—生產(chǎn)
Produeing2...Succeed
Appendingaproduct...Succeed
0=1<—生產(chǎn)<—消費
1:2
Takingaproduct__Succeed
B:0<—生產(chǎn)
1=2<y消費
Consuming1...Succeed
步驟3:仔細閱讀源程序,找出創(chuàng)建線程的WINDOWSAPI函
數(shù),回答下列問題:線程的第一個執(zhí)行函數(shù)是什么(從哪里
開始執(zhí)行)?它位于創(chuàng)建線程的API函數(shù)的第幾個參數(shù)
中?
第一個執(zhí)行函數(shù)是:DWORDWINAPIProducer(LPVOTDIpPara)
Produce();
它位十創(chuàng)建線程的API函數(shù)的第3個參數(shù)中。
步驟4:修改清單3-1中的程序,調(diào)整生產(chǎn)者線程和消費者
線程的個數(shù),使得消費者數(shù)目大與生產(chǎn)者,看看結(jié)果有何
不同。運行結(jié)果:
,"E:\ProgramFiles(x86)\MicrosoftVisualStudio\MyProjects\test03\Debug...
Producing1...Succeed
Appendingaproduct...Succeed
0=1<—道費
t:0<—生產(chǎn)
Takingaproduct...Succeed
0:0
1:0<—生產(chǎn)《一消費
Consuming1...Succeed
Produeing2...Succeed
Appendingaproduct...Succeed
0:0<—生產(chǎn)
1:2<—消費
Produeing3...Succeed
Appendingaproduct...Succeed
0:3
1:2<—生產(chǎn)〈一消費
從中你可以得出什么結(jié)論:
進程執(zhí)行中,有一定的次序,如程序運行結(jié)果是:首先是consuming,
然后producing,其次是appending,最后是takingaproduct,
步驟5:修改清單3-1中的程序,按程序注釋中的說明修改信
號量EmptySemaphore的初始化方法,看看結(jié)果有何不同。
運行結(jié)果:
?"E:\ProgramFiles(x86)\MicrosoftVisualStudio\MyProjects\test03\Debug...一
步驟6:根據(jù)步驟4的結(jié)果,并查看MSDN,回答下列問題
1)CreateMutex中有幾個參數(shù),各代表什么含義。
三個:lpMutexAttributesSECURITYATTRIBUTES,指定一個SECIRIT
YATTRIBUTES結(jié)構(gòu),或傳遞零值,表示使用不允許繼承的默認描述
符;bInitialOwnerLong,如創(chuàng)建進程希望立即擁有互斥體,則設(shè)
為TRUE。一個互斥體同時只能由?個線程擁有;lpNameString,指
定互斥體對象的名字。
2)CreateSemaphore中有幾個參數(shù),各代表什么含義,信
號量的初值在第幾個參數(shù)中。
四個:IpSemaphoreAttributesSECURITYATTRIBUTES,指定一個
SECURITYATTRIBUTES結(jié)構(gòu),或傳遞零值—表示采用不允許繼承的
默認描述符。該參數(shù)定義了信號機的安全特性;UnitialCountLong,
設(shè)置信號機的初始計數(shù)??稍O(shè)置零到IMaximumCount之間的一個
值;IMaximumCounlLong,設(shè)置信號機的最大計數(shù);IpNameString,
指定信號機對象的名稱。
3)程序中P、V原語所對應(yīng)的實際WindowsAPI函數(shù)是什么,
寫出這幾條語句。
HANDLEMutex;
HANDLEFullSonaphore;
HANDLEEmptySemaphore;
DWORDWINAPIProducer(LPVOID);
DWORDWINAPIConsumer(LPVOID);
1、4)CreateMutex能用CreateSemaphore替代嗎?嘗試修改程序
3-1,將信號量Mutex完全用CreateSemaphore及相關(guān)函數(shù)實現(xiàn)。寫
出要修改的語句:
2>可以。
修改的語句為:Mutex=CreateSemaphore(NULL,0,0,NULL);
3、(2).讀者寫者問題
4、根據(jù)實驗(1)中所熟悉的P、V原語對應(yīng)的實際Windows
API函數(shù),并參考教材中讀者、寫者問題的算法原理,
嘗試利用WindowsAPI函數(shù)實現(xiàn)第一類讀者寫者問題
(讀者優(yōu)先)。
5、實驗結(jié)論
通過對生產(chǎn)者、消費者問題的處理,加深理解了進程是可并發(fā)執(zhí)行的
程序在某個數(shù)據(jù)集合上的一次計算活動,也是操作系統(tǒng)進行資源分
配和保護的基本單位。線程是繼進程之后引進的,為了減少程序并發(fā)
執(zhí)行的時空開銷,使得并發(fā)粒度更細,并發(fā)性更好。生產(chǎn)者、消費者
不但解決進程間同步,還解決了進程的互斥,其算法思想很經(jīng)典,對
P,V原語的理解有很大的幫助。
實驗四存儲管理
背景知識
耗盡內(nèi)存是Windows2000/XP系統(tǒng)中最常見的問題之一。當(dāng)
系統(tǒng)耗盡內(nèi)存時,所有進程對內(nèi)存的總需求超出了系統(tǒng)的
物理內(nèi)存總量。隨后,Windows2000/XP必須借助它的虛擬
內(nèi)存來維持系統(tǒng)和進程的運行。虛擬內(nèi)存機制是Windows
2000/XP操作系統(tǒng)的重要組成部分,但它的速度比物理內(nèi)存
慢得多,因此,應(yīng)該盡量避免耗盡物理內(nèi)存資源,以免導(dǎo)
致性能下降。
解決內(nèi)存不足問題的一個有效的方法就是添加更多的內(nèi)存。
但是,一旦提供了更多的內(nèi)存,Windows2000/XP很可以會
立即“吞食”。而事實上,添加更多的內(nèi)存并非總是可行的,
也可能只是推遲了實際問題的發(fā)生。因此,應(yīng)該相信,優(yōu)化
所擁有的內(nèi)存是非常關(guān)鍵的。
L分頁過程
當(dāng)Windows2000/XP求助于硬盤以獲得虛擬內(nèi)存時,這個過
程被稱為分頁(paging)o分頁就是將信息從主內(nèi)存移動到
磁盤進行臨時存儲的過程。應(yīng)用程序?qū)⑽锢韮?nèi)存和虛擬內(nèi)存
視為一個獨立的實體,甚至不知道Windows2000/XP使用了
兩種內(nèi)存方案,而認為系統(tǒng)擁有比實際內(nèi)存更多的內(nèi)存。例
如,系統(tǒng)的內(nèi)存數(shù)量可能只有16MB,但每一個應(yīng)用程序仍
然認為有4GB內(nèi)存可供使用。
使用分頁方案帶來了很多好處,不過這是有代價的。當(dāng)進程
需要已經(jīng)交換到硬盤上的代碼或數(shù)據(jù)時,系統(tǒng)要將數(shù)據(jù)送
回物理內(nèi)存,并在必要時將其他信息傳輸?shù)接脖P上,而硬
盤與物理內(nèi)存在性能上的差異極大。例如,硬盤的訪問時間
通常大約為4-10毫秒,而物理內(nèi)存的訪問時間為60us,甚
至更快。
2.內(nèi)存共享
應(yīng)用程序經(jīng)常需要彼此通信和共享信息。為了提供這種能力,
Windows2000/XP必須允許訪問某些內(nèi)存空間而不危及它和
其他應(yīng)用程序的安全性和完整性。從性能的角度來看,共享
內(nèi)存的能力大大減少了應(yīng)用程序使用的內(nèi)存數(shù)量。運行一個
應(yīng)用程序的多個副本時,每一個實例都可以使用相同的代
碼和數(shù)據(jù),這意味著不必維護所加載應(yīng)用程序代碼的單獨
副本并使用相同的內(nèi)存資源。無論正在運行多少個應(yīng)用程序
實例,充分支持應(yīng)用程序代碼所需求的內(nèi)存數(shù)量都相對保
持不變c
3.未分頁合并內(nèi)存與分頁合并內(nèi)存
Windows2000/XP決定了系統(tǒng)內(nèi)存組件哪些可以以及哪
些不可以交換到磁盤上。顯然,不應(yīng)該將某些代碼(例如內(nèi)
核)交換出主內(nèi)存。因此,Windows2000/XP將系統(tǒng)使用的內(nèi)
存進一步劃分為未分頁合并內(nèi)存和分頁合并內(nèi)存。
分頁合并內(nèi)存是存儲遲早需要的可分頁代碼或數(shù)據(jù)的內(nèi)
存部分。雖然可以將分頁合并內(nèi)存中的任何系統(tǒng)進程交換到
磁盤上,但是它臨時存儲在主內(nèi)存的這一部分,以防系統(tǒng)立
刻需要它。在將系統(tǒng)進程交換到磁盤上之前,Windows
2000/XP會交換其他進程。
未分頁合并內(nèi)存包含必須駐留在內(nèi)存中的占用代碼或數(shù)
據(jù)。這種結(jié)構(gòu)類似于早期的MS-DOS程序使用的結(jié)構(gòu),在
MS-DOS中,相對較小的終止并駐留程序(Terminateand
StayResident,TSR)在啟動時加載到內(nèi)存中。這些程序在系
統(tǒng)重新啟動或關(guān)閉之前一直駐留在內(nèi)存的特定部分中。例如,
防病毒程序?qū)⒓虞d為TSR程序,以預(yù)防可能的病毒襲擊。
未分頁合并內(nèi)存中包含的進程保留在主內(nèi)存中,并且不能
交換到磁盤上。物理內(nèi)存的這個部分用于內(nèi)核模式操作(例
如,驅(qū)動程序)和必須保留在主內(nèi)存中才能有效工作的其他
進程。沒有主內(nèi)存的這個部分,內(nèi)核組件就將是可分頁的,
系統(tǒng)本身就有變得不穩(wěn)定的危險。
分配到未分頁內(nèi)存池的主內(nèi)存數(shù)量取決于服務(wù)器擁有的物
理內(nèi)存數(shù)量以及進程對系統(tǒng)上的內(nèi)存地空間的需求。不過,
Windows2000/XP將未分頁合并內(nèi)存限制為256MB(在
WindowsNT4中的限制為128MB)。根據(jù)系統(tǒng)中的物理內(nèi)存
數(shù)量,復(fù)雜的算法在啟動時動態(tài)確定Windows2000/XP系統(tǒng)
上的未分頁合并內(nèi)存的最大數(shù)量。Windows2000/XP內(nèi)部的
這一自我調(diào)節(jié)機制可以根據(jù)當(dāng)前的內(nèi)存配置自動調(diào)整大小。
例如,如果增加或減少系統(tǒng)中的內(nèi)存數(shù)量,那么
Windows2000將自動調(diào)整未分頁合并內(nèi)存的大小,以反映這
一更改。
4.提高分頁性能
只有一個物理硬盤驅(qū)動器的系統(tǒng)限制了優(yōu)化分頁性能的
能力。驅(qū)動器必須處理系統(tǒng)和應(yīng)用程序的請求以及對分頁文
件的訪問。雖然物理驅(qū)動器可能有多個分區(qū),但是將分頁文
件分布到多個分區(qū)的分頁文件并不能提高硬盤驅(qū)動器的能
力。只有當(dāng)一個分區(qū)沒有足夠的空間來包含整個分頁文件時,
才將分頁文件放在同一個硬盤的多個分區(qū)上。
擁有多個物理驅(qū)動器的服務(wù)器可以使用多個分頁文件來
提高分頁性能。關(guān)鍵是將分頁請求的負載分布到多個物理硬
盤上。實際上,使用獨立物理驅(qū)動器上的分頁文件,系統(tǒng)可
以同時處理多個分頁請求。各個物理驅(qū)動器可以同時訪問它
自己的分頁文件并寫入信息,這將增加可以傳輸?shù)男畔⒘俊?/p>
多個分頁文件的最佳配置是將各個分頁文件放在擁有自己
的控制器的獨立驅(qū)動器上。不過,由于額外的費用并且系統(tǒng)
上的可用中斷很有限,因此對于大多數(shù)基于服務(wù)器的配置來
說,這可能是不切實際的解決方案。
分頁文件最重要的配置參數(shù)是大小。無論系統(tǒng)中有多少個
分頁文件,如果它們的大小不合適,那么系統(tǒng)就可能遇到性
能問題。
如果初始值太小,那么系統(tǒng)可能必須擴大分頁文件,以補
償額外的分頁活動。當(dāng)系統(tǒng)臨時增加分頁文件時,它必須在
處理分頁請求的同時創(chuàng)建新的空間。這時,系統(tǒng)將出現(xiàn)大量
的頁面錯誤,甚至可能出現(xiàn)系統(tǒng)失效。當(dāng)系統(tǒng)必須在進程的
工作區(qū)外部(在物理內(nèi)存或分頁文件中的其他位置)查找信
息時,就會出現(xiàn)頁面錯誤。當(dāng)系統(tǒng)缺乏存儲資源(物理內(nèi)存
及虛擬內(nèi)存)來滿足使用需求,從而遇到過多的分頁時,就
會出現(xiàn)系統(tǒng)失效。系統(tǒng)將花更多的時間來分頁而不是執(zhí)行應(yīng)
用程序。當(dāng)系統(tǒng)失效時,Memory:Pages/see計數(shù)器將持續(xù)高
于每秒100頁。系統(tǒng)失效嚴重降低了系統(tǒng)的性能。此外,動
態(tài)擴展分頁文件將導(dǎo)致碎片化。分頁文件將散布在整個磁盤
上而不是在啟動時的連續(xù)空間中創(chuàng)建,從而增加了系統(tǒng)的開
銷,并導(dǎo)致系統(tǒng)性能降低。因此,應(yīng)該盡量避免系統(tǒng)增加分
頁文件的大小。
提示:
1)WINDOWS中采用的虛擬存儲管理方案是請求
頁式存儲管理,分頁文件就是我們原理課中所說的交
換/對換文件,存放的內(nèi)容是暫時被交換到外存中的進
程頁面。UNIX使用的是交換分區(qū),WINDOWS使用的
是交換文件。
2)在NTFS驅(qū)動器上,總是至少保留25%的空閑
驅(qū)動器空間,以確??梢栽谶B續(xù)的空間中創(chuàng)建分頁文
件。
3)Windows2000使用內(nèi)存數(shù)量的1.5倍作為分頁
文件的最小容量,這個最小容量的兩倍作為最大容量。
它減少了系統(tǒng)因為錯誤配置的分頁文件而崩潰的可能
性。系統(tǒng)在崩潰之后能夠?qū)?nèi)存轉(zhuǎn)儲寫入磁盤,所以系
統(tǒng)分區(qū)必須有一個至少等于物理內(nèi)存數(shù)量加上1的分
頁文件。
3)Windows2000使用內(nèi)存數(shù)量的1.5倍作為分頁
文件的最小容量,這個最小容量的兩倍作為最大容量。
它減少了系統(tǒng)因為錯誤配置的分頁文件而崩潰的可能
性。系統(tǒng)在崩潰之后能夠?qū)?nèi)存轉(zhuǎn)儲寫入磁盤,所以
系統(tǒng)分區(qū)必須有一個至少等于物理內(nèi)存數(shù)量加上1的
分頁文件。
5.Windows虛擬內(nèi)存
Windows2000是32位的操作系統(tǒng),它使計算機CPU可
以用32位地址對32位內(nèi)存塊進行操作。內(nèi)存中的每一個字
節(jié)都可以用一個32位的指針來尋址。這樣,最大的存儲空間
就是232字節(jié)或4000兆字節(jié)(4GB)。這樣,在Windows下
運行的每一個應(yīng)用程序都認為能獨占可能的4GB大小的空
間。
而另一方面,實際上沒有幾臺機器的RAM能達到4GB,
更不必說讓每個進程都獨享4GB內(nèi)存了。Windows在幕后將
虛擬內(nèi)存(virtualmemory,VM)地址映射到了各進程的物理
內(nèi)存地址上。而所謂物理內(nèi)存是指計算機的RAM和由
Windows分配到用戶驅(qū)動器根目錄上的換頁文件。物理內(nèi)存
完全由系統(tǒng)管理。
在Windows2000環(huán)境下,4GB的虛擬地址空間被劃分成
兩個部分:低端2GB提供給進程使用,高端2GB提供給系統(tǒng)
使用。這意味著用戶的應(yīng)用程序代碼,包括DLL以及進程使
用的各種數(shù)據(jù)等,都裝在用戶進程地址空間內(nèi)(低端2GB)o
用戶進程的虛擬地址空間也被分成三部分:
1)虛擬內(nèi)存的已調(diào)配區(qū)(committed):具有備用的物理
內(nèi)存,根據(jù)該區(qū)域設(shè)定的訪問權(quán)限,用戶可以進行寫、讀或
在其中執(zhí)行程序等操作。
2)虛擬內(nèi)存的保留區(qū)(reserved):沒有備用的物理內(nèi)存,
但有一定的訪問權(quán)限。
3)虛擬內(nèi)存的自由區(qū)(free):不限定其用途,有相應(yīng)的
PAGE_NOACCESS權(quán)限。
與金擬內(nèi)存區(qū)相關(guān)的訪問權(quán)限告知系統(tǒng)進程可在內(nèi)存中
進行何種類型的操作。例如,用戶不能在只有
PAGE.READONLY權(quán)限的區(qū)域上進行寫操作或執(zhí)行程序;
也不能在只有PAGE_EXECUTE權(quán)限的區(qū)域里進行讀、寫操
作。而具有PAGE_NOACCESS權(quán)限的特殊區(qū)域,則意味著
不允許進程對其地址進行任何操作。
在進程裝入之前,整個虛擬內(nèi)存的地址空間都被設(shè)置為只有
PAGE.NOACCESS權(quán)限的自由區(qū)域。當(dāng)系統(tǒng)裝入進程代碼
和數(shù)據(jù)后,才將內(nèi)存地址的空間標記為已調(diào)配區(qū)或保留區(qū),
并將諸如EXECUTE>READWRITE和READONLY的權(quán)限
與這些區(qū)域相關(guān)聯(lián)。
程序清單4-1還顯示了如何理解VirtualQueryEX()API填充
的MEMORY_BASIC_INFORMATION結(jié)構(gòu),如表4-1所示。
此數(shù)據(jù)描述不進程虛擬內(nèi)存空間中一組虛擬內(nèi)存頁面的當(dāng)
前狀態(tài)。其中State項表明這些區(qū)域是否為自由區(qū)、已調(diào)配
區(qū)或保留區(qū);Protect項則包含了Windows系統(tǒng)為這些區(qū)域添
加了何種訪問保護;Type項則表明這些區(qū)域是可執(zhí)行圖像、
內(nèi)存映射文件還是簡單的私有內(nèi)存。VirtualQueryEX()API
能讓用戶在指定的進程中,對虛擬內(nèi)存地址的大小和屬性進
行檢測。
表4-1MEMORY_BASIC_INFORMATION結(jié)構(gòu)的成員
成員名稱目的
PVOID
虛擬內(nèi)存區(qū)域開始處的指針
BaseAddress
如果這個特定的區(qū)域為子分配區(qū)的
PVOID話,則為虛擬內(nèi)存外面區(qū)域的指針;
AllocationBase否則此值與BaseAddress相同
虛擬內(nèi)存最初分配區(qū)域的保護屬性。
其可能值包括:
PAGE_NOACCESS,
PAGE_READONLY,
DWORD
PAGE.READWRITE和PAGE
AllocationProtec
_EXECUTE_READ
t
PAGE_NOACCESS,
PAGE_READONLY,
PAGE_READWRITE和PAGE
_EXECUTE_READ
DWORD虛擬內(nèi)存區(qū)域的字節(jié)數(shù)
RegionSize
區(qū)域的當(dāng)前分配狀態(tài)。其可能值為
MEM_COMMIT,MEM_FREE和
DWORDState
MEM_RESERVE
虛擬內(nèi)存當(dāng)前區(qū)域的保護屬性??赡?/p>
DWORDProtect
值與AllocationProtect成員的相同
虛擬內(nèi)存區(qū)域中出現(xiàn)的頁面類型。可
能值為MEM」MAGE,
DWORDType
MEM_MAPPED和MEM_PRIVATE
Windows還提供了一整套能使用戶精確控制應(yīng)用程序的
虛擬地址空間的虛擬內(nèi)存APL一些用于虛擬內(nèi)存操作及檢
測的API見表4-2所不。
提供虛擬內(nèi)存分配功能的是VirtualAlloc()APL該API支
持用戶向系統(tǒng)要求新的虛擬內(nèi)存或改變已分配內(nèi)存的當(dāng)前
狀態(tài)。用戶若想通過VirtualAlloc。函數(shù)使用虛擬內(nèi)存,可以
采用兩種方式通知系統(tǒng):
1)簡單地將內(nèi)存內(nèi)容保存在地址空間內(nèi);
2)請求系統(tǒng)返回帶有物理存儲區(qū)(RAM的空間或換頁文
件)的部分地址空間。
用戶可以用^AllocationType參數(shù)(commit和reserve)來
定義這些方式,用戶可以通知Windows按只讀、讀寫、不可
讀寫、執(zhí)行或特殊方式來處理新的虛擬內(nèi)存。
與VirtualAlloc。函數(shù)對應(yīng)的是VirtualFree。函數(shù),其作用是
釋放虛擬內(nèi)存中的已調(diào)配頁或保留頁。用戶可利用dwFree
Type參數(shù)將已調(diào)配頁修改成保留頁屬性。
VirtualProtect()是VirtualAlloc。的一個輔助函數(shù),利用它可
以改變虛擬內(nèi)存區(qū)的保護規(guī)范。
表4-2虛擬內(nèi)存的API
API名稱描述
通過填充
VirtualQuery
MEMORY_BASICJNFORMATION結(jié)
Ex()
構(gòu)檢測進程內(nèi)虛擬內(nèi)存的區(qū)域
保留或調(diào)配進程的部分虛擬內(nèi)存,設(shè)置
VirtualAlloc
分配和保護標志
0
釋放或收回應(yīng)用程序使用的部分虛擬地
VirtualFree()
址
VirtualProte
改變虛擬內(nèi)存區(qū)域保護規(guī)范
ct()
VirtualLock(防止系統(tǒng)將虛擬內(nèi)存區(qū)域通過系統(tǒng)交換
)到頁面文件中
釋放虛擬內(nèi)存的鎖定區(qū)域,必要時,允
VirtualUnloc
許系統(tǒng)將其交換到頁面文件中
k()
1、實驗?zāi)康?/p>
2、通過對Windows2000“任務(wù)管理器”、“計算機管理”、
“我的電腦”屬性、“系統(tǒng)信息”、“系統(tǒng)監(jiān)視器”等程
序的應(yīng)用,學(xué)習(xí)如何察看和調(diào)整Windows的內(nèi)存性能,
加深對操作系統(tǒng)存儲管理、虛擬存儲管理等理論知識的
理解。
3、了解Windows2000的內(nèi)存結(jié)構(gòu)和虛擬內(nèi)存的管理,理
解進程的虛擬內(nèi)存空間和物理內(nèi)存的映射關(guān)系。
4、實驗內(nèi)容和步驟
(1)觀察和調(diào)整Windows2000/XP的內(nèi)存性能。
步驟1:閱讀“背景知識”,請回答:
1)什么是“分頁過程”?
當(dāng)Windows2000/XP求助于硬盤以獲得虛擬內(nèi)存時,這個過
程被稱為分頁(paging)。分頁就是將信息從主內(nèi)存移動到磁
盤進行臨時存儲的過程。
2)什么是“內(nèi)存共享”?
Windows2000/XP必須允許訪問某些內(nèi)存空間而不危及
它和其他應(yīng)用程序的安全性和完整性。
3)什么是“未分頁合并內(nèi)存”和“分頁合并內(nèi)存”?
未分頁合并內(nèi)存包含必須駐留在內(nèi)存中的占用代碼或數(shù)
分頁合并內(nèi)存是存儲遲早需要的可分頁代碼或數(shù)據(jù)的內(nèi)
存部分。雖然可以將分頁合并內(nèi)存中的任何系統(tǒng)進程交換到
磁盤上,但是它臨時存儲在主內(nèi)存的這一部分,以防系統(tǒng)立
刻需要它。在將系統(tǒng)進程交換到磁盤上之前,Windows
2000/XP會交換其他進程。
Windows2000中,未分頁合并內(nèi)存的最大限制是多少?
Windows2000/XP將未分頁合并內(nèi)存限制為256MB(在
WindowsNT4中的限制為128MB)。
4)Windows2000分頁文件默認設(shè)置的最小容量和最大容
量是多少?
Windows2000使用內(nèi)存數(shù)量的1.5倍作為分頁文件的最
小容量,這個最小容量的兩倍作為最大容量。
步驟2:登錄進入Windows2000Professional?
步驟3:查看包含多個實例的應(yīng)用程序的內(nèi)存需求。
1)啟動想要監(jiān)視的應(yīng)用程序,例如Word。
2)右鍵單擊任務(wù)欄以啟動“任務(wù)管理器”。
3)在“Windows任務(wù)管理器”對話框中選定“進程”選
項卡。
4)向下滾動在系統(tǒng)上運行的進程列表,查找想要監(jiān)視的
應(yīng)用程序。
請在表4-3中記錄:
表4-3實驗記錄
映像名稱PIDCPUCPU時間內(nèi)存使用
Winword.ex0:02:51
40360228448k
e
“內(nèi)存使用”列顯示了該應(yīng)用程序的一個實例正在使用的
內(nèi)存數(shù)量。
5)啟動應(yīng)用程序的另一個實例并觀察它的內(nèi)存需求。
請描述使用第二個實例占用的內(nèi)存與使用第一個實例時
的內(nèi)存對比情況:
沒什么太大的變化
步驟4:未分頁合并內(nèi)存。
估算未分頁合并內(nèi)存大小的最簡單方法是使用“任務(wù)管理
器”。未分頁合并內(nèi)存的估計值顯示在“任務(wù)管理器”的“性
能”選項卡的“核心內(nèi)存”部分。
總數(shù)(K):64736
分頁數(shù):48932
未分頁(K):15804
還可以使用“任務(wù)管理器”查看一個獨立進程正在使用的
未分頁合并內(nèi)存數(shù)量和分頁合并內(nèi)存數(shù)量。操作步驟如下:
1)單擊"Windows任務(wù)管理器”的“進程”選項卡,然后
從“查看”菜單中選擇“選擇列”命令,顯示“進程”選項
卡的可查看選項。
2)在“選擇列”對話框中,選定“頁面緩沖池”選項和“非
頁面緩沖池”選項旁邊的復(fù)選框,然后單擊“確定”按鈕。
返回Windows2000“任務(wù)管理器”的“進程”選項卡時,將
看到其中增加顯示了各個進程占用的分頁合并內(nèi)存數(shù)量和
未分頁合并內(nèi)存數(shù)量。
仍以剛才打開觀察的應(yīng)用程序(例如Word)為例,請在表
4-4中記錄:
表4-4實驗記錄
貝囿緩沖非負面緩
映像名稱PID內(nèi)存使用
池沖池
winword403637460k1188k20k
從性能的角度來看,未分頁合并內(nèi)存越多,可以加載到這
個空間的數(shù)據(jù)就越多。擁有的物理內(nèi)存
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025四川中共內(nèi)江市東興區(qū)委組織部社會工作部全區(qū)機關(guān)事業(yè)單位臨聘人員選聘社區(qū)專職33人備考題庫附答案
- 劍麻纖維生產(chǎn)工操作規(guī)程考核試卷含答案
- 微波鐵氧體器件調(diào)測工崗前生產(chǎn)安全技能考核試卷含答案
- 光伏晶硅組件制造工崗前改進考核試卷含答案
- 履帶吊司機崗前理論知識考核試卷含答案
- 2024年湄洲灣職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘考試真題匯編附答案
- 2024年石家莊鐵道大學(xué)四方學(xué)院輔導(dǎo)員考試筆試真題匯編附答案
- 2024年重慶醫(yī)科大學(xué)馬克思主義基本原理概論期末考試題附答案
- 2025年企業(yè)內(nèi)部產(chǎn)品研發(fā)手冊
- 2025山西陽泉市總工會招聘社會化工會工作者14人備考題庫附答案
- 越南與中國廣西邊境貿(mào)易研究
- 室內(nèi)消火栓的檢查內(nèi)容、標準及檢驗程序
- DB35T 2136-2023 茶樹病害測報與綠色防控技術(shù)規(guī)程
- 日文常用漢字表
- 舞臺機械的維護與保養(yǎng)
- 運輸工具服務(wù)企業(yè)備案表
- 醫(yī)院藥房醫(yī)療廢物處置方案
- 高血壓達標中心標準要點解讀及中心工作進展-課件
- 金屬眼鏡架拋光等工藝【省一等獎】
- 《藥品經(jīng)營質(zhì)量管理規(guī)范》的五個附錄
- 試論如何提高小學(xué)音樂課堂合唱教學(xué)的有效性(論文)
評論
0/150
提交評論