windows 映射文件会释放内存吗_Windows系统共享内存管理
一 進程邏輯空間 物理空間
?
如上圖所示,每個進程都有自己的邏輯空間,這些邏輯空間,會被映射到具體的物理空間中。
每個進程的邏輯空間都是彼此隔離,相互獨立不受干擾的。
但是他們都會被映射到同一個物理空間去,當其所映射的物理空間有重疊的時,這重疊的部分就共享了物理內存
二 共享內存關鍵問題
創建物理內存
將物理內存映射到進程空間
讀寫互斥控制
1)創建物理內存,獲得物理內存資源句柄
比如 由A進程 負責創建共享內存
A: 進程創建完物理內存后,直接返回物理內存句柄
// 創建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默認安全級別 PAGE_READWRITE, // 可讀可寫 0, // 高位文件大小 BUF_SIZE, // 地位文件大小 L"ShareMemory" // 共享內存名稱 );B:B進程通過共享內存的全局名字,來獲得共享物理內存句柄
// 打開共享的文件對象 HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L"ShareMemory");2) 物理內存映射進程空間
各個進程都是通過這種方式, 將物理空間共享內存,映射到進程邏輯空間
// 映射緩存區視圖 , 得到指向共享內存的指針 LPVOID lpBase = MapViewOfFile( hMapFile, // 共享內存的句柄 FILE_MAP_ALL_ACCESS, // 可讀寫許可 0, 0, BUF_SIZE );3) 釋放
進程退出時,要解除映射
// 解除文件映射
UnmapViewOfFile(lpBase);
// 關閉內存映射文件對象句柄
CloseHandle(hMapFile);
4)互斥控制
采用互斥量或信號的機制
互斥量機制
進程A: 創建互斥量mutex while(1) { 申請mutex; 處理C; 釋放mutex; 其他操作; }進程B: while(1) { 申請mutex; 處理C; 釋放mutex; 其他操作; }示例:
進程A
#include #include using namespace std; int main(){// 若不存在名為"pmutex"的互斥量則創建它;否則獲取其句柄 HANDLE hMutex = CreateMutex(NULL, false, "pmutex"); if(NULL == hMutex) { cout<進程B
#include #include using namespace std; int main(){// 若不存在名為"pmutex"的互斥量則創建它;否則獲取其句柄 HANDLE hMutex = CreateMutex(NULL, false, "pmutex"); if(NULL == hMutex) { cout<信號量機制:
進程A : 執行 寫操作
進程A 執行寫操作//等待其他進程讀操作完畢WaitForSingleObject(m_memMng.m_hReadEvent, INFINITE); //重置寫操作信號量ResetEvent(m_memMng.m_hWriteEvent);//執行寫操作memcpy//寫操作完畢,恢復信號量,使得其它進程可讀SetEvent(m_memMng.m_hWriteEvent);進程B: 執行讀操作
//進程B執行讀操作//等待主進程寫完畢WaitForSingleObject(m_memMng.m_hWriteEvent, INFINITE);//重置讀信號量ResetEvent(m_memMng.m_hReadEvent);//讀操作,將共享內存數據拷貝本地變量memcpy//讀操作完畢,設置信號量信號SetEvent(m_memMng.m_hReadEvent);三 封裝
應該有的成員變量:
1)創建物理內存、映射進程空間 管理
HANDLE hMapping_; 物理空間資源句柄
MappedView View_; 物理映射成進程空間的操作
int size_; 物理空間大小
std::wstring name_; 共享內存名字
2) 信號量控制管理
HANDLE m_hReadEvent;
HANDLE m_hWriteEvent;
操作方法:
1)創建
bool CreateFileMap(); //創建
bool OpenFileMap(); //已存在,則打開
bool MapView(bool bCanWrite = true); //映射進程空間
2)映射管理類
class MappedView{public:MappedView() : view_(NULL) {}~MappedView() { CloseView(); }bool MapView(SharedMemory *shared_memory, bool can_write);//MapViewOfFilevoid CloseView();char *view() { return view_; }private: char *view_=nullptr;};共享內存管理類
class SharedMemory{public:SharedMemory() : hMapping_(NULL) {size_ = 0;m_hReadEvent = NULL;m_hWriteEvent = NULL;}~SharedMemory() { Close(); if (m_hReadEvent) {CloseHandle(m_hReadEvent); }if (m_hWriteEvent)CloseHandle(m_hWriteEvent);};public://初始化bool InitReceiver(std::wstring name, std::wstring readName = L"ShareMemoryReadEvent總結
以上是生活随笔為你收集整理的windows 映射文件会释放内存吗_Windows系统共享内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建txt文件指令_Linux云计算教程
- 下一篇: java信息管理系统总结_java实现科