2021內(nèi)存管理實(shí)驗(yàn)報(bào)告_第1頁
2021內(nèi)存管理實(shí)驗(yàn)報(bào)告_第2頁
2021內(nèi)存管理實(shí)驗(yàn)報(bào)告_第3頁
2021內(nèi)存管理實(shí)驗(yàn)報(bào)告_第4頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)實(shí)驗(yàn)-內(nèi)存管理實(shí)驗(yàn)報(bào)告周俊霰20112113202011211307M實(shí)習(xí)2:內(nèi)存管理實(shí)驗(yàn)一?目的:在本次實(shí)驗(yàn)中,需要從不同的側(cè)面了解Windows2000/XP的虛擬內(nèi)存機(jī)制。在Windows2000/XP操作系統(tǒng)中,可以通過ー些API操縱虛擬內(nèi)存。主要需要了解以下幾方面:Windows2000/XP虛擬存儲(chǔ)系統(tǒng)的組織如何控制虛擬內(nèi)存空間"如何編寫內(nèi)存追蹤和顯示工具詳細(xì)了解與內(nèi)存相關(guān)的API函數(shù)的使用二、Windows2000/XP虛擬內(nèi)存機(jī)制簡介:內(nèi)存管理是Windows2000/XP執(zhí)行體的一部分,位于Ntoskrnl.exe文件中,是整個(gè)操作系統(tǒng)的重要組成部分。默認(rèn)情況下,32位Windows2000/XP上每個(gè)用戶進(jìn)程可以占有2GB的私有地址空間,操作系統(tǒng)占有剩下的2GB。Windows2000/XP在x86體系結(jié)構(gòu)上利用二級(jí)頁表結(jié)構(gòu)來實(shí)現(xiàn)虛擬地址向物理地址的變換。ー個(gè)32位虛擬地址被解釋為三個(gè)獨(dú)立的分量ーー頁目錄索引、頁表索引和字節(jié)索引ーー它們用于找出描述頁面映射結(jié)構(gòu)的索引。頁面大小及頁表項(xiàng)的寬度決定了頁目錄和頁表索引的寬度。比如,在x86系統(tǒng)中,因?yàn)椹`頁包含4096字節(jié),于是字節(jié)索引被確定為12位寬(212=4096)〇應(yīng)用程序有三種使用內(nèi)存方法:以頁為單位的虛擬內(nèi)存分配方法,適合于大型對(duì)象或結(jié)構(gòu)數(shù)組;內(nèi)存映射文件方法,適合于大型數(shù)據(jù)流文件以及多個(gè)進(jìn)程之間的數(shù)據(jù)共享;內(nèi)存堆方法,適合于大量的小型內(nèi)存申請(qǐng)。本次實(shí)驗(yàn)主要是針對(duì)第一種使用方式。應(yīng)用程序通過API函數(shù)VirtualAlloc和VirtualAllocEx等實(shí)現(xiàn)以頁為單位的虛擬內(nèi)存分配方法。首先保留地址空間,然后向此地址空間提交物理頁面,也可以同時(shí)實(shí)現(xiàn)保留和提交。保留地址空間是為線程將來使用保留一塊虛擬地址。在已保留的區(qū)域中,提交頁面必須指出將物理存儲(chǔ)器提交到何處以及提交多少。提交頁面在訪問時(shí)會(huì)轉(zhuǎn)變?yōu)槲锢韮?nèi)存中的有效頁面。三、相關(guān)的API函數(shù):可以通過GctSystemlnfo,GlobalMemoryStatus和VirtualQuery來查詢進(jìn)程虛空間的狀態(tài)。主要的信息來源如下:VOIDGetSystemlnfo(LPSYSTEM」NFOIpSystemlnfo);結(jié)構(gòu)SYSTEMINFO定義如下:typedefstruct_SYSTEM_INFO{DWORDdwOemld;DWORDdwPageSize;LPVOIDIpMinimumApplicationAddress;LPVOID1pMaximumApplicationAddress;DWORDdwActiveProcessorMask;DWORDdwNumberOfProcessors;DWORDdwProcessorType;DWORDdwAllocationGranularityJ〃分配粒度DWORDdwReserved;}SYSTEMJNFO,*LPSYSTEM_INFO;函數(shù)VOIDGlobalMemoryStatus(LPMEMORYSTATUSIpBuffer);數(shù)據(jù)結(jié)構(gòu)MEMORYSTATUS定義如下:typedefstruct_MEMORYSTATUS(DWORDdwLength;DWORDdwMemoryLoad;DWORDdwTotalPhys;DWORDdwAvailPhys;DWORDdwTotalPageFile;DWORDdwAvailPageFile;DWORDdwTotaiVirtual;DWORDdwAvailVirtual;}MEMORYSTATUS,*LPMEMORYSTATUS;函數(shù)DWORDVirtualQuery(LPCVOLDIpAddress,PMEMORY.BASICJNFORMATIONIpBuffer,DWORDdwLength);主要數(shù)據(jù)結(jié)構(gòu)MEMORY_BASIC」NFORMATION定義如下:typedefstruct_MEMORY_BASICJNFORMATION{PVOIDBaseAddress;PVOIDAllocationBase;DWORDAllocationProtect;DWORDRegionSize;DWORDState;DWORDProtect;DWORDType;}MEMORY_BASIC_INFORMATION;typedefMEMORY_BASICJNFORMATION*PMEMORY_BASICJNFORMATION;還有一些函數(shù),例如VirtualAlloc,VirtualAllocEx,VirtualFree和VirtualFreeEx等,用于虛擬內(nèi)存的管理,詳情請(qǐng)見Microsoft的Win32APIReferenceManual〇四、實(shí)驗(yàn)內(nèi)容:使用這些API函數(shù),編寫ー個(gè)包含兩個(gè)線程的進(jìn)程,ー個(gè)線程用于模擬內(nèi)存分配活動(dòng),ー個(gè)線程用于跟蹤第一個(gè)線程的內(nèi)存行為。模擬內(nèi)存活動(dòng)的線程可以從ー個(gè)文件中讀出要進(jìn)行的內(nèi)存操作,每個(gè)內(nèi)存操作包含如下內(nèi)容:時(shí)間:開始執(zhí)行的時(shí)間;塊數(shù):分配內(nèi)存的粒度;操作:包括保留一個(gè)區(qū)域、提交一個(gè)區(qū)域、釋放ー個(gè)區(qū)域、回收ー個(gè)區(qū)域以及鎖與解鎖ー個(gè)區(qū)域;可以將這些操作編號(hào),存放于文件中。,大小:指塊的大小;訪問權(quán)限:共五種:PAGE_READONLY、PAGE_READWRITE、PAGE_EXCUTE、PAGE_EXECUTE_READPAGE.EXECUTE_READWRITE〇可以將這些權(quán)限編號(hào),存放于文件中。跟蹤線程將頁面大小、已使用的地址范圍、物理內(nèi)存總量以及虛擬內(nèi)存總量等信息顯示出來。五、實(shí)驗(yàn)步驟:首先執(zhí)行makefle.exe,生成opfile文件,里面保存了模擬的內(nèi)存操作。然后執(zhí)行memory-op.exe,產(chǎn)生兩個(gè)線程,ー個(gè)從opfile文件里讀取內(nèi)存操作,模擬內(nèi)存活動(dòng),另ー個(gè)跟蹤第一個(gè)的內(nèi)存行為,將結(jié)果輸出,并保存在out.txt文件中。兩個(gè)線程通過信號(hào)量實(shí)現(xiàn)同步。六、實(shí)驗(yàn)結(jié)果分析:TOC\o"1-5"\h\z0dwActiveProcessorMask 15dwAllocationGranularity 65536dwNumberOfProcessors 4dwOemld0dwPageSize4096dwProcessorType586IpMaximumApplicationAddress0x7FFEFFFFIpMinimumApplicationAddress0x00010000wPr(x)essorArchitecture0wProcessorLevel6wProcessorRevision10759wReserved0************************食?**********************************************************237796556890039910421375344642377965568900399104213753446456416464896020823244802147352576&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x0001000040x0001000040x0001000065536Protect4RegionSizeState 4096IType 262144odwActiveProcessorMaskodwActiveProcessorMaskdwAllocationGranularitydwNumberOfProcessorsdwOemld015〃活動(dòng)處理器掩碼65536 〃分配粒度4 〃處理器號(hào)dwPageSize4096〃頁大小dwPageSize4096〃頁大小dwProcessorType586〃處理器類型〃最大分配地址IpMaximumApphcationAddress0x7FFEFFFFdwProcessorType586〃處理器類型〃最大分配地址IpMinimumApplicationAddress0x00010000 〃最小分配地址wProcessorArchitecture0wProcessorLevel6wProcessorRevision10759wReserved0〃處理器結(jié)構(gòu)處理器級(jí)別〃處理器結(jié)構(gòu)處理器級(jí)別〃處理器修訂號(hào)〃保留dwAvailPageFile2377965568 〃可用頁文件dwAvailPhys900399104 〃可用物理大小dwAvailVirtual2137534464 〃可用虛擬大小dwLength32 〃長度dwMemoryLoad56 〃主存下載dwTotalPageFile4164648960 〃總共頁文件dwTotalPhys2082324480 〃總共物理大小dwTotalVirtual2147352576 〃總共虛擬大小&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&AllocationBase0x00010000 〃分配基址AllocationProtect4 〃分配保護(hù)BaseAddress0x00010000 〃基地址〃類型Protect4

