Win3內存管理之私有內存跟共享內存的申請與釋放
一丶內存簡介私有內存申請
經過上一篇文章.咱們理解了虛擬內存與物理內存的區別. 那麼咱們有API事專門申請虛擬內存與物理內存的.windows
有私有內存跟共享內存. 私有內存的意思就是這塊內存申請只在本進程的物理頁當中. 共享內存就是這個物理頁 A B兩個進程均可以使用.api
私有內存申請API安全
VirtualAlloc / virtualAllocExapp
LPVOID VirtualAlloc(
LPVOID lpAddress, 你要申請的地址.能夠指定地址.可是物理頁咱們不知道那個地址是否存在.因此通常爲0 SIZE_T dwSize, 申請內存的大小.通常爲一個頁.雖然MSDN說了一Byte(字節) 爲主. 可是咱們知道物理內存是一個頁.因此申請一個頁便可. DWORD flAllocationType, 申請內存的類型. 是這樣的.咱們申請內存在物理頁. 能夠有兩種類型.一種類型就是物理內存直接申請.一種就是物理內存佔位置.並不申請.通常用第一種. DWORD flProtect 內存的狀態.咱們申請的內存狀態是可讀的 仍是可寫的. 仍是可讀寫的.
virtualAllocEx 是遠程內存申請.就是說咱們能夠經過指定的進程. 給這個指定進程申請內存.spa
new malloc的區別. 請注意.真正申請內存的實際上是API. 而new malloc 是申請堆內存. 意思就是說. new malloc其實就是在已申請的內存上面劃分出來了一塊虛擬內存給你使用.操作系統
無論你使用沒使用. 並且new關鍵字本質也就是malloc 只不過能夠進行構造. 而 malloc的底層是經過 HeapAlloc申請的. 並無進0環(內核)code
二丶共享內存申請
1.共享內存申請
共享內存其實就是物理頁能夠共享使用了. A進程申請物理頁往這個物理頁填寫內容. B進程就能夠讀取了.對象
咱們具體的APIblog
1. 申請物理頁內存API索引
HANDLE CreateFileMapping( HANDLE hFile, 文件映射.申請的物理頁能夠跟文件相映射.若是不須要文件只申請物理頁則不須要. LPSECURITY_ATTRIBUTES lpAttributes, SD安全屬性,每一個內核對象都須要的安全屬性 DWORD flProtect, 權限.你申請的這個物理頁是可讀的可寫的仍是可讀寫. DWORD dwMaximumSizeHigh, 申請內存的高32位. windows爲了支持64我操做系統.因此給了高低32位來保存地址. 若是是32位地址.則不須要.填0便可. DWORD dwMaximumSizeLow, 低32位,你要申請的物理頁內存的大小 LPCTSTR lpName 進程共享物理頁的名字.若是但願這個物理頁B進程可使用則須要給一個名字.
返回值: 返回物理頁句柄索引.
有建立物理頁 也有打開物理頁 主要是B進程使用.
HANDLE OpenFileMapping( DWORD dwDesiredAccess, // access mode BOOL bInheritHandle, // inherit flag LPCTSTR lpName // object name);
固然若是B進程使用同樣可使用CreateFileMaping. 只不過會返回文件對象已經存在的錯誤.
2.線性地址(虛擬地址) 關聯物理頁.
上面申請了物理頁.那麼咱們還須要將這個物理頁映射到線性地址.須要的API以下.
LPVOID MapViewOfFile( HANDLE hFileMappingObject, // 物理頁句柄 DWORD dwDesiredAccess, // 線性地址訪問權限,注意跟物理頁最好一直.或者比物理頁更嚴格. DWORD dwFileOffsetHigh, // 映射線性地址的偏移位置 高32位 DWORD dwFileOffsetLow, // 低32位 SIZE_T dwNumberOfBytesToMap // 內存映射結束位置;
3.取消關聯
BOOL UnmapViewOfFile( LPCVOID lpBaseAddress // starting address); 虛擬地址
關閉物理頁映射則使用CloseHandle. PS: 知識 引用計數-1. 爲0了則會關閉.
具體代碼以下.
A進程B進程同樣. A進程寫入. B進程寫入.
// A.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include <Windows.h> int main() { getchar(); //A進程 申請物理頁 HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, TEXT("共享內存")); //2.映射虛擬內存(線性地址的) LPVOID lpBuf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0x1000); // A進程寫內存 *(char *)lpBuf = 'a'; //寫內存 printf("寫入內存爲a \r\n"); getchar(); UnmapViewOfFile(lpBuf); CloseHandle(hMap); return 0; }
B進程代碼:
// A.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include <Windows.h> int main() { getchar(); //A進程 申請物理頁 HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, TEXT("共享內存")); //2.映射虛擬內存(線性地址的) LPVOID lpBuf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0x1000); // A進程寫內存 printf("讀取內存爲 %c \r\n",*(char *)lpBuf); getchar(); UnmapViewOfFile(lpBuf); CloseHandle(hMap); return 0; }
這樣就實現了物理頁共享.