糖炒栗子

cheap to talk,show muscle would be better...

导航

Windows内存结构

Windows内存结构:
1、  进程的虚拟地址空间
每个进程都有自己的私有内存地址空间,对于32位进程来说,这个地址空间是4GB,对于64位进程来说这个地址空间是16EB。当一个进程中的线程正在运行的时候,它只能访问该进程的内存空间,不能访问其他进程的内存。对于操作系统内存来说,他的内存也是隐藏的,在windows2000中的进程,其线程不可以访问操作系统的数据,而在windows98中,线程可以访问操作系统的数据。
2、  虚拟地址的分区
      每个进程都要将虚拟地址空间进行分区。其分区的依据是根据操作系统的基本实现来进行的。
(1)      NULL指针分配的分区
保护该分区,当试图存取这个分区的地址时会发生错误。当进行内存分配后会返回该分区的地址,当试图付值时会发生错误。
(2)      MSDOS/Windows16位应用程序兼容分区------仅适用于windows98
(3)      用户方式分区:这个分区是私有的,一个进程不能访问驻留在该分区的另一个进程的数据(但是可以在另外一个进程中获得该进程的句柄后,再对其内存进行操作)。它所占的地址空间不到2GB,只有在放开3GB开关的windows2000中,该地址空间为3GB
(4)      64kb禁止进入区域:
(5)      内核方式分区:这个分区是存放操作系统代码的地方。用于线程调度、内存管理、文件系统支持、网络支持和所有设备驱动程序的代码全部在这个分区加载。驻留在这个分区中的一切均可被所有进程共享。但是不能访问该分区中的内存地址。
Windows提供了三种内存管理的方法:
1、 虚拟内存:最适合管理大型对象或结构数组
2、 内存映射文件:最适合管理大型数据流(通常来自文件)和在单机上运行的多个进程之间共享数据
3、  内存堆栈:最适合管理大量的小对象。
一、虚拟内存:
在地址空间中保留一个区域,函数:Pvoid VirtualAlloc(PVOIDpvAdrress,  SIZE_T dwsize, DWORD AllocationType,DWORD fdwProtect)
回收虚拟内存和释放地址空间:
BOOL VirtualFree(PVOID pvAddress, SIZE_T dwsize, DWORDfreeType)
在这里何时回收物理内存是一个需要考虑的问题。
二、内存映射文件:
主要有三个作用:
1、 系统使用内存映射文件对exe和dll文件进行加载,这样可以大大节省程序启动时间和应用程序所需的页文件。
2、 使用内存映射文件来对磁盘上的文件进行访问,而不必对文件进行IO操作,也不必对文件内容进行缓冲
3、 使用内存映射文件来对同一台计算机上的多个进程之间进行共享数据
使用内存映射文件,必须执行以下步骤:
1、创建或打开一个文件内核对象,调用HANDLE CreateFile(…)
2、创建一个文件内核影射对象HANDLECreateFileMapping(hfile,…)
3、将文件数据映射到内存地址,PVOID MapViewOfFile(…)
4、从进程地址空间撤销文件数据的影像 BOOL UnMapViewOfFile(PVOIDpBaseAddress)
5、关闭文件映射对象和文件对象,否则会造成资源泄露的问题(可以把该步骤提前,以防止在别的地方运行代码时造成程序终止的情况)
伪码如下:
HANDLE hfile=CreateFile(…);
HANDLE hmapfile=CreateFileMapping(hfile,…);
CloseHandle(hfile);
PVOID pBaseAddr=MapViewOfFile(hmapfile,…);
CloseHandle(hmapfile);

UnmapViewOfFile(pBaseAddr);
在进程间使用内存映射文件进行数据共享:
1、  HANDLE hfile=CreateFile(.exe…)
2、 Hmap=CreateFileMapping(hfile,…,Name)
3、  MapViewOfFileEx(hmap,….)
在这里可对内核对象FileMapping进行命名,而后在其他进程中打开
    如果是内存映射,则CreateFileMapping(hfile,…)中hfile句柄为0xFFFFFFF,表示内存共享。

http://blog.csdn.net/metasearch/article/details/2148122

posted on 2011-11-30 17:06  糖炒栗子  阅读(1061)  评论(0编辑  收藏  举报