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 路径. 表示当前目录.. 表示上一级目录 - 表示上一次所在…

python 将列表中的字符串转为数字_python 将列表中的字符串转为数字

本文实例讲述了python中列表元素转为数字的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;有一个数字字符的列表&#xff1a;numbers [1, 5, 10, 8]想要把每个元素转换为数字&#xff1a;numbers [1, 5, 10, 8]用一个循环来解决&#xff1a;new_numbers [];fo…

linux perl 安装目录,linux-将Perl模块安装到特定位置

我有几台运行Perl程序以及其他程序和工具的Linux机器.我想使所有机器之间的所有工具保持同步,因此我已经在一台机器(主)和另一台机器之间共享了/usr/local目录.现在,我想在/usr/local /< modules的路径>中使所有Perl模块及其依赖项保持同步.我已经找到了local::lib模块,但…

python 降维lda算法的使用_sklearn LDA降维算法

sklearn LDA降维算法LDA(Linear Discriminant Analysis)线性判断别分析&#xff0c;可以用于降维和分类。其基本思想是类内散度尽可能小&#xff0c;类间散度尽可能大&#xff0c;是一种经典的监督式降维/分类技术。sklearn代码实现#codingutf-8import pandas as pdimport matp…

linux 命令 语法,linux常用命令及语法

mkdir、rmdirmkdir命令用来建立新的目mkdir命令用来建立新的目录&#xff0c;rmdir用来删除已建立的目录。rm这个命令是用来删除文件的。rm命令常用的参数有三个&#xff1a;-i,-r,-f。删除既有文件或目录之前先询问用户&#xff0c;删除一个名字为test的一个文件&#xff1a;r…

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

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

linux 查找tomcat目录,linux下通过tomcat访问某路径下的文件

背景&#xff1a;linux服务器上有个日志目录&#xff0c;要通过界面访问。之前用Apache实现的&#xff0c;现在安全漏洞检查需要升级Apache&#xff0c;但是安装之路犹如西天取经&#xff0c;各种缺文件&#xff0c;各种报错&#xff0c;一直没搞定。然后决定用tomcat实现该功能…

python中的画布控制_使按钮在画布上工作(tkinter)

你的代码需要认真的重组。在这里有一些东西可以用来添加矩形。你不需要在cd2>中创建一个cd2>的集合&#xff0c;这样你就不需要在cd2>中创建一个的集合。在from tkinter import *import randomroot Tk()class Recta:def __init__(self, height60, width80):self.heig…

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…

linux的硬件系统管理,Linux 系统硬件管理的基础知识(四)

以下主要介绍我的***次安装Linux系统遭遇&#xff0c;以及怎么度过这个遭遇的&#xff0c;希望对大家有所帮助。不喜欢的可以略过。以下接《Linux 系统硬件管理的基础知识(三)》。四、关于存储设备的不同的表示方法的应用&#xff1b;1、/dev/hd[a-z] 表示方法的应用1)用于moun…

大整数减法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能看到。如果是查找指…

python查看数据大小_科多大数据带你看Python可以列为最值得学习的编程语言

原标题&#xff1a;科多大数据带你看Python可以列为最值得学习的编程语言不知道从什么时候开始&#xff0c;这句话开始流行。不过也从侧面反映出 Python 语言的特点&#xff1a;简单、高效。从近期代表技术趋势的业界报告以及编程语言排行榜来看&#xff0c;觉得编程语言这一块…

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中的时间格式和数据库中的时间格式转换在这里先写…

python函数作用域与闭包_python基础-08-内置函数、作用域、闭包、递归

python基础-内置函数、作用域、闭包、递归1.常见的内置函数常见的内置函数:查看内置函数&#xff1a;print(dir(__builtins__))常见函数type() 数据类型print() 打印help()查看方法详细用法id() 查看内存地址range() 求值范围len 求长度min 求最小值max 求最大值sorted 排序rev…

linux 配置trac界面显示为中文,安装back|track 5 r3并配置中文界面简单教程

最近更新&#xff1a;29th 4月, 2013最近对bt比较感兴趣&#xff0c;看到不少朋友说&#xff0c;bt早都出10了11了我说我怎么就不知道。官方网站打开一看&#xff0c;果然还是BT5&#xff0c;不过已经r3了。听说现在BT5的支持已经很好了&#xff0c;于是也就下载了一个&#xf…

ue4玻璃材质_UE4-材质

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