Win3内存管理之私有内存跟共享内存的申请与释放

一丶内存简介私有内存申请

  通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的.

有私有内存跟共享内存. 私有内存的意思就是这块内存申请只在本进程的物理页当中. 共享内存就是这个物理页 A B两个进程都可以使用.

私有内存申请API

  VirtualAlloc / virtualAllocEx

LPVOID VirtualAlloc(  
LPVOID lpAddress, 你要申请的地址.可以指定地址.但是物理页我们不知道那个地址是否存在.所以一般为0
SIZE_T dwSize, 申请内存的大小.一般为一个页.虽然MSDN说了一Byte(字节) 为主. 但是我们知道物理内存是一个页.所以申请一个页即可.
DWORD flAllocationType, 申请内存的类型. 是这样的.我们申请内存在物理页. 可以有两种类型.一种类型就是物理内存直接申请.一种就是物理内存占位置.并不申请.一般用第一种.
DWORD flProtect 内存的状态.我们申请的内存状态是可读的 还是可写的. 还是可读写的.

virtualAllocEx 是远程内存申请.就是说我们可以通过指定的进程. 给这个指定进程申请内存.

new malloc的区别. 请注意.真正申请内存的其实是API. 而new malloc 是申请堆内存. 意思就是说. new malloc其实就是在已申请的内存上面划分出来了一块虚拟内存给你使用.

不管你使用没使用. 而且new关键字本质也就是malloc 只不过可以进行构造. 而 malloc的底层是通过 HeapAlloc申请的. 并没有进0环(内核)

二丶共享内存申请

1.共享内存申请

  共享内存其实就是物理页可以共享使用了. A进程申请物理页往这个物理页填写内容. B进程就可以读取了.

我们具体的API

  1. 申请物理页内存API

    

HANDLE CreateFileMapping(  HANDLE hFile,                       文件映射.申请的物理页可以跟文件相映射.如果不需要文件只申请物理页则不需要.
LPSECURITY_ATTRIBUTES lpAttributes,                SD安全属性,每个内核对象都需要的安全属性
DWORD flProtect,                 权限.你申请的这个物理页是可读的可写的还是可读写.
DWORD dwMaximumSizeHigh, 申请内存的高32位. windows为了支持64我操作系统.所以给了高低32位来保存地址. 如果是32位地址.则不需要.填0即可.
DWORD dwMaximumSizeLow,                低32位,你要申请的物理页内存的大小
LPCTSTR lpName                进程共享物理页的名字.如果希望这个物理页B进程可以使用则需要给一个名字.
返回值: 返回物理页句柄索引.

有创建物理页 也有打开物理页 主要是B进程使用.

  

HANDLE OpenFileMapping(  DWORD dwDesiredAccess,  // access mode
BOOL bInheritHandle, // inherit flag
LPCTSTR lpName // object name);

当然如果B进程使用一样可以使用CreateFileMaping. 只不过会返回文件对象已经存在的错误.

2.线性地址(虚拟地址) 关联物理页.

  上面申请了物理页.那么我们还需要将这个物理页映射到线性地址.需要的API如下.

LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // 物理页句柄
DWORD dwDesiredAccess, // 线性地址访问权限,注意跟物理页最好一直.或者比物理页更严格.
DWORD dwFileOffsetHigh, // 映射线性地址的偏移位置 高32位
DWORD dwFileOffsetLow, // 低32位
SIZE_T dwNumberOfBytesToMap // 内存映射结束位置;

3.取消关联

BOOL UnmapViewOfFile(  LPCVOID lpBaseAddress   // starting address);  虚拟地址

关闭物理页映射则使用CloseHandle. PS: 知识 引用计数-1. 为0了则会关闭.

具体代码如下.

A进程B进程一样. A进程写入. B进程写入.

  

// A.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Windows.h> int main()
{
getchar();
//A进程 申请物理页
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, , 0x1000, TEXT("共享内存")); //2.映射虚拟内存(线性地址的)
LPVOID lpBuf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, , , 0x1000); // A进程写内存
*(char *)lpBuf = 'a'; //写内存
printf("写入内存为a \r\n");
getchar(); UnmapViewOfFile(lpBuf);
CloseHandle(hMap);
return ;
}

B进程代码:

  

// A.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Windows.h> int main()
{
getchar();
//A进程 申请物理页
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, , 0x1000, TEXT("共享内存")); //2.映射虚拟内存(线性地址的)
LPVOID lpBuf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, , , 0x1000); // A进程写内存 printf("读取内存为 %c \r\n",*(char *)lpBuf);
getchar(); UnmapViewOfFile(lpBuf);
CloseHandle(hMap);
return ;
}