〃類型RegionSize65536RegionSize65536〃區(qū)域大小State4096 〃狀態(tài)Type262144 〃類型1 〃同上dwActiveProcessorMask15dwAllocationGranularity65536dwNumberOfProcessors4dwOemld0dwPageSize4096dwProcessorType586IpMaximumApplicationAddress0x7FFEFFFFIpMinimumApplicationAddress0x00010000wProcessorArchitecture0wProcessorLevel6wProcessorRevision10759wReserved0************************************************************************************dwAvailPageFile2377961472dwAvailPhys900362240dwAvailVirtual2137522176dwLength32dwMemoryLoad56dwTotalPageFile4164648960dwTotalPhys2082324480dwTotalVirtual2147352576&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&AllocationBase0x00010000AllocationProtect4BaseAddress0x00010000Protect4RegionSize65536State4096Type262144一直到30;address:0x2f0000:reservenowtartingaddress:0x300000:reservenowtartingaddress:0x310000tartingaddress:0x320000:reservenowtartingaddress:0x330000:commixnowtartingaddress:0x2f0000:commixnowtartingaddress:0x300000':connitnowtartingaddress:0x310000:commitnowtartingaddress:0x320000:commitnowtartingaddress:0x3300000:locknowtartingaddress:0x2f0000981-locknowtartingaddress:0x3000002:locknowtartingaddress:0x310000nov/artingaddress:0x320000:locknowaddress:0x330000locknowaddress:0x2f00008

