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

一 进程逻辑空间 物理空间

a7ec9757564a76b6f481b4f1fd5112d7.png
6cb63533528e09004d0a96cb058e8159.gif

如上图所示,每个进程都有自己的逻辑空间,这些逻辑空间,会被映射到具体的物理空间中。

每个进程的逻辑空间都是彼此隔离,相互独立不受干扰的。

但是他们都会被映射到同一个物理空间去,当其所映射的物理空间有重叠的时,这重叠的部分就共享了物理内存

二 共享内存关键问题

创建物理内存

将物理内存映射到进程空间

读写互斥控制

1)创建物理内存,获得物理内存资源句柄

比如 由A进程 负责创建共享内存

A: 进程创建完物理内存后,直接返回物理内存句柄

 // 创建共享文件句柄  HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默认安全级别 PAGE_READWRITE, // 可读可写 0, // 高位文件大小 BUF_SIZE, // 地位文件大小 L"ShareMemory" // 共享内存名称 );
6cb63533528e09004d0a96cb058e8159.gif

B:B进程通过共享内存的全局名字,来获得共享物理内存句柄

 // 打开共享的文件对象 HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L"ShareMemory");
6cb63533528e09004d0a96cb058e8159.gif

2) 物理内存映射进程空间

各个进程都是通过这种方式, 将物理空间共享内存,映射到进程逻辑空间

 // 映射缓存区视图 , 得到指向共享内存的指针 LPVOID lpBase = MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 可读写许可 0, 0, BUF_SIZE );
6cb63533528e09004d0a96cb058e8159.gif

3) 释放

进程退出时,要解除映射

// 解除文件映射

UnmapViewOfFile(lpBase);

// 关闭内存映射文件对象句柄

CloseHandle(hMapFile);

4)互斥控制

采用互斥量或信号的机制

互斥量机制

进程A: 创建互斥量mutex while(1) { 申请mutex; 处理C; 释放mutex; 其他操作; }
6cb63533528e09004d0a96cb058e8159.gif
进程B: while(1) { 申请mutex; 处理C; 释放mutex; 其他操作; }
6cb63533528e09004d0a96cb058e8159.gif

示例:

进程A

#include #include using namespace std;  int main(){// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄 HANDLE hMutex = CreateMutex(NULL, false, "pmutex"); if(NULL == hMutex) { cout<
6cb63533528e09004d0a96cb058e8159.gif

进程B

#include #include using namespace std;  int main(){// 若不存在名为"pmutex"的互斥量则创建它;否则获取其句柄 HANDLE hMutex = CreateMutex(NULL, false, "pmutex"); if(NULL == hMutex) { cout<
6cb63533528e09004d0a96cb058e8159.gif

信号量机制:

进程A : 执行 写操作

进程A 执行写操作//等待其他进程读操作完毕WaitForSingleObject(m_memMng.m_hReadEvent, INFINITE); //重置写操作信号量ResetEvent(m_memMng.m_hWriteEvent);//执行写操作memcpy//写操作完毕,恢复信号量,使得其它进程可读SetEvent(m_memMng.m_hWriteEvent);
6cb63533528e09004d0a96cb058e8159.gif

进程B: 执行读操作

//进程B执行读操作//等待主进程写完毕WaitForSingleObject(m_memMng.m_hWriteEvent, INFINITE);//重置读信号量ResetEvent(m_memMng.m_hReadEvent);//读操作,将共享内存数据拷贝本地变量memcpy//读操作完毕,设置信号量信号SetEvent(m_memMng.m_hReadEvent);
6cb63533528e09004d0a96cb058e8159.gif

三 封装

应该有的成员变量:

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;};
6cb63533528e09004d0a96cb058e8159.gif

共享内存管理类

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 文件的组织,Linux文件组织和目录结构

资料&#xff1a;https://www.shiyanlou.com/courses/running1 Linux目录结构说明可以使用tree来查看目录结构sudo apt-get install tree 安装treetree / 查看根目录的结构将目录定义为四种交互作使用的形态&#xff1a;2 路径. 表示当前目录.. 表示上一级目录 - 表示上一次所在…

jeecg 导出的excel不能使用公式_微软:Excel公式是世界上使用最广泛的编程语言...

