系统和进程获取内存的理解

来源:互联网 发布:实况足球2018球员数据 编辑:程序博客网 时间:2024/06/12 23:41

1.为什么有些32位的系统可以使用超过4g 的内存呢?

  32位代表物理地址寻址能力,就是2的32次方,刚好4G Byte,所以32位的操作系统不能访问4G以上的物理地址空间。这里没有说内存地址,因为系统不只与内存打交道,还有很多其他软件硬件设备,要与这些设备交换数据,也需要占用物理地址空间。每个设备需要多少物理地址空间,是由设备本身和驱动程序决定的。
  为了解决这个问题推出了PAE技术(Page Address Extension):
  初是为了弥补32位地址在PC服务器应用上的不足而推出的。我们知道,传统的IA32架构只有32位地址总线,只能让系统容纳不超过4GB的内存,这么大的内存,对于普通的桌面应用应该说是足够用了。可是,对于服务器应用来说,还是显得不足,因为服务器上可能承载了很多同时运行的应用。PAE技术将地址扩展到了36位,这样,系统就能够容纳2^36=64GB的内存。同时,PAE技术的提出,也是为了解决在PSE技术中,大物理页面必须为4MB的限制。我们知道PSE和PSE-36技术虽然满足了部分应用对大内存页面的需要,但是,从4KB到4MB的跳跃显得太大了一些,现有的操作系统和应用对这种大页面的采用势必会导致严重的页面内碎片,从而浪费内存。PAE技术在Pentium Pro以及以后的CPU中实现,AMD公司也在Athlon以及以后的CPU中普及了这一技术。
  也就是说需要CPU 支持PAE 技术,系统才可以使用PAE 技术来拓展系统可以使用的总内存大小.
  例如这个系统就使用了PAE 技术 Linux local190 2.6.18-194.el5**PAE** #1 SMP Fri Apr 2 15:37:44 EDT 2010 i686 i686 i386 GNU/Linux
  上面所说的是系统可以超过4g 的内存,但是32 位的进程所能使用的内存最大依然是4g。但是整个系统可以给多个不同程序分配大内存,加起来系统就可以使用超过4g 内存。
  

2.进程获取的内存是系统分配的吗?最大的限制是?

  第一部分:
  由于进程属于操作系统范围的概念,而操作系统主要做的是对硬件资源的管理与控制,所以是一般是由操作系统和其管理/控制的硬件共同来决定的。
  第二部分:
  先从硬件来看:主要看硬件所能支持的寻址空间有多大,寻址空间主要看的是地址总线的位数。比如:32位PC机器,它的地址总线也是32位,可寻址空间为2的32次方(4G)。不过这只是最简单的理解。像X86系列的CPU,有实模式和保护模式之分,实模式是为了兼容以前老的8086CPU,在该模式下只能使用只有2的20次方(1M)的寻址空间。保护模式则可以有正常的4G寻址空间。在奔腾Pro系列以及之后的CPU还添加了PAE功能,它能够在32位基础上实现更大的寻址空间。(如果想深入了解,请搜索上面的加粗词语。)再从操作系统来看:a. 不提供虚拟内存:在这种情况下,操作系统暴露给进程的就是硬件级别的寻址,进程中指定的任何内存地址都是真实的地址。那么此时,进程所能分配的最大内存就是硬件所能支持的最大内存。b. 提供虚拟内存:为了解决程序运行时的占用内存大于机器实际内存、多进程下的进程保护等等问题,操作系统会抽象出一个虚拟内存来给进程使用,进程中指定的任何内存地址都是逻辑地址,会经过(操作系统+硬件)转换为真实的地址。此时进程所能分配的最大内存是由操作系统和硬件共同来决定的。但上面说到进程中指定的任何内存地址都需要经过转换成真实地址,那么这种频繁操作几乎是不可能在操作系统这一层级实现的,所以大部分情况下还是为硬件所能支持的最大内存。但是操作系统能够控制分配给某个进程的虚拟内存最大的大小,硬件能够支持4G,但我操作系统就允许你用1G的虚拟内存,你能耐我何。

参考:
知乎问题

0 0
原创粉丝点击