`
ihyperwin
  • 浏览: 425676 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

限制内存使用的因素

 
阅读更多
一个系统的内存大小限制取决于CPU和操作系统,当然啦,也受限于物理硬件,比如主板、安装了多大的内存条等等。

众所周知,32位的Intel CPU能够支持4G的物理内存,打开PAE后(有36根地址线)可以支持64G的物理内存。对于Linux而言,一个进程空间的大小为4G,其中用户空间可以使用3G。

那么64位系统呢?

理论上讲,64位的地址总线可以支持高达16EB(2^64)。EB是什么概念,我也不晓得。K->M->G->T->P->E

    The emergence of the 64-bit architecture effectively increases the memory ceiling to 2^64 addresses, equivalent to approximately 17.2 billion gigabytes, 16.8 million terabytes, or 16 exabytes of RAM.
    From: http://en.wikipedia.org/wiki/64-bit#History

但实际上,这么大的地址空间对于目前的形式而言绝对是浪费了。

AMD64架构支持52位(4PB)的地址总线和48位(256TB)的虚拟地址空间。

    The AMD64 architecture has a 52-bit limit on physical memory and currently only supports a 48-bit virtual address space[1]. Still, that represents 4 petabytes and 256 terabytes respectively.
    From: http://en.wikipedia.org/wiki/64-bit#Limitations

64位的Linux则分别支持46位(64TB)的物理地址空间和47位(128T)的进程虚拟地址空间。

    64-bit Linux allows up to 128 TiB (140,737,488,355,328 bytes) of address space for individual processes, and can address approximately 64 TiB (70,368,744,177,664 bytes) of physical memory, subject to processor and system limitations.
    From: http://en.wikipedia.org/wiki/X86-64#Linux

即便这样,在目前的应用下也绝对够用了。



windows

简单的说x86代表32位操作系统 x64代表64位操作系统。如果你的CPU是双核以上,那肯定支持64位操作系统了。如果你的电脑内存大于4G,那就要用64位的系统了,因为32位的Windows 7也好,Vista也好,最大都只支持3.25G的内存。而64位的windows 7最大将支持128G的内存。
_________________________________________________________________________________________________


PS:有很多人有误区,甚至包括一些计算机老师,比如认为32bit平台因为2^32=4G所以认为不能使用超过4G内存,然而接受这样的观点后很多人会对为何使用4G内存在系统中只显示3.25G有所疑问。网上也有很多相关文章专门谈这个问题,但是其中有不少错误的认识,而且条理不清。故撰此文,以尽可能简单的解释来清楚地解释这些问题。

程序使用内存到底能用到多大,跟CPU、内存控制器、操作系统、程序、主板都有关,其中支持内存最小的一个就是瓶颈。

CPU:能用到多大和CPU的位数没有直接关系。因为CPU的位数,即通用寄存器的宽度并不等于地址总线的宽度。比如8086,16bit通用寄存器但地址总线是20bit(=1MB);P6架构虽然是32bit的,但其外部地址总线为36bit,寻址范围已经到了2^36=64G了;x86-64的AMD CPU,内存寻址范围是48bit(256T),没有达到64bit,虽然理论上能到但实际上没能实现2^64的寻址范围。所以一般来说CPU不是瓶颈,注意若在32bit系统下实现36bit寻址需要通过PAE(Physical Address Extension)。

主板:取决于主板有多少槽和芯片组最大支持容量。

内存控制器:如果是K8及之后的,因为集成内存控制器,所以是CPU负责,这一般没有问题,可达48bit。而对于intel CPU由芯片组负责,老的芯片组比如945就只能支持32bit寻址即4G,这就需要新的芯片组,如965系列寻址空间达到36bit,但实际最大支持8G。服务器芯片组一般实际支持得比较大,寻址空间一般为36/38bit。

操作系统:windows操作系统如果是64bit的,至少支持8G,无需PAE,目前支持容量最高的数据中心版本可支持2T,用的是44bit寻址(16T)但没有全开放。如果是32bit版本,XP和Vista任何版本皆最多4G,因为都不支持PAE。若用server版本,都支持PAE,可以超过4G,最强Datacenter版可达128G。

程序:对于32bit windows系统,无论真正可用内存有多大,用户模式的程序最大只能分配2G虚拟内存,其它部分由系统核心调用。用了4GT即4GB内存调优技术,可分配最大3G,仅server版支持,启动时加/3GB即可。如果程序设计时使用AWE API集而且系统支持PAE,寻址范围可以扩至64GB。另外驱动也必须合适,比如一些老驱动程序在大内存下不能正常工作。在64bit windows下,用户模式的程序直接就可以访问8T空间。

总之,若在32bit平台下使程序能够调用超过4G内存,需要windows server版系统+合适的芯片组+槽多的主板+合适的程序。如果只有普通的32bit程序,大内存至少可以减少不同程序虚拟内存间的抢占,让每个程序都获得尽可能大的虚拟内存,尽管上限仍是2G。


另一个问题:4G内存时,发现可见内存被吞掉750MB或者更多,是因为一些设备固定占据挨着并且低于4GB位置的一段空间,称为MMIO(PCI内存占其中很大部分),这是内存控制器将这些设备映射到这个地址实现的,好处是系统可以方便快速地通过内存地址来访问这些设备,但原来在这个部位的物理内存就访问不到了,很浪费,也叫memory hole,尤其是GPU越多占得越多。解决方法就是用内存重映射(Memory Remapping),内存控制器把这个部位的内存地址映射到4G位置后面的一段空间,然后将这样转化过的地址告诉CPU,这样CPU用大于FFFFFFFF的地址就可以访问到原本被MMIO覆盖的内存空间,就不会浪费了。

使用内存重映射,若是32bit操作系统的话必须支持PAE,否则高于4G的映射空间还是访问不了,不同操作系统对重映射支持也不同,server版比较好。芯片组必须支持重映射并且开启(对于A64及以后的是在CPU内的内存控制器实现),至少680i、955X、965系列及以上或者是服务器芯片组,如果主板BIOS没有相应选项而且默认是关闭的就不行。

对于XP,系统属性-常规下面显示的就是此时相对于操作系统全部能使用或者说可见的内存空间,不包括MMIO部分。注意对于Vista SP1,插了多少内存就显示多大,即使实际上根本不能全部利用。

_________________________________________________________________________________________
首先说软件方面
主要是操作系统的责任
其实像XP 32bit这样的操作系统设计上是支持4GB内存的(32bit版本XP最高支持4GB内存)
但是在整个IA32系统上位于4GB以下的内存地址在系统中被分为很多块(4GB到64GB同样被划成多块但不是这里需要讨论的)
其中主要包括了系统可用内存及PCI设备内存地址范围
操作系统中显示内存不足4GB的主要原因来源于系统地址中PCI设备的内存地址范围
这个范围是以256为基础成倍设定的
该PCI设备地址范围包括了系统BIOS/芯片组/IO/PCI区域/VGA等等等等
这些设备都是通过实际内存地址来通信的
该类地址被定义为内存映射IO空间(MMIO)
由于MMIO地址所占用的就是4GB系统地址中部分物理内存所对应的地址
此时被其占用的对应地址的原物理内存部分就完全无效了
这就是软件方面大多32bit Windows操作系统为什么在使用4GB内存时只能看见3到3.25GB的罪魁祸首

然后是硬件方面
在物理内存槽中镶着4GB内存的时候正好包含到系统地址中第一个PCI设备地址范围(MMIO)
正如上面操作系统所要求的
对MMIO的寻址部分被内存控制路由到对应的设备上
而这些设备使用的地址正是4GB系统地址中对应物理内存地址的一部分
此时它所对应的应该是实际物理内存的那部分地址就没有了(被MMIO取代)
附和操作系统来完成这一罪恶行径的正是内存控制器

那么失踪的内存还有没有办法捞回来呢
答案是肯定的
需要说明的是捞回这部分内存有前提条件
同样要从软硬件两方面下手

软件方面
NT核心的操作系统所要完成的是对PAE的支持和4GB内存调整优化
而后支持PAE的操作系统会通过AWE使每个程序的虚地址范围可以突破2GB的限制最高到64GB(64bit操作系统暂无此类问题)
那么操作系统方面解决问题的关键在于支持PAE
Win2000开始微软的操作系统基本都支持PAE
4GB内存调整优化通过/3G启动参数来启用(本质上还是对PAE的支持)

硬件方面
要捞回这部分内存就是要将这些被MMIO占用的系统地址重新被路由到对应的内存上
为了解决这个问题引入了一种叫内存重映射(Memory Remapping)的技术
Memory Remapping技术最早是在服务器上使用的
在内存重映射启动后CPU要使用这部分被MMIO占用的物理内存时会通过PAE向高于4GB的空间寻址
此时CPU自身并不具备鉴别哪些是MMIO哪些是重映射的部分的能力
需要内存控制器将其重新转换到实际物理内存上
由此才能捞回那部分失踪的内存
这个累活完全是属于内存控制器独享的(自作自受)

那么只要你使用的是Win2000之后的操作系统
能否捞回它们的关键就在于是否支持内存重映射技术(Memory Remapping)
换句话来说
如果你用的是Intel系统那就需要确定你主板北的桥芯片是否支持Memory Remapping(Intel目前将内存控制器集成在北桥芯片中)
如果你用的是AMD的系统的话那么就需要先确定你的CPU是否支持Memory Remapping(AMD目前设计的内存控制器集成在CPU中)
从掌握的资料来看Intel支持该技术的桌面芯片组是i955X之后的所有支持8GB内存的型号
AMD支持该技术的桌面CPU为Athlon 64(不含闪龙)以上支持8GB内存的型号
同时我们必须在BIOS内打开Memory Remapping的选项才能正式开始捞回失踪的内存
分享到:
评论

相关推荐

    深度学习中的内存管理问题研究综述

    加速设备有限的内存空间已经成为限制神经网络模型快速发展的重要因素,如何在深度学习中实现高效的内存管理成为深度学习发展的关键问题。为此,介绍了深度神经网络的基本特征;分析了深度学习训练过程中的内存瓶颈;...

    LINUX 24学时教程

    7.3.2 使用高内存效率的rxvt终端程序 111 7.4 学习X11基本操作 112 7.4.1 使用X11客户程序的窗口尺寸 设置参数 112 7.4.2 为X11客户程序设置背景和 前景颜色 113 7.4.3 设置X11客户程序的资源 113 7.4.4 改变X11中...

    PowerOJ 是 ACM/ICPC 或 OI 的在线评委

    评测用户代码的过程需要考虑多方面因素,包括时间限制、内存限制、输出格式等。如果用户的代码在规定的时间内能够正确输出符合要求的结果,并且满足内存限制,那么评测结果通常会被认为是正确的。否则,系统会返回...

    中位数问题分析 .doc

    本文提供了一种从大量无序整数中寻找中位数的方法。由于是通过整数的长度和整数的各个位上的值,来...使用的内存很少,可以控制在k级,并且基本不受整数数目的影响。对文件的扫描次数小于等于(1+目标整数位数)。

    使用无线传感器网络进行温室检测的限制-研究论文

    由于电池,处理器和内存不足等资源的限制,他们开展协作活动。 如今,无线传感器网络的应用是多种多样的,并且在农业中的应用仍处于萌芽状态。 WSN的一种吸引人的应用是在环境监测和温室中,其中植物条件(如气候和...

    数字图像处理-Matlab-车牌识别

    由于受到运算速度及内存大小的限制,以往的⻋牌识别大都是基于灰度图象处理的识别技术。首先要求正确检测出⻋牌区域,如通过Hough变换以检测直线来提取⻋牌边界区域、使用灰度分割及区域生⻓进行区域分割,或使用...

    Siebel 性能微调指南 (中文版)

    AOM 中的内存使用项 28 为 AOM 配置数据库连接组合 29 关于 AOM 的数据库连接 29 数据库连接组合的使用准则 30 为缺省的数据库连接配置组合 32 为专用的数据库连接配置组合 34 为 AOM 使用线程组合 35 第 4 章:调节...

    【卷一/共两卷】AJAX实战pdf高清版90M

    8.4.3 结果:如何将内存使用量缩减150倍 8.5 小结 8.6 资源 第四部分 Ajax实例研究 第9章 动态双组合功能 9.1 双组合脚本 9.1.1 客户端解决方案的局限性 9.1.2 服务器端解决方案的限制 9.1.3 基于Ajax的解决方案 9.2...

    SQLServer2008查询性能优化 2/2

    2.5.6 在32位SQL Server中使用4GB以上内存 28 2.6 磁盘瓶颈分析 29 2.6.1 磁盘计数器 30 2.6.2 % Disk Time 30 2.6.3 Current Disk Queue Length 31 2.6.4 Disk Transfers/sec 31 2.6.5 Disk Bytes/sec 32 ...

    SQLServer2008查询性能优化 1/2

    2.5.6 在32位SQL Server中使用4GB以上内存 28 2.6 磁盘瓶颈分析 29 2.6.1 磁盘计数器 30 2.6.2 % Disk Time 30 2.6.3 Current Disk Queue Length 31 2.6.4 Disk Transfers/sec 31 2.6.5 Disk Bytes/sec 32 ...

    mysql数据库优化必会的几个参数中文解释

    3:cpu.cpu处理内存中的数据,当有相对内存较小的表时,这是最常见的限制因素. 4:内存的限制.当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈—不过现在内存大的惊人,一般不会出现这个问题. 第二步:...

    java并发编程教程源码

    并发编程的意义及影响多线程的因素 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。 影响多线程运行速度的原因有线程创建开销、上下文切换、死锁,以及硬件和软件...

    服务器与系统维护.docx

    如果服务器需要扩容内存,则在增加内存前需要考虑以下( )因素。 A 同一品牌 B 同一规格 C 是否带ECC校验 D 相同大小 正确答案: A B C 12. 在windows系统安全配置中,以下属于帐号安全配置的是( ) A 禁用guest...

    autosar全面学习笔记.docx

    2.技术驱动因素 2 3.AP的特点 3 4.经典、自适应和非AUTOSAR ECU的集成 4 1.逻辑视图 5 2.物理视图 7 3.方法论和Manifest 8 5.应用设计 10 6.执行Manifest 10 7.服务Instance Manifest 11 1.概述 11 3.调度 12 4.内存...

    windowsnt 技术内幕

    备份磁带集的循环 理解备份记录和存储循环 设置备份选项 使用Windows NT备份恢复数据 为一次计划好的备份工作创建一个备份脚本文件 使用AT命令调度一次备份 NT备份程序在并行设备上的使用 Windows NT虚拟内存模型...

    CUDA并行程序设计 GPU编程指南

    CUDA并行程序设计:GPU编程...第9章详述CUDA编程性能限制因素、分析CUDA代码的工具和技术。第10章介绍编程实践中的库与软件开发工具包。第11章讲解如何设计基于GPU的系统。第12章总结CUDA应用中易犯错误以及应对建议。

    浅析轻量级设计模式

    由于成本下降让我们使用起来没有了限制,移动设备每天都在增加,而它们仍然存在内存约束。假设你创建一个宇宙地图项目,你需要给每个星星创建对象,你想想,这个需要多少内存,GoF在他们的书里给了一个例子。如果在...

    CUDA并行程序设计:GPU编程指南

    本书是CUDA并行程序设计领域最全面、最详实和最具权威性的著作之一,由CUDA开发者社区技术总监亲自撰写,英伟达中国首批CUDA官方认证工程师翻译,详实地...第9章详述CUDA编程性能限制因素、分析CUDA代码的工具和技术。

Global site tag (gtag.js) - Google Analytics