32位Windows内存相关

不管托管程序的内存管理先进到什么程度,程序员对内存的了解还是十分有必要的。虽然现在64位系统已经迅速普及,但还是有不少.NET系统跑在32位OS上,因此整理一下32位相关的内存概念:

 

  1. 所有 32 位应用程序都有4 GB的进程地址空间(二维虚拟地址空间);
  2. Windows下每个应用程序都有0~0X7FFFFFFF范围内低位2 GB的进程地址空间(private address space),其余0X80000000~0XFFFFFFFF范围内高位2G为OS保留,称为Kernel态地址空间,所有的进程包括OS共享2 GB Kernel寻址空间;
  3. /3GB,使用户态寻址空间扩大到3G,Kernel缩小到1G;
  4. /PAE,Physical Address Extension,作为Intel 32-bit架构的功能,可将物理内存(RAM)地址扩展到36位,即64G的寻址空间;PAE不改变虚拟寻址空间,仍然为4G.MSDN上的原文是:With PAE, the operating system moves from two-level linear address translation to three-level address translation. Instead of a linear address being split into three separate fields for indexing into memory tables, it is split into four separate fields: a 2-bit field, two 9-bit fields, and a 12-bit field that corresponds to the page size implemented by Intel architecture (4 KB). The size of page table entries (PTEs) and page directory entries (PDEs) in PAE mode is increased from 32 to 64 bits. The additional bits allow an operating system PTE or PDE to reference physical memory above 4 GB.
  5. /AWE,Address Windowing Extensions地址窗口化扩展插件,使 32 位应用程序能够寻址4G以上内存空间,最大支持64G物理内存,应用程序缓冲池和 AWE 映射内存之间的映射通过操作 Windows 虚拟内存表来完成;
  6. /3GB和/AWE或/PAE同时启用,将无法使用超过16G的物理内存。
  7. 虚拟内存,关键技术是重定义地址空间,而不是“用磁盘空间来扩展物理内存”。虚拟内存通过把地址空间定义为“连续的虚拟内存地址”使程序以为自己正在使用一大块“连续”的内存,而实际上,程序的物理内存是多个分隔开的物理内存碎片,有部分甚至暂时存储在磁盘上(这部分被称为交换空间),在需要时再进行数据交换。应用程序看到的这块连续内存的地址空间,大小是2的n次方,n为地址总线宽度。
  8. 虚拟内存交换数据的基本单位是页,Intel X86系统的分页大小是4KB,4G二维虚拟寻址空间被分为1M个页。
  9. 地址总线宽度决定了CPU可以访问的物理地址空间,简单地说就是CPU到底能够使用多大容量的内存,这里讨论的是32位。
  10. 物理内存的大小即其寻址空间的范围,这部分寻址空间是一维物理地址空间。物理地址空间往往没有4G,因此虚拟内存=物理内存+交换空间
  11. 页面文件pagefile.sys,Windows 当前用来设置默认页面文件大小的算法是:
    • 如果总物理 RAM 小于 2 GB,则将页面文件设置为 RAM 数量的 1.5 倍或 2 GB(取二者中较小者)。
    • 如果总物理 RAM 大于或等于 2 GB,则默认大小设置为 2 GB。

 

交换空间(Swap),主要是Linux系统的概念,“交换区”在磁盘上,它存储的是“已分配的虚拟内存页”。

一个进程虚拟内存页的加载流程大致是这样的:一旦用户进程一虚拟页需要被加载,则操作系统会在“交换区”中为该页分配一个页,一旦CPU访问的虚拟地址落入该页地址空间,则该页才被换入到物理内存中。在这个过程中虚拟页有多个状态,分别如下:

未分配的 - 进程虚拟页未得到加载指令,仍安静的待在磁盘上;

未缓存的 - OS为该进程虚拟页在交换区分配了一个空间,但是该虚拟页还未被引用;

已缓存的 - 该虚拟页被引用,被载入到物理内存中。

 

在支持虚拟内存机制的计算机中,CPU都是以虚拟地址形式生成指令地址或者数据地址的,而这个虚拟地址对于物理内存来说是不可见的,那么是谁来屏蔽这个差异的呢?答案是MMU(Memory Management Unit)。MMU负责将CPU发出的虚拟地址转换成相应的物理内存地址。MMU不是孤立工作的,OS为其提供了很好的支持,OS在物理内存中为MMU维护着一张全局的页表,来帮助MMU找到正确地物理内存地址。

 

Some frequently reported architectural limits in Windows include the following:

2 GB of shared virtual address space for the system (kernel)

2 GB of private virtual address space per process (user mode)

660 MB of system PTE storage (Windows Server 2003 and earlier)

470 MB of paged pool storage (Windows Server 2003 and earlier)

256 MB of nonpaged pool storage (Windows Server 2003 and earlier) 

 

Reference:

http://support.microsoft.com/kb/2160852/en-us/

http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm

http://support.microsoft.com/kb/268363/

http://support.microsoft.com/kb/268363/en-us/

http://support.microsoft.com/?id=913568

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值