内存
一、物理内存和虚拟内存
1、虚拟内存
- 每个程序都有4G虚拟内存,相当于空头支票
- 只有真正要用的时候,才会在物理内存中给你分配一块物理内存
- 4kb页式管理,一页是4kb大小(物理页)

2、虚拟内存地址划分

3、物理内存
- 内存条的大小(不一定能百分百识别全部大小,近似) + 虚拟内存(硬盘)
- 32位系统最多可以识别物理内存为64G,但由于操作系统的限制,比如XP,只能识别4G(Windows 2003服务器版本 可以识别4G以上)

二、私有内存申请和释放
1、申请
#include "stdafx.h"
int main(int argc , char* arvc[])
{
LPVOID p = VirtualAlloc(
NULL, // 要分配的内存区域的地址(一般为NULL)
1000*2, // 分配物理页的大小(按物理页的整数倍分,10进制4096,16进制1000)
MEM_COMMIT, // 分配的类型(MEM_RESERVE,占用虚拟地址,不需要物理内存,MEM_COMMIT,占用虚拟地址,也需要使用物理页)
PAGE_READWRITE // 该内存的初始保护属性(读写)
);
return ;
}
2、释放
#include "stdafx.h"
int main(int argc , char* arvc[])
{
LPVOID p = VirtualAlloc(
NULL, // 要分配的内存区域的地址(一般为NULL)
1000*2, // 分配物理页的大小(按物理页的整数倍分,10进制4096,16进制1000)
MEM_COMMIT, // 分配的类型(MEM_RESERVE,占用虚拟地址,不需要物理内存,MEM_COMMIT,占用虚拟地址,也需要使用物理页)
PAGE_READWRITE // 该内存的初始保护属性(读写)
);
VirtualFree(
p, // 区域地址
0x1000*2, // 物理页的大小,字节
MEM_DECOMMIT // 类型(MEM_DECOMMIT,虚拟地址保留,不保留物理页,MEM_RELEASE ,虚拟地址不保留,物理页也不保留)
);
return ;
}
3、malloc是从已经分配好的一块内存中挖出一块给自己用,本质上分配内存的不是它
三、共享内存申请和释放

A进程:
#include "stdafx.h"
#include "windows.h"
#define MapFileName "ZZZ"
#define BUFSIZE 0x1000
HANDLE g_hMapFile;
LPTSTR g_lpBuff;
int main(int argc, char* argv[])
{
//内核对象,创建物理页
g_hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 为INVALID_HANDLE_VALUE时,不与文件关联
NULL, // 安全描述符
PAGE_READWRITE, // 保护模式(读写的权限)
0, // 32位通常为空
BUFSIZ, // 物理页的大小
MapFileName // 指定文件映射对象的名字
);
//将物理页与线性地址进行映射,g_lpBuff就是虚拟内存地址
g_lpBuff = (LPTSTR)MapViewOfFile(
g_hMapFile, //句柄
FILE_MAP_ALL_ACCESS, //虚拟内存读写权限
0, //32位用不上
0, //从哪开始映射
BUFSIZ //物理页多大它就多大
);
DWORD eror = GetLastError();
*(PDWORD)g_lpBuff = 0x12345678;//往虚拟内存地址存值
printf("%p",g_lpBuff);
getchar();
//关闭映射,物理页的计数器只会减一
UnmapViewOfFile(g_lpBuff);
//关闭句柄
CloseHandle(g_hMapFile);
getchar();
return 0;
}
B进程:
#include "stdafx.h"
#include "windows.h"
#define MapFileName "ZZZ"
#define BUFSIZE 0x1000
HANDLE g_hMapFile;
LPTSTR g_lpBuff;
int main(int argc, char* argv[])
{
g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,MapFileName);
//将物理页与线性地址进行映射,g_lpBuff就是虚拟内存地址
g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);
printf("进程B:%x",*(PDWORD)g_lpBuff);
//关闭映射
UnmapViewOfFile(g_lpBuff);
//关闭句柄
CloseHandle(g_hMapFile);
getchar();
return 0;
}


浙公网安备 33010602011771号