内存体系 用共享段于进程间联系
內(nèi)存體系結(jié)構(gòu)
虛擬地址分區(qū):空指針賦值分區(qū),用戶模式分區(qū),64KB禁入分區(qū),內(nèi)核模式分區(qū)
在默認(rèn)情況下運(yùn)行一個(gè)64位的應(yīng)用程序,系統(tǒng)會(huì)保留用戶模式地址空間中位于地址0x00000000'80000000(2G)之后的所有部分;
這確認(rèn)所有的內(nèi)存分配在低2G上,這就是所謂的地址空間沙箱,可以用Yes (/LARGEADDRESSAWARE) link開(kāi)關(guān)打開(kāi)。dll工程會(huì)忽略此開(kāi)關(guān)。
當(dāng)系統(tǒng)創(chuàng)建一個(gè)進(jìn)程并賦予它地址空間時(shí),調(diào)用VirtualAlloc來(lái)預(yù)訂,再還是通過(guò)VirtualAlloc來(lái)調(diào)撥物理內(nèi)存與之映射。用VirtualFree來(lái)撤銷調(diào)撥。
當(dāng)應(yīng)用程序調(diào)用VirtualAlloc函數(shù)來(lái)把物理存儲(chǔ)器調(diào)撥給地址空間區(qū)域時(shí),該空間實(shí)際上是從硬盤上的頁(yè)交換文件分配得到的。
當(dāng)用戶要求執(zhí)行一個(gè)應(yīng)用程序時(shí),系統(tǒng)會(huì)打開(kāi)該應(yīng)用程序?qū)?yīng)的.exe文件并計(jì)算應(yīng)用程序的代碼和數(shù)據(jù)的大小,然后系統(tǒng)會(huì)預(yù)訂一塊地址空間,并注明與該區(qū)域
相關(guān)聯(lián)的物理存儲(chǔ)器就是.exe文件本身。系統(tǒng)不會(huì)從頁(yè)面交換文件中調(diào)撥物理內(nèi)存,因?yàn)檫@樣拷貝代碼與數(shù)據(jù)到頁(yè)面交換文件中,這是低效的。此時(shí)的EXE文件也叫內(nèi)存映射文件。
可以為每個(gè)物理存儲(chǔ)頁(yè)指定不同的頁(yè)面保護(hù)屬性。非閑置區(qū)域的基地址都是64KB(分配粒子)的整數(shù)倍。
地址空間中區(qū)域類型:
閑置:未預(yù)定
私有:以頁(yè)面交換文件為后備存儲(chǔ)器
映像:一開(kāi)始以映像文件(EXE或DLL文件)為后備存儲(chǔ)器,后來(lái)如果寫入映像文件一個(gè)全局變量,那么寫時(shí)復(fù)制會(huì)改用頁(yè)交換后備存儲(chǔ)器。
已映射:一開(kāi)始以內(nèi)存映射文件為后備存儲(chǔ)器,后來(lái)內(nèi)存映射文件可能會(huì)使用寫時(shí)復(fù)制保護(hù)屬性,任何寫操作會(huì)改用頁(yè)交換后備存儲(chǔ)器。
為節(jié)省磁盤空間,鏈接器會(huì)盡可能地對(duì)所生成的PE文件進(jìn)行壓縮。當(dāng)WINDOWS將PE文件映射到進(jìn)程空間時(shí),每一段(SECTION)必須另起一頁(yè),而且起始地址為系統(tǒng)頁(yè)面的整數(shù)倍。
如果程序試圖寫入?yún)^(qū)域中具有PAGE_WRITECOPY或PAGE_EXECUTE_WRITECOPY屬性的頁(yè)面,那么系統(tǒng)會(huì)專門為進(jìn)程復(fù)制一份該頁(yè)面。
第14章 操作系統(tǒng)的許多系統(tǒng)信息是由系統(tǒng)所運(yùn)行的主機(jī)決定的,如頁(yè)面大小和分配粒度等。GetSystemInfo(LPSYSTEM_INFO psi)
為了讓32位的應(yīng)用程序也能在64位系統(tǒng)上運(yùn)行,microsoft提供了Windows 32-bit On Windows 64-bit的模擬層,又稱WOW64。IsWow64Process函數(shù)
非統(tǒng)一內(nèi)存訪問(wèn)(Non-Uniform Memory Access)NUMA機(jī)器中的CPU既能訪問(wèn)自己節(jié)點(diǎn)的內(nèi)存,也能訪問(wèn)其他節(jié)點(diǎn)的內(nèi)存。
確定地址空間的狀態(tài) VirtualQuery(Ex)
在Windows Vista上,如果啟動(dòng)多次一個(gè)EXE,其加載的同一DLL的位置可能不同,這是windows vista的地址空間布局隨機(jī)化(Address Space Layout Randomization)ASLR.
?
widows提供了以下三種機(jī)制來(lái)對(duì)內(nèi)存進(jìn)行操控:
虛擬內(nèi)存:最適合用來(lái)管理大型對(duì)象數(shù)組或大型結(jié)構(gòu)數(shù)組
內(nèi)存映射文件:最適合用來(lái)管理大型數(shù)據(jù)流(通常是文件),以及在同一機(jī)器上運(yùn)行的多個(gè)進(jìn)程之間共享數(shù)據(jù)
堆:最適合用來(lái)管理大量的小型對(duì)象
虛擬內(nèi)存:最適合用來(lái)管理大型對(duì)象數(shù)組或大型結(jié)構(gòu)數(shù)組
VirtualAlloc?MEM_RESERVE預(yù)訂? MEM_COMMIT調(diào)撥??? 基地址通常會(huì)被向下取整到頁(yè)面大小的整數(shù)倍,而大小則會(huì)被向上取整到頁(yè)面大小的整數(shù)倍。
VirtualFree?撤銷調(diào)撥
VirtulaProtect 改變頁(yè)面的保護(hù)屬性
地址窗口擴(kuò)展Address Windowing Extension(AWE):1.系統(tǒng)不會(huì)把以這種方式分配的內(nèi)存換出到磁盤上;2.允許應(yīng)用程序訪問(wèn)比進(jìn)程地址空間還要多的內(nèi)存。
系統(tǒng)默認(rèn)會(huì)預(yù)訂1MB的地址空間并調(diào)撥兩個(gè)頁(yè)面的存儲(chǔ)器,?/STACK 指定的值寫入PE文件頭
_beginthreadex中的參數(shù)優(yōu)先于上面的值
棧頂棧低都有保護(hù)區(qū)間
內(nèi)存映射文件 (windows許多方法用此來(lái)在進(jìn)程間傳送數(shù)據(jù))
?
#include <Windows.h>#pragma data_seg("MySec") volatile LONG g_lApplicationInstances = 0; //要初始化,否則會(huì)放入.bss未初始化數(shù)據(jù)段,如不初始化要用allocate #pragma data_seg()#pragma comment(linker, "/Section:MySec,RWS") //R READ W WRITE S SHARED #pragma comment(linker, "/subsystem:\"windows\" /entry:\"wmainCRTStartup\"") //關(guān)閉CMD窗口void wmain() {InterlockedExchangeAdd(&g_lApplicationInstances, 1);int bRet = 0;do{wchar_t buf[3] = { '\0' };_itow_s(g_lApplicationInstances,buf,3,10);bRet = MessageBoxW(NULL,buf,NULL,MB_YESNO);}while(bRet == IDYES );InterlockedExchangeAdd(&g_lApplicationInstances, -1); }
?
總結(jié)
以上是生活随笔為你收集整理的内存体系 用共享段于进程间联系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 线程池之工作项,等待项,计时项 (存在疑
- 下一篇: 内存映射文件