Win3内存管理之私有内存跟共享内存的申请与释放
2021-07-13 03:10
标签:read tchar inf 程序 图片 file 技术分享 open msdn 通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存. 私有内存的意思就是这块内存申请只在本进程的物理页当中. 共享内存就是这个物理页 A B两个进程都可以使用. 私有内存申请API VirtualAlloc / virtualAllocEx virtualAllocEx 是远程内存申请.就是说我们可以通过指定的进程. 给这个指定进程申请内存. new malloc的区别. 请注意.真正申请内存的其实是API. 而new malloc 是申请堆内存. 意思就是说. new malloc其实就是在已申请的内存上面划分出来了一块虚拟内存给你使用. 不管你使用没使用. 而且new关键字本质也就是malloc 只不过可以进行构造. 而 malloc的底层是通过 HeapAlloc申请的. 并没有进0环(内核) 共享内存其实就是物理页可以共享使用了. A进程申请物理页往这个物理页填写内容. B进程就可以读取了. 我们具体的API 1. 申请物理页内存API 有创建物理页 也有打开物理页 主要是B进程使用. 当然如果B进程使用一样可以使用CreateFileMaping. 只不过会返回文件对象已经存在的错误. 上面申请了物理页.那么我们还需要将这个物理页映射到线性地址.需要的API如下. 关闭物理页映射则使用CloseHandle. PS: 知识 引用计数-1. 为0了则会关闭. 具体代码如下. A进程B进程一样. A进程写入. B进程写入. B进程代码: 这样就实现了物理页共享. Win3内存管理之私有内存跟共享内存的申请与释放 标签:read tchar inf 程序 图片 file 技术分享 open msdn 原文地址:https://www.cnblogs.com/iBinary/p/9581863.html Win3内存管理之私有内存跟共享内存的申请与释放
一丶内存简介私有内存申请
LPVOID VirtualAlloc(
LPVOID lpAddress, 你要申请的地址.可以指定地址.但是物理页我们不知道那个地址是否存在.所以一般为0
SIZE_T dwSize, 申请内存的大小.一般为一个页.虽然MSDN说了一Byte(字节) 为主. 但是我们知道物理内存是一个页.所以申请一个页即可.
DWORD flAllocationType, 申请内存的类型. 是这样的.我们申请内存在物理页. 可以有两种类型.一种类型就是物理内存直接申请.一种就是物理内存占位置.并不申请.一般用第一种.
DWORD flProtect 内存的状态.我们申请的内存状态是可读的 还是可写的. 还是可读写的.二丶共享内存申请
1.共享内存申请
HANDLE CreateFileMapping( HANDLE hFile, 文件映射.申请的物理页可以跟文件相映射.如果不需要文件只申请物理页则不需要.
LPSECURITY_ATTRIBUTES lpAttributes, SD安全属性,每个内核对象都需要的安全属性
DWORD flProtect, 权限.你申请的这个物理页是可读的可写的还是可读写.
DWORD dwMaximumSizeHigh, 申请内存的高32位. windows为了支持64我操作系统.所以给了高低32位来保存地址. 如果是32位地址.则不需要.填0即可.
DWORD dwMaximumSizeLow, 低32位,你要申请的物理页内存的大小
LPCTSTR lpName 进程共享物理页的名字.如果希望这个物理页B进程可以使用则需要给一个名字.
返回值: 返回物理页句柄索引.HANDLE OpenFileMapping( DWORD dwDesiredAccess, // access mode
BOOL bInheritHandle, // inherit flag
LPCTSTR lpName // object name);
2.线性地址(虚拟地址) 关联物理页.
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // 物理页句柄
DWORD dwDesiredAccess, // 线性地址访问权限,注意跟物理页最好一直.或者比物理页更严格.
DWORD dwFileOffsetHigh, // 映射线性地址的偏移位置 高32位
DWORD dwFileOffsetLow, // 低32位
SIZE_T dwNumberOfBytesToMap // 内存映射结束位置;
3.取消关联
BOOL UnmapViewOfFile( LPCVOID lpBaseAddress // starting address); 虚拟地址
// A.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
// A.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
下一篇:spring事務