内存储器
一、物理内存和虚拟内存
1、虚拟内存
每个程序都有4G虚拟内存,相当于一张空头支票。
只有真正需要的时候,才会在物理内存中分配给你一块物理内存。
4kb页面管理,一个页面是4kb(物理页面)
2、虚拟内存地址划分
3、物理内存
记忆棒的大小(不一定100%能识别所有大小,大概)虚拟内存(硬盘)
32位系统可以识别64G的最大物理内存,但由于操作系统的限制,比如XP,只能识别4G(Windows 2003服务器版本可以识别4G以上)
二、私有内存申请和释放
1、申请
#包含' stdafx.h '
int main(int argc,char* arvc[])
{
LPVOID p=VirtualAlloc(
空,//要分配的内存区域的地址(通常为空)
1000*2,//分配物理页面的大小(除以物理页面的整数倍,十进制4096,十六进制1000)
MEM_COMMIT,//分配类型(MEM_RESERVE,占用虚拟地址,不需要物理内存,mem _ commit,占用虚拟地址,也需要使用物理页面)
PAGE_READWRITE //该内存的初始保护属性(读和写)
);
返回;
}
2、释放
#包含' stdafx.h '
int main(int argc,char* arvc[])
{
LPVOID p=VirtualAlloc(
空,//要分配的内存区域的地址(通常为空)
1000*2,//分配物理页面的大小(除以物理页面的整数倍,十进制4096,十六进制1000)
MEM_COMMIT,//分配类型(MEM_RESERVE,占用虚拟地址,不需要物理内存,mem _ commit,占用虚拟地址,也需要使用物理页面)
PAGE_READWRITE //该内存的初始保护属性(读和写)
);
VirtualFree(
p,//区域地址
0x 1000 * 2//物理页面大小,字节
MEM_DECOMMIT //类型(MEM_DECOMMIT,保留虚拟地址,不保留物理页面,MEM _ RELEST,不保留虚拟地址,不保留物理页面)
);
返回;
}
3、malloc是从已经分配好的一块内存中挖出一块给自己用,本质上分配内存的不是它
三、共享内存申请和释放
一个过程:
#包含' stdafx.h '
#包括“windows.h”
#定义映射文件名' ZZZ '
#定义BUFSIZE0x1000
HANDLE g _ hMapFile
LPTSTR g _ lpBuff
int main(int argc,char* argv[])
{
//内核对象,创建物理页面
g_hMapFile=CreateFileMapping(
INVALID _ HANDLE _ VALID,当//是INVALID _ HANDLE _ VALID时,它不与文件相关联。
空,//安全描述符
PAGE_READWRITE,//保护模式(读写权限)
0,//32位通常为空。
物理页面的大小
MapFileName//指定文件映射对象的名称。
);
//用线性地址映射物理页面,g_lpBuff为虚拟内存地址。
g_lpBuff=(LPTSTR)MapViewOfFile(
G_hMapFile,//句柄
FILE_MAP_ALL_ACCESS,//虚拟内存的读写权限
0,//不使用32位。
0,//从哪里开始映射?
BUFSIZ////物理页面有多大就有多大。
);
DWORD eror=GetLastError();
*(PDWORD)g _ LPbuff=0x 12345678;//将值保存到虚拟内存地址
printf('%p ',g _ lpBuff);
getchar();
//关闭映射,物理页面的计数器只会减少一。
unmapviewofile(g _ lpBuff);
//关闭手柄
close handle(g _ hmap file);
getchar();
返回0;
}
b .进程:
#包含' stdafx.h '
#包括“windows.h”
#定义映射文件名' ZZZ '
#定义BUFSIZE0x1000
HANDLE g _ hMapFile
LPTSTR g _ lpBuff
int main(int argc,char* argv[])
{
g _ hmap file=createfile mapping(INVALID _ HANDLE _ VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,MapFileName);
//用线性地址映射物理页面,g_lpBuff为虚拟内存地址。
g _ lpBuff=(LPTSTR)MapViewOfFile(g _ hmap FILE,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);
Printf ('process B:%x ',*(PDWORD)g _ lpBuff);
//关闭映射
unmapviewofile(g _ lpBuff);
//关闭手柄
close handle(g _ hmap file);
getchar();
返回0;
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/157183.html