喜欢就关注我们吧&#xff01;文|一君微软近日推出了一项 Excel 公式构建的新功能 LAMBDA&#xff0c;正则测试阶段。LAMBDA 允许使用 Excel 自身的公式语言自定义功能&#xff0c;而过去&#xff0c;Excel 中需要通过 JS 等语言编写自定义函数。同时&#xff0c;LAMBDA 还可以…

voip 音频采集时间_蓝牙音频续航监测系统展会现场演示

|点击【美格信】关注☝大家好&#xff0c;我是美格信公众号主编&#xff1a;小M&#xff0c;今天的2020(秋季)亚洲蓝牙耳机展上&#xff0c;我们美格信现场展示了发布的新品-MAGNUM麦金纳蓝牙音频续航监测系统。不过有很多小伙伴因为时间问题&#xff0c;没机会来现场参观&…

linux 运行scrapy,python 文件 运行 scrapy

写了一个scrapy&#xff0c;程序可以跑&#xff0c;没有任何问题。爬下30个网站的body存入json文件&#xff0c;并且保存为test.json如果test.json存在就保存到一个新建的test1.json新建了一个python文件叫check.py&#xff0c;对比两个文件的hash值&#xff0c;如果有不一样&a…

大整数减法c语言_3.2 C语言运算符和表达式

01基本的算术运算符1、正号运算符2、-负号运算符3、*乘法运算符4、/除法运算符5、%求余运算符6、加法运算符7、-减法运算符读者应该特别注意和-在不同情况下的含义02自增、自减运算符1、i&#xff0c;--i在使用i之前&#xff0c;先是i的值加&#xff08;减&#xff09;12、i&am…

如何查看linux 是否安装软件包,linux 查看软件包是否安装 linux查看软件包

Linux下怎样检查,如何查看某软件包是否已经安装1、rpm包安装的&#xff0c;可以用rpm -qa看到&#xff0c;如果要查找某软件包是否安装&#xff0c;用 rpm -qa | grep “软件或者包的名字”。rpm -qa | grep ruby2、以deb包安装的&#xff0c;可以用dpkg -l能看到。如果是查找指…

trueOS能装linux软件,TrueOS 是什么

TrueOS是一套基于FreeBSD-CURRENT、桌面取向的类Unix操作系统。主要目的是创建一个易于安装软件的图形用户界面&#xff0c;借由提供KDE SC、Lumina、MATE、Xfce等桌面环境使其容易上手。TrueOS 是一套基于 FreeBSD-CURRENT、桌面取向的类 Unix操作系统。主要目的是创建一个易于…

错误: 非法的表达式开始_虽然这两个C语言宏定义很简单,但是能在程序运行前找到错误代码...

今天翻看 Linux 内核源代码时&#xff0c;发现两行非常有意思的C语言代码&#xff0c;如下&#xff1a;#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))有意思的宏这两行C语言代码有什么…

linux下数据库时间格式,Java编程时间格式与数据库中时间格式转化

关于编程语言中的时间格式和关系型数据中的中时间格式问题的转化一直都是个简单而又不得不权衡的问题&#xff0c;这牵扯到数据库设计和SQL编程和应用程序中时间格式数据的处理的编程&#xff0c;两者总能够交缠在一起。关于Java中的时间格式和数据库中的时间格式转换在这里先写…

ue4玻璃材质_UE4-材质

本文中&#xff0c;我们将首先讨论基于物理的渲染&#xff0c;什么是材质域&#xff0c;什么是材质&#xff0c;什么是材质实例&#xff0c;什么是主材质&#xff0c;我们将讨论材质的一些建议和禁忌。最后&#xff0c;我们将了解一些材质概念&#xff0c;你可以将其用于各类项…

为啥linux分区是nvme0n1,NAS 篇五:尝试达成最终目标: 黑裙+万兆网卡+Nvme 存储空间的实现与测试...

NAS 篇五&#xff1a;尝试达成最终目标&#xff1a; 黑裙万兆网卡Nvme 存储空间的实现与测试2020-01-18 18:49:2346点赞248收藏80评论创作立场声明&#xff1a;1. 本系列文章讨论NAS与局域网&#xff0c; 请小编高抬贵手不要分类到无线网络去2. 如果你读了开头&#xff0c; 有“…

