关于CPU位数,OS位数以及内存大小关系的一点总结

(这个学期做助教,说来好惭愧啊,虽然我也是考研进来的,但是就在两年前复习的资料居然全部都忘光了。对大二的孩子们提问的问题多半都解决不了!!!越来越觉得自己的学习方法有问题了,总是想着一些知识能够根据自己多看几遍印象就深刻了,或者说每次记忆知识时总是想下次再记在脑海里吧!这样导致很多东西必须看资料才能想起来:啊原来是这样的,我看过啊,我知道的啊!这样的陋习一定要赶紧改正了,每次学习一个新的知识,都要记在脑海里,深刻地理解一下!!!)

1. CPU位数:一个时钟周期内处理器处理的二进制位数。

CPU位数 = CPU中寄存器的位数 = CPU一次并行处理的数据宽度

CPU为了实现其功能一般设计了指令集,即是CPU的全部指令,这就是机器语言。计算机的所有功能都是基于CPU的指令集。

如Intel 8086 CPU 是16位,其指令集也是16位。如Intel 80386DX CPU 是32位,其指令集也是32位,但它也保持原16位指令集,这是为了向上兼容。

2. 操作系统位数

操作系统位数 = 其所依赖的指令集位数 <= CPU位数

操作系统位数对CPU位数有向上兼容,如32位CPU上运行16操作系统,64位CPU上运行32位操作系统等情况。

3. 内存容量与操作系统位数的关系。(有种说法是:32位操作系统最大只能支持4G内存)

在使用计算机时,其支持的最大内存是由操作系统硬件两方面决定的。

在早期的PC机中,采用的是三总线结构:数据总线,地址总线和控制总线。分别来实现不同的功能:数据总线用来传输数据,地址总线用来传输地址,控制总线用来传输一些控制信号。但在现在的PC机中,一般使用了总线复用功能。如在PCI总线中,地址总线和数据总线总是分时复用的(也就是说假如PCI总线有32为数据总线,这32位数据总线在某个时刻传输数据,在下一个时刻却用来充当地址总线的作用)。

回顾了关于总线的一点知识后,先来说硬件方面对内存容量的控制作用。

在计算机中地址总线的数目决定了CPU的寻址范围,这种由地址总线对应的地址称为 物理地址

先说一下硬件方面的因素,在上面已经提到了地址总线,在计算机中 CPU的地址总线数目 决定了CPU 的寻址范围,这种由地址总线对应的地址称作为物理地址。假如CPU有32根地址总线(一般情况下32位的CPU的地址总线是32位,也有部分32位的CPU地址总线是36位的,比如用做服务器的CPU),那么提供的可寻址物理地址范围 为 232=4GB(在这里要注意一点,我们平常所说的32位CPU和64位CPU指的是CPU一次能够处理的数据宽度,即位宽,不是地址总线的数目)。自从64位CPU出现之后,一次便能够处理64位的数据了,其地址总线一般采用的是36位或者40位(即CPU能够寻址的物理地址空间为64GB或者1T)。CPU访问任何存储单元必须知道其物理地址。

再说说物理地址,线性地址,逻辑地址的关系:

1) 物理地址(Physical Address): 刚刚讲过了,由CPU地址总线的位数决定。

2) 线性地址(Linear Address): 如果没有开启分页机制,线性地址就等于物理地址。如果开启了分页机制,线性地址到物理地址需要经过二级地址转换。线性地址可以很大,但最终要运行在物理地址上,而缺页机制和进程挂起等,就是为了让远比物理内存大的程序,运行在如此小的物理内存中。在网上看到一个例子,生动又形象:好比公交车上让座,假设座位是内存,其他站立空间是硬盘,刚上车的时候你很高兴,你和你女朋友(进程A,B)都有座位(进入内存),如果此时,有个孕妇上车了,售票员大姐(操作系统)发现了,"孕妇优先",于是开始问"谁给孕妇让个座啊"(进程调度),不过很不幸,这个系统是非抢占式的,孕妇(进程S)只好等待,作为一个有理想有道德的程序猿(优先级低),当仁不让,自己站了起来了(进程挂起),操作系统一看,有个家伙把座椅(内存)释放出来了,于是排队等候的孕妇就坐到了你原来的位置,你切换到公交地板上(硬盘)。车到某站,孕妇下车了,于是你重新坐上座位(内存占有),在公家车的整个运营过程中,座位(内存)是有限的,而人不不断上下,所以人上来首先站在车厢内,然后根据各种成文的,不成文的规矩,占有或者释放内存(座位)。座位是有限的,而人相对来说是无限的,怎么利用有限的资源,服务更多的进程,这或许是操作系统应该考虑的。

3) 逻辑地址(Logical Address): 指分段机制提供的地址,由段部分和一个便宜部分构成。段机制是虚拟地址到线性地址的基础。线性地址 = 段基址 + 偏移地址。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。

这三种地址关系为,逻辑地址经过段式映射(Segmentation Translation)到线性地址线性地址经过页面映射(Page Translation)后,得到物理地址

言归正传,再说说操作系统对内存容量的控制作用。

