日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows 映射文件会释放内存吗_Windows系统共享内存管理

發布時間:2024/8/23 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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系统共享内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。