固态硬盘上安装centos_自己动手丰衣足食 手把手教你安装M.2固态硬盘

为了追求更快的速度、更好的性能&#xff0c;很多用户都为电脑升级或者更换了M.2固态硬盘。但是&#xff0c;M.2固态硬盘买好了&#xff0c;安装对大部分人来说却是个难题……因此&#xff0c;好多老铁通过微信后台联系小星&#xff0c;想了解一下M.2固态硬盘的安装教程。OK&am…

创建txt文件指令_Linux云计算教程全套视频合集:WORKDIR 指令讲解

WORKDIR 指令用于声明当前的工作目录&#xff0c;以后各层的当前目录就被改为指定的目录。格式为 WORKDIR <工作目录路径>。如该目录不存在&#xff0c;WORKDIR 会帮你建立目录。再次强调&#xff01;不要以为编写 Dockerfiel 是在写 shell 脚本。下面是一个错误示例&…

vba 自动排序_给VBA字典键值排序,并提取需要的数据

未知的领域很广、风景很美&#xff0c;不要蜷缩在一小块自认为天堂的世界里。待到暮年时安于自欺欺人&#xff0c;要努力提高自己&#xff0c;学习是一件很辛苦的事。要有一颗充满生机的心&#xff0c;把握现在&#xff0c;这才是进取。机会总在等待中出现&#xff0c;越是有意…

vba 提取 json某个值_利用VBA字典,提取两列数据的重复值

大家好&#xff0c;今日我们继续讲解VBA数组与字典解决方案&#xff0c;今日讲解第52讲&#xff1a;利用字典&#xff0c;提取两列数据重复值。有人讲:字典是VBA中最为精华的部分,持这种观点的人肯定有自己的道理,确实,利用字典可以给我的代码带来很大的方便之处,今日我讲解的是…

红外倒车雷达原理图_硅光电倍增管 (SiPM) 直接飞行时间 (dToF) 激光雷达平台为工业测距应用提供现成的设计...

点击蓝字关注我们请私信我们添加白名单如果您喜欢本篇文章&#xff0c;欢迎转载&#xff01;推动高能效创新的安森美半导体 (ON Semiconductor&#xff0c;美国纳斯达克上市代号&#xff1a;ON)&#xff0c;推出了由该公司硅光电倍增管 (SiPM) 技术实现的单点直接飞行时间 (dTo…

visio图标_弱电间机柜原型图整理,可编辑!(Excel,visio,CAD)

有朋友问到机柜原型图&#xff0c;这个我们在弱电vip技术群里面也有朋友提到过&#xff0c;今天我们就整理了弱电系统中常用的机柜原型图&#xff0c;有Excel&#xff0c;visio&#xff0c;CAD版本&#xff0c;可以修改编辑&#xff01;1、Excel机柜原型图(可编辑)机柜布局-1机…

c语言字节强制对齐,C语言的那些小秘密之字节对齐

为了让读者加深印象&#xff0c;我们这里在代码中没有使用0&#xff0c;而是使用的4&#xff0c;所以在最终计算出的结果部分减去了一个4才是偏移地址&#xff0c;当然实际使用中我们都是用的是0。懂了上面的宏offsetof之后我们再来看看下面的代码&#xff1a;#include #define…

xshell 6 连接debian系统拒绝了密码_原来连接Linux,还有这个方法

你是不是以为电脑的操作系统只有Windows和IOS系统&#xff0c;其实不是的&#xff0c;还有一个Linux系统&#xff0c;这个系统不是很常见&#xff0c;导致很多人连怎么连接Linux系统都不太清楚明白。Windows系统可以用远程桌面&#xff0c;Linux系统怎么来远程桌面呢&#xff1…

ctf up怎么写 write_软件测试工程师要不要写工具?

Fintech概念正受到不少互联网金融公司的热捧&#xff0c;主要是指代那些可用于撕裂传统金融服务方式的高新技术。越来越多的企业开辟了新的部门去研究各种各样能让自己产品增值的科技类产品。尤其是在很多互联网金融公司&#xff0c;业务分析师BA(Business Analyst)&#xff0c…