版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、本文背景:在編程中,很多Windows或C+的內(nèi)存函數(shù)不知道有什么區(qū)別,更別談有效使用;根本的原因是,沒有清楚的理解操作系統(tǒng)的內(nèi)存管理機(jī)制,本文企圖通過簡單的總結(jié)描述,結(jié)合實例來闡明這個機(jī)制。本文目的:對Windows內(nèi)存管理機(jī)制了解清楚,有效的利用C+內(nèi)存函數(shù)管理和使用內(nèi)存。本文內(nèi)容:本文一共有六節(jié),由于篇幅較多,故按節(jié)發(fā)表。其他章節(jié)請看本人博客的Windows內(nèi)存管理及C+內(nèi)存分配實例(一)(三)(四)(五)和(六)。2. 內(nèi)存狀態(tài)查詢函數(shù)2.1系統(tǒng)信息Windows 提供API可以查詢系統(tǒng)內(nèi)存的一些屬性,有時候我們需要獲取一些頁
2、面大小、分配粒度等屬性,在分配內(nèi)存時用的上。請看以下C+程序:SYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo;cout<<"機(jī)器屬性:"< cout<<"頁大小="< cout<<"分配粒度="< cout<<"用戶區(qū)最小值="< cout<<"用戶區(qū)最大值="< 結(jié)果如下: 可以看出,頁面大小是4K,區(qū)域分配粒度是64K,進(jìn)程用戶區(qū)是0x0001 0
3、0000x7FFE FFFF。 2.2內(nèi)存狀態(tài) 內(nèi)存狀態(tài)可以獲取總內(nèi)存和可用內(nèi)存,包括頁文件和物理內(nèi)存。請看以下C+程序:MEMORYSTATUS memStatus;GlobalMemoryStatus(&memStatus;cout<<"內(nèi)存初始狀態(tài):"< cout<<"內(nèi)存繁忙程度="< cout<<"總物理內(nèi)存="< cout<<"可用物理內(nèi)存=&qu
4、ot;< cout<<"總頁文件="< cout<<"可用頁文件="< cout<<"總進(jìn)程空間="< cout<<"可用進(jìn)程空間="< 結(jié)果如下:可以看出,總物理內(nèi)存是1G,可用物理內(nèi)存是510兆,總頁文件是2.5G,這個是包含物理內(nèi)存的頁文件;可用頁文件是1.9G。這里還標(biāo)識了總進(jìn)程空間,還有可用的進(jìn)程空間,程序只用了22兆的內(nèi)存空間。這里說的都是大約數(shù)。內(nèi)存繁忙程序是標(biāo)識當(dāng)前系統(tǒng)內(nèi)存管理的繁忙程序,從0到100,其實用處不大。
5、60; 在函數(shù)里面靜態(tài)分配一些內(nèi)存后,看看究竟發(fā)生什么char stat65536;MEMORYSTATUS memStatus1;GlobalMemoryStatus(&memStatus1;cout<<"靜態(tài)分配空間:"< printf("指針地址=%x/n",stat;cout<<"減少物理內(nèi)存="< cout<<"減少可用頁文件="< cout<<&q
6、uot;減少可用進(jìn)程空間="< memSta tus1.dwAvailVirtual< 結(jié)果如下: 可以看出,物理內(nèi)存、可用頁文件和進(jìn)程空間都沒有損耗。因為局部變量是分配在線程堆棧里面的,每個線程系統(tǒng)都會建立一個默認(rèn)1M大小的堆棧給線程函數(shù)調(diào)用使用。如果分配超過1M,就會出現(xiàn)堆棧溢出。 在函數(shù)里面動態(tài)分配300M的內(nèi)存后,看看究竟發(fā)生什么char *dynamic=new char300*1024*1024;MEMORYSTATUS memStatus2
7、;GlobalMemoryStatus(&memStatus2;cout<<"動態(tài)分配空間:"< printf("指針地址=%x/n",dynamic;cout<<"減少物理內(nèi)存="< cout<<"減少可用頁文件="< cout<<"減少可用進(jìn)程空間="< 結(jié)果如下: 動態(tài)分配情況下,系統(tǒng)分配直到內(nèi)存頁文件使用完為止,當(dāng)然,系統(tǒng)要留一下系統(tǒng)使用的頁面。 2.3 進(jìn)程區(qū)域地址查詢在給定一個進(jìn)程空間
8、的地址后,可以查詢它所在區(qū)域和相鄰頁面的狀態(tài),包括頁面保護(hù)屬性、存儲器類型等。 C+靜態(tài)分配了兩次內(nèi)存,一次是4K大一點,一個是900K左右。char arrayA4097;char arrayB900000;第一次查詢:long len=sizeof(MEMORY_BASIC_INFORMATION;MEMORY_BASIC_INFORMATION mbiA;VirtualQuery(arrayA,&mbiA,len;cout<<"靜態(tài)內(nèi)存地址屬性:"< cout
9、<<"區(qū)域基地址="< cout<<"區(qū)域鄰近頁面狀態(tài)="< cout<<"區(qū)域保護(hù)屬性="< cout<<"頁面基地址="< printf("arrayA指針地址=%x/n",arrayA;cout<<"從頁面基地址開始的大小="< cout<<"鄰近頁面物理存儲器類型="< cout<<"頁面保護(hù)屬性="<
10、第二次查詢:MEMORY_BASIC_INFORMATION mbiB;VirtualQuery(arrayB,&mbiB,len;cout<<"靜態(tài)內(nèi)存地址屬性:"< cout<<"區(qū)域基地址="< cout<<"區(qū)域鄰近頁面狀態(tài)="< cout<<"區(qū)域保護(hù)屬性="< cout<<"頁面基地址="< printf("arrayB指針地址=%x/n",arrayB;cout&l
11、t;<"從頁面基地址開始的大小="< cout<<"鄰近頁面物理存儲器類型="< cout<<"頁面保護(hù)屬性="< 說明:區(qū)域基地址指的是給定地址所在的進(jìn)程空間區(qū)域;鄰近頁面狀態(tài)指的是與給定地址所在頁面狀態(tài)相同頁面的屬性:MEM_FREE(空閑=65536)、MEM_RESERVE(保留=8192)和MEM_COMMIT(提交=4096)。區(qū)域保護(hù)屬性指的是區(qū)域初次被保留時被賦予的保護(hù)屬性:PAGE_READONLY(2)、PAGE_READWRITE(4)、PAGE_WRI
12、TECOPY(8)和PAGE_EXECUTE_WRITECOPY(128)等等。頁面基地址指的是給定地址所在頁面的基地址。從頁面基地址開始的區(qū)域頁面的大小,指的是與給定地址所在頁面狀態(tài)、保護(hù)屬性相同的頁面。鄰近頁面物理存儲器類型指的是與給定地址所在頁面相同的存儲器類型,包括:MEM_PRIVATE(頁文件=131072)、MEM_MAPPED(文件映射=262144)和MEM_IMAGE(exe映像=16777216)。頁面保護(hù)屬性指的是頁面被指定的保護(hù)屬性,在區(qū)域保護(hù)屬性指定后更新。 結(jié)果如下: 如前所說,這是在堆棧區(qū)域0x0004 0000里分配的,后分配的地址arra
13、yB反而更小,符合堆棧的特性。arrayA和arrayB它們處于不同的頁面。頁面都受頁文件支持,并且區(qū)域都是提交的,是系統(tǒng)在線程創(chuàng)建時提交的。 C+動態(tài)分配了兩次內(nèi)存,一次是1K大一點,一個是64K左右。所以應(yīng)該不會在一個區(qū)域。char *dynamicA=new char1024;char *dynamicB=new char65467;VirtualQuery(dynamicA,&mbiA,len;cout<<"動態(tài)內(nèi)存地址屬性:"< cout<
14、;<"區(qū)域基地址="< cout<<"區(qū)域鄰近頁面狀態(tài)="< cout<<"區(qū)域保護(hù)屬性="< cout<<"頁面基地址="< printf("dynamicA指針地址=%x/n",dynamicA;cout<<"從頁面基地址開始的大小="< cout<<"鄰近頁面物理存儲器類型="< cout<<"頁面保護(hù)屬性="<
15、 VirtualQuery(dynamicB,&mbiB,len;cout<<"動態(tài)內(nèi)存地址屬性:"< cout<<"區(qū)域基地址="< cout<<"區(qū)域鄰近頁面狀態(tài)="< cout<<"區(qū)域保護(hù)屬性="< cout<<"頁面基地址="< printf("dynamicB指針地址=%x/n",dynamicB;cout<<"從頁面基地址開始的大小
16、="< cout<<"鄰近頁面物理存儲器類型="< cout<<"頁面保護(hù)屬性="< 結(jié)果如下: 這里是動態(tài)分配,dynamicA和dynamicB處于兩個不同的區(qū)域;同樣,頁面都受頁文件支持,并且區(qū)域都是提交的。第二個區(qū)域是比64K大的,由分配粒度可知,區(qū)域至少是128K。那么,剩下的空間也是提交的嗎,如果是的話那就太浪費了??纯淳椭懒耍?x00E2 1000肯定在這個空間里,所以查詢?nèi)缦拢篤irtualQuery(char*0xE23390,&mbiB,len;cout<<"動態(tài)內(nèi)存地址屬性:"< cout<<"區(qū)域基地址="< cout<<"區(qū)域鄰近頁面狀態(tài)="< cout<<"區(qū)域保護(hù)屬性="< cout<<"頁面基地址="< printf("dynamicB指針地址=
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年園林景觀照明系統(tǒng)設(shè)計與安裝合同3篇
- 2024年版新員工勞動協(xié)議模板指導(dǎo)樣例版B版
- 音樂教學(xué)工作計劃
- 2021后勤工作總結(jié)范文
- 全年工作計劃集合六篇
- 2021員工辭職報告集錦15篇
- 公司的活動總結(jié)感悟10篇
- 公司技術(shù)員個人工作總結(jié)例文8篇
- 教導(dǎo)工作計劃四篇
- 遠(yuǎn)程培訓(xùn)總結(jié)(15篇)
- 工程倫理分析-切爾諾貝利
- 外墻用水泥纖維板接縫位置開裂問題及處理
- 超星爾雅學(xué)習(xí)通【中國近現(xiàn)代史綱要(首都師范大學(xué))】章節(jié)測試含答案
- 《鼻負(fù)壓置換術(shù)在兒童呼吸道感染中的應(yīng)用及護(hù)理對策研究【論文】3600字》
- 發(fā)動機(jī)機(jī)械系統(tǒng)2.0升ltg-9.66維修指南車下
- 哈爾濱市商品房買賣合同書(最終定稿)
- 信號與系統(tǒng) 西安郵電 習(xí)題答案
- 新疆維吾爾自治區(qū)和田地區(qū)各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)及行政區(qū)劃代碼
- 用人單位終止(解除)勞動合同證明書參考
- 天津工業(yè)大學(xué)《工程力學(xué)》2017-2018-1期末試卷及答案
- 能力素質(zhì),勝任力模型
評論
0/150
提交評論