5

1

r

0

r

rlocklocknow:0x300000nowtartingaddress:0x310000rror:158.8:unlocknov/size:12288size:4096size:20480size:16384size:20480size:12288size:4096size:20480size:16384size:20480size:12288size:4096size:20480size:16384size:20480size:12288size:4096size:2048018:unlocknowstartingaddress:0x32000019:unlocknowsize:16384startingaddress:0x330000error:158size:2048020:deconnitnowstartingaddress:0x2f00008721:deconnitnowsize:12288startingaddress:0x30000022:deconnitnowsize:4096startingaddress:0x31000087size:2048023:decomnitnowstartingaddress:0x32000024:decomnitnowsize:16384startingaddress:0x33000048725:releasenowsize:20480startingaddress:0x2f000026:releasenowsize:12288startingaddress:0x30000027:releasenowsize:4096startingaddress:0x31000028:releasenowsize:20480startingaddress:0x32000029:releasenowsize:16384startingaddress:0x330000請(qǐng)按任意鍵繼續(xù)...size:20480保留(reserve)、提交(commit)、加鎖(lock)、解鎖(unlock)回收(decommit)、釋放(release)、保留:在虛擬地址空間分配,不分配物理空間提交:在物理地址空間分配加鎖:常駐內(nèi)存,即防止操作系統(tǒng)把對(duì)應(yīng)的內(nèi)存空間換出到外存解鎖:允許操作系統(tǒng)把對(duì)應(yīng)的內(nèi)存空間換出到外存回收:釋放物理空間,但保留虛擬空間釋放:釋放物理空間和虛擬空間1、主要數(shù)據(jù)結(jié)構(gòu):structoperation(inttime;〃起始時(shí)間intblock;〃內(nèi)存頁數(shù)intoper;//操作intprotection;〃權(quán)限1;structtrace〃跟蹤每一次分配活動(dòng)的數(shù)據(jù)結(jié)構(gòu)(LPVOIDstart;〃起始地址longsize;〃分配的大?。?;2、主程序:intmain()(DWORDdwThread;HANDLEhandle[2];〃生成兩個(gè)線程handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Tracker,NULL,0,&dwThread);handle[l]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Allocator,NULU0,&dwThread);〃生成兩個(gè)信號(hào)量allo=CreateSemaphore(NULL,0,1JaHo");trac=CreateSemaphore(NULL,1,1,"tracn);〃等待線程執(zhí)行的執(zhí)行結(jié)束后,再退出WaitForMultipleObjects(2,handle,TRUE,INFINITE);system(npauseH);return0;附錄:源程序://makefile.cpp〃〃〃〃ん//〃〃〃〃〃〃/〃〃〃〃〃〃/〃〃〃〃〃〃〃〃〃〃〃/〃〃〃〃〃〃/〃/〃〃〃〃/〃〃〃〃文件生成程序#include<fstream.h>#include<stdio.h>#include<stdlib.h>#include<time.h>structoperation(inttime;//起始時(shí)間intblock;/Z內(nèi)存頁數(shù)intoper;〃操作intprotection;〃權(quán)限};intmain()(FILE*file;file=fopen(”〇卩甘ザ,”ド)〃8打1ビ為二進(jìn)制用以確定內(nèi)存操作operationop;for(imj=OJ<6;j++)〃〇-保留;レ提交;2ー鎖;3ー解鎖;4-回收;5ー釋放for(inti=0;i<5;i++)〃〇-PAGE_READONLY;//1_READWRITE;〃2_EXECUTE;//3_EXECUTE_READ;//4_EXECUTE_READWRITE;(op.time=rand。%1〇。。;〃隨機(jī)生成等待時(shí)間op.block=rand()%5+1;〃隨機(jī)生成塊大小op.oper=j;tection=i;fwrite(&op,sizeof(operation)」,file);〃將生成的結(jié)構(gòu)寫入文件)system("pause");return0;//memory-op.cpp〃內(nèi)存管理實(shí)習(xí)〃將程序從文件讀入每次的操作,并將結(jié)果輸入到out.txt文件中〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃ノノ〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃#include<fstream.h>#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<iostream.h>structoperation(inttime;〃起始時(shí)間intblock;〃內(nèi)存頁數(shù)intoper;〃操作intprotection;〃權(quán)限};structtrace〃跟蹤每一次分配活動(dòng)的數(shù)據(jù)結(jié)構(gòu)(LPVOIDstart;〃起始地址longsize;〃分配的大?。籋ANDLEallo,trac;〃信號(hào)量的句柄DWORDTracker(LPDWORDIpdwparm)〃跟蹤allocator線程的內(nèi)存行為,并輸出必要信息(ofstreamoutEle;〃輸出文件outfile.open(,'out.txtM);for(inti=0;i<=30;i++)WaitForSingleObject(trac,INFINITE);〃等待allocator一次內(nèi)存分配活動(dòng)結(jié)束〃打印內(nèi)存狀況和系統(tǒng)狀況outfile?i?endl;〃以下一段顯示系統(tǒng)信息、,每次執(zhí)行操作后系統(tǒng)信息不變〃如果要查看系統(tǒng)信息,可以取消注釋SYSTEMJNFOinfo;〃系統(tǒng)信息GetSystemInfo(&info);outfile?"dwActiveProcessorMask''?'\t,?info.dwActiveProcessorMask?endl;outfile?,'dwAllocationGranularity',?,\t,?info.dwAllocationGranularity?endl;outfile?,,dwNumberOfProcessors,,?,\t,?info.dwNumberOfProcessors?endl;outfile?,'dwOemIdn?,\t,?info.dwOemId?endl;outfile?,'dwPageSize',?'\t,?info.dwPageSize?endl;outfile?,'dwProcessorType"?,\t,?info.dwProcessorType?endl;outfile?nlpMaximumApplicationAddress,'?'\t,?info.lpMaximumApplicationAddress?endl;outfile?,,lpMinimumApplicationAddress,'?,\t,?info.lpMinimumApplicationAddress?endl;outfile?,'wProcessorArchitecture"?'\t,?info.wProcessorArchitecture?endl;outfile?,'wProcessorLevel',?'\t,?info.wProcessorLevel?endl;outfile?,'wProcessorRevisionu?'\t,?info.wProcessorRevision?endl;outfile?,'wReserved"?,\t'?info.wReserved?endl;******************"?end卜〃內(nèi)存狀況MEMORYSTATUSstatus;〃內(nèi)存狀態(tài)GlobalMemorySlatus(&status);outfile?,'dwAvailPageFile,'?,\t'?status.dwAvailPageFile?endl;outfile?,,dwAvailPhys,'?,\t,?status.dwAvailPhys?endl;outfile?,'dwAvailVirtuar,?,\t,?status.dwAvailVirtual?endl;outfile?,'dwLength,'?'\t,?status.dwLength?endl;outfile?,'dwMemoryLoad,,?,\t,?status.dwMemoryLoad?endl;outfile?,'dwTotalPageFile',?'\t,?status.dwTotalPageFile?endl;outfile?,'dwTotalPhys,'?,\t'?status.dwTotalPhys?endl;outfile?,'dwTotalVirtual"?,\t'?status.dwTotalVirtual?endl;outfile?"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"v<en亜〃以下一段顯示內(nèi)存基本信息,每次操作后內(nèi)存基本信息不變〃如要查看內(nèi)存基本信息,可以取消注釋MEMORY_BASICJNFORMATIONmem;〃內(nèi)存基本信息VirtualQuery(info.lpMinimumApplicationAddress,&mem,sizeof(MEMORY_BASIC_INFORMATION));outfile?,'AllocationBase,,?'\t,?mem.AllocationBase?endl;outfile?,'AllocationProtectM?'\t,?mem.AllocationProtect?endl;outfile?',BaseAddressM?,\t,?mem.BaseAddress?endl;outfile?,'Protect,'?,\t'?mem.Protect?endl;outfile?,'RegionSize,,?'\t,?mem.RegionSize?endl;outfile?,'State,,?,\t,?mem.State?endl;outfile?,,Type,'?,\t,?mem.Type?endl;outfile<<”ー?????ーー??——.???~~???ー?ー?一ー???????《—ー????????ーー?ー〃釋放信號(hào)量通知allocator可以執(zhí)行下一次內(nèi)存分配活動(dòng)ReleaseSemaphore(allo,1,NULL);)return0;)voidAllocator?!M內(nèi)存分配活動(dòng)的線程(tracetraceArray[5];intindex=0;FILE*file;file=fopen("〇pfile",“rb");〃讀入文件operationop;SYSTEMJNFOinfo;DWORDtemp;GetSystemInfo(&info);for(inti=0;i<30;i++){WaitForSingleObject(allo,INFINITE);〃等待tracker打印結(jié)束的信號(hào)量cout?i?':';fread(&op,sizeof(operation),1,file);Sleep(op.time);〃執(zhí)行時(shí)間,如果想在指定時(shí)間執(zhí)行可以取消注釋GetSystemInfo(&info);switch(tection)〃根據(jù)文件內(nèi)容確定權(quán)限{case0:index=0;temp=PAGE_READONLY;break;}case1:temp=PAGE_READWRITE;break;temp=PAGE_EXECUTE;break;temp=PAGE_EXECUTE_READ;break;temp=PAGE_EXECUTE_READWRITE;break;default:temp=PAGE_READONLY;)switch(op.oper)Icase〇:〃保留一個(gè)區(qū)域(cout?"reservenowH?endl;traceArray[index].start=VirtualAlloc(NULL,op.block*infb.dwPageSize,MEM_RESERVE,PAGE_NOACCESS);traceArray[index++].size=op.block*info.dwPageSize;cout?Hstartingaddress:*'?traceArray[index-1].start?'\t'?',size:,,?traceArray[index-1].size?endl;break;)case1:〃提交一個(gè)區(qū)域{cout?,,commitnowH?endl;traceArray[index].start=VirtualAlloc(traceArrayfindex].start,traceArray[index].size,MEM_COMMIT,temp);index++;cout?nstartingaddress:'1?traceArray[index-l].start?'\t'?"size:"?traceArray[index-l].size?endl;break;)〃鎖ー個(gè)區(qū)域cout?"locknow*'?endl;cout?nstartingaddress:H?traceArray[index].start?

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論