这样就实现了物理页共享.

Win3内存管理之私有内存跟共享内存的申请与释放的更多相关文章

  1. JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏

    摘要: 作者将自己常用的JavaScript模块分享给大家. 原文:JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏 作者:前端小智 Fundebug经授权转载,版权归原作者所有. ...

  2. C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针

    C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针 (1)开辟的内存没有释放,造成内存泄露 (2)野指针被使用或释放 (3)非法释放指针 (1)开辟的内存没有释放.造成内存泄露,以下的样 ...

  3. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  4. arm-linux内存管理学习笔记(1)-内存页表的硬件原理

    linux kernel集中了世界顶尖程序猿们的编程智慧,犹记操作系统课上老师讲操作系统的四大功能:进程调度 内存管理 设备驱动 网络.从事嵌入式软件开发工作,对设备驱动和网络接触的比較多. 而进程调 ...

  5. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检 ...

  6. [置顶] 内存管理一点也不神秘————手绘iOS内存管理细节

    今天给大家带来的一篇手绘风格博文<内存管理一点也不神秘> 每当我们程序执行alloc/new/copy/mutableCopy的时候,当我们执行release的时候,当我们执行retain ...

  7. Android内存管理(13)常见产生内存泄漏的原因

    1.集合类泄漏 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用.如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它), ...

  8. 内存管理,goto的使用,内存的申请和释放,mmap,ioremap

    1.内存管理 (将物理内存映射到内核空间(3G~4G)并使用)  深入内核: 伙伴系统 1.1基本概念    1)linux内核管理内存是以物理内存页为单位       一个物理内存页通常为4KB   ...

  9. Windows内存管理(1)--分配内核内存 和 使用链表

    1.      分配内核内存 Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约.和应用程序一样,局部变量是存放在栈空间中的.但栈空间不会像应用程序那么大,所以驱动程序不适合递归调用或 ...

随机推荐

  1. Oracle 中DATE类型的计算

    select sysdate,add_months(sysdate,12) from dual;        --加1年 select sysdate,add_months(sysdate,1) f ...

  2. SQLServer · 最佳实践 · 透明数据加密TDE在SQLServer的应用

    转:https://yq.aliyun.com/articles/42270 title: SQLServer · 最佳实践 · 透明数据加密TDE在SQLServer的应用 author: 石沫 背 ...

  3. Jmeter+ant集成接口测试报告

    一.jdk1.8下载及环境配置 1.1 下载地址 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-download ...

  4. 基于接口的 InvocationHandler 动态代理(换种写法)

    InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each p ...

  5. 重装win10+ubuntu 双系统 UEFI启动模式

    有较强的时效性!!先看一眼日期是否太古老! 任务 卸载双系统中的Ubuntu14,安装Ubuntu16 环境 操作系统: Win10 + Ubuntu14双系统 硬盘: 固态硬盘 + 机械硬盘,电脑的 ...

  6. Python 处理 json

    Python在处理json数据中有四个重要的函数:dump,load:dumps,loads. 序列化(dict 包装成 json文件) dump(转储):将字典dic对象 转化为 json文件 AP ...

  7. ASCII、Unicode、UTF-8以及Python3编码问题

    编码问题,其实的确是个很烦人的问题,一开始觉得不需要看,到后来出现问题,真的是抓狂, 而像我们这些刚刚涉及到这些问题的小白来说,更是无从下手,所以查阅资料,总结理解下各个概念以及Python3的编码问 ...

  8. c++实现对windwos 下socket 的封装(实现封包及拆包处理)

    SuperSocket.h #pragma once #include<string> #include<iostream> #include <WINSOCK2.H&g ...

  9. xmlhttprequest readyState 属性的五种状态

    关于readystate五个状态总结如下: readyState 状态    状态说明(0)未初始化此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备.值 ...

  10. Codeforces831C Jury Marks

    C. Jury Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...