在上面中有提到,用户使用计算机时,直接操纵的只能是逻辑地址,要经过操作系统的转换后才能变换为物理地址。如对于32位的操作系统而言,其逻辑地址编码采用的地址位数是32位,那么操作系统所提供的逻辑地址寻址范围为:232 = 22 * 230 = 4GB(所以在32位CPU和32位的操作系统中,最大支持的内存为4G)。但是理论上是4G的内存,在我们真正使用时并不到4G,大约只有3.2G左右。这是因为在intel x86架构下,采用的是内存映射技术(Memory-Mapped I/O, MMIO),也就说将4GB逻辑地址中一部分要划分出来与BIOS ROM、CPU寄存器、I/O设备这些部件的物理地址进行映射,那么逻辑地址中能够与内存条的物理地址进行映射的空间肯定没有4GB了。

参考文献:

【1】http://blog.csdn.net/ray_zhang_3/article/details/5447140

【2】http://www.cnblogs.com/dolphin0520/archive/2013/05/31/3110555.html

【3】http://bbs.51cto.com/thread-1089741-1.html

【4】http://blog.csdn.net/macrossdzh/article/details/5954763

【5】http://laoxu.blog.51cto.com/4120547/1166661

【6】http://ilinuxkernel.com/?p=414

【7】http://blog.csdn.net/linpeng12358/article/details/41450805

时间: 2024-12-27 16:52:37

关于CPU位数,OS位数以及内存大小关系的一点总结的相关文章

如何获取 Android 设备的CPU核数、时钟频率以及内存大小

因项目需要,分析了一下 Facebook 的开源项目 - Device Year Class. Device Year Class 的主要功能是根据 CPU核数.时钟频率 以及 内存大小 对设备进行分级.代码很简单,只包含两个类: DeviceInfo -> 获取设备参数, YearClass -> 根据参数进行分级. 下表是 Facebook 公司提供的分级标准,其中 Year 栏表示分级结果. Year Cores Clock RAM 2008 1 528MHz 192MB 2009 n/

ubuntu系统AndroidStudio修改内存大小

位于android-studio/bin目录下的studio64.vmoptions和studio.vmoptions文件. 把Xms,Xmx,-XX:MaxPermSize,-XX:ReservedCodeCacheSize分别修改大一些,根据电脑内存大小分配大一点就可以了. 1.studio64.vmoptions文件 -Xms512m-Xmx2048m-XX:MaxPermSize=1024m-XX:ReservedCodeCacheSize=1024m-ea-Dsun.io.useCan

ubuntu系统AndroidStudio改动内存大小

位于android-studio/bin文件夹下的studio64.vmoptions和studio.vmoptions文件. 把Xms,Xmx,-XX:MaxPermSize.-XX:ReservedCodeCacheSize分别改动大一些.依据电脑内存大小分配大一点就能够了. 1.studio64.vmoptions文件 -Xms512m-Xmx2048m-XX:MaxPermSize=1024m-XX:ReservedCodeCacheSize=1024m-ea-Dsun.io.useCa

KVM主机动态更改cpu数量和内存大小

关机状态下设置最大cpu颗数和最大内存使用量: # virsh list --all  Id    Name         State ------------------------------------------------- -     bbotte       shut off      # virsh setvcpus bbotte --maximum 4 --config # virsh setmaxmem bbotte 1048576 --config 用virsh命令调整c

不同编译器下的基本数据类型所占的内存大小

基本数据类型 所占的 存储空间 本篇文章主要介绍了"基本数据类型 所占的 存储空间",就是所占的内存大小,常见的基本数据类型包括int,long int,char,float,double float等. C语言各种数据类型及其在系统中占的字节和取值范围 C语言包含5个基本数据类型: void, int, float, double, 和 char. (另:C++ 定义了另外两个基本数据类型: bool 和 wchar_t.  一些基本数据类型能够被 signed, unsigned,

【转载】Android Studio 设置内存大小及原理

http://www.cnblogs.com/justinzhang/p/4274985.html http://tsroad.lofter.com/post/376316_69363ae Android studio 1.0.2默认最大内存是750M,这样跑起来非常的卡,难以忍受,机器又不是固态硬盘,最后发现,这个默认值是可以修改的,在android studio目录下找到:studio64.exe.vmoptions文件,绿色部分为修改的参数(-Xmx1050m),将默认参数修改为1050M

【翻译自mos文章】怎么检查服务器主板BIOS支持的最大内存大小?

怎么检查服务器主板BIOS支持的最大内存大小? 来源于: How to check Maximum Supported Memory by Motherboard Bios (文档 ID 1680534.1) 适用于: Linux OS - Version Oracle Linux 5.0 to Oracle Linux 6.5 [Release OL5 to Ol6U5] Linux x86-64 Linux x86 目标: 获得服务器主板BIOS支持的最大内存大小 解决方案: 简单的dmid

内存大小设置 Java heap space错误(finereport报表)

1. 问题描述 当从数据库中查询大量的数据,每个模板取出来几百万条数据,或者是频繁的刷新项目.模板时就会占用Java虚拟机JVM的大量内存,超过内存就会出现报java.lang.OutOfMemoryError:Java heap space内存一处的错误,具体报错如下: 2. 原因 由于服务器的JVM不够用而抛出的错误,JVM在启动的时候会自动设置Heap size的值,初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.所以可以根据自己的情况进行修改JVM的-

在MyEclipse/eclipse修改jvm内存大小

修改MyEclipse/eclipse文件夹中配置文件eclipse.ini中的内存分配就哦了  ===================================  一般的ini文件设置主要包括以下几项: -vmargs -Xms40m -Xmx256m -XX:PermSize=64M -XX:MaxPermSize=128M 以下解释其意思. -vmargs:说明后面是VM的参数 -Xms40m:虚拟机占用系统的最小内存 -Xmx256m:虚拟机占用系统的最大内存 -XX:PermSi