虚拟地址空间、CPU的数据处理能力、编译模式

虚拟地址空间、CPU的数据处理能力、编译模式

所谓虚拟地址空间,就是程序可使用的虚拟地址有效范围。虚拟地址和物理地址的映射关系由操作系统决定,相应的,虚拟地址空间的大小也由操作系统决定,但还会收到编译模式的影响。

我们先说说CPU,再看看编译模式,来了解编译器是如何配合CPU来提高程序运行速度的。

CPU的数据处理能力

CPU是计算机的核心,决定了计算机的数据处理能力和寻址能力,也即决定了计算机的性能。CPU一次(一个时钟内)能处理数据的大小由寄存器的位数和数据总线的宽度(也就是由多少根数据总线)决定,我们通常所说的多少位CPU,除了可以理解为寄存器的位数,也可以理解为数据总线的宽度,通常他们是相等的。

数据总线位于主板之上,不在CPU中,也不由CPU决定,严格来说,这里应该说CPU能够支持的数据总线的最大根数,也就是能够支持的最大数据处理能力。为了表达方便,才说是“CPU的数据总线”。

数据总线和主频都是CPU的重要指标:数据总线决定了CPU单次的数据处理能力,主频决定了CPU单位时间内数据处理次数,他们的乘机就是CPU单位时间内数据处理量。

我们常常听说,CPU主频在计算机的发展过程中飞速提升,从最初的几十KHz,到后来的几百MHz,再到现在的4GHz等,终于因为硅晶体的物理特性很难提升,只能向多核方向发展。在这个过程中,CPU数据总线的宽度也在成倍增长,从早期的8位、16位,到后来的32位,而现在我们大部分计算机使用的是64位CPU。

这里需要注意,数据总线和地址总线不是一回事,数据总线用于在CPU和内存之间传输数据,地址总线则用于在内存上定位数据,他们之间没有必然的联系,宽度也不一定相等。实际情况是,地址总线的宽度往往会随着数据总线宽度而增长,以访问更大的内存。

1)16位CPU

早期的CPU是16位的,一次只能处理16Bit(2个字节)的数据。这个时候计算机产业还处于早期,个人电脑也没有进入千家万户,也没有虚拟地址的概念,程序还是直接运行在物理内存上,操作系统对内存的管理非常简陋,程序员轻易就能编写一个恶意程序取修改其他程序的内存,当然这会导致其他程序的崩溃。

学过汇编的同学应该知道,典型的16位处理器是Intel 8086,他的数据总线有16根,地址总线有20根,寻址能力为220 = 1MB。

2)32位CPU

随着计算机产业的进步,出现了32位的CPU,一次能处理32位(4个字节)的数据。这个时候就提出了虚拟地址的概念,并被应用到CPU和操作系统中,由他们共同完成虚拟地址到物理地址的映射,这使得程序编写更加容易,运行更加安全。

典型的32位处理器是 Intel的80386 和 Intel Pentium 4(奔腾4):80386的数据总线和地址总线宽度都是32位,寻址能力达4GB;Pentium 4的地址总线宽度是36位,理论寻址能力达到64GB。

3)64位CPU

现代计算机都使用64位的CPU,他们一次能处理64Bit(8个字节)的数据。典型的64位处理器是Intel的Core i3、i5、i7等,他们的地址总线宽度为40~50位左右。64位的CPU的出现使个人电脑再次发生质的飞跃。

实际支持的物理内存

CPU支持的物理内存只是理论上的数据,实际应用中还会受到操作系统的限制,例如,Win7 64位家庭版最大仅支持8GB或16GB的物理内存,Win7 64位专业版或企业版能够支持到192GB的物理内存。

Windows Server 2003 数据中心版专为大型企业或国家机构而设计,可以处理海量数据,分为32位版和64位版,32位版最高支持512GB的物理内存,这显然超出了32位CPU的寻址能力,可以通过两次寻址来实现。

编译模式

为了兼容不同的平台,现代编译器大都提供两种编译模式:32位模式和64位模式。

32位编译模式

在32位模式下,一个指针或地址占用4个字节的内存,共有32位,理论上能够访问的虚拟内存空间大小位232 = 0X100000000Bytes,即4GB,有效虚拟地址范围是0 ~ 0XFFFFFFFF。

也就是说,对于32位的编译模式,不管实际物理内存有多大,程序能够访问的有效虚拟地址空间就是0 ~ 0XFFFFFFFF,也即虚拟地址空间的大小是4GB。换句话说,程序能够使用的最大内存位4GB,跟物理内存没关系。

如果程序需要使用的内存大于物理内存,或者内存中剩余的空间不足以容纳当前程序,那么操作系统会讲内存中暂时用不到的一部分数据写入硬盘,等需要的时候再读取回来。而我们的程序只管使用4GB的内存,不用关心硬件资源够不够。

如果物理内存大于4GB,例如目前很多PC机都配备了8GB的内存,那么程序也无能为力,只能使用其中的4GB。

64位编译模式

在64位编译模式下,一个地址或指针占用8个字节的内存,共有64位,理论上能够访问的虚拟内存空间大小位264。这是一个很大的值,几乎是无限的,就目前的技术来说,不但物理内存不可能达到那么大,CPU的寻址能力也没有那么大,实现64位长的虚拟地址只会增加系统的复杂度和地址转换的成本,带不来任何好处,所以Windows和Linux都对虚拟机地址进行了限制,仅使用虚拟地址的低48位(6个字节),总的虚拟地址空间大小为248 = 256TB。

需要注意的是:

  • 32位的操作系统只能运行32位的程序(也即以32位模式编译的程序),64位操作系统可以同时运行32位的程序(为了向前兼容,保留已有的大量的32位应用程序)和64位的程序
  • 64位的CPU运行64位的程序才能发挥他的最大性能,运行32位的程序会白白浪费一部分资源

目前计算机可以说是已经进入了64位的时代,之所以还要提供32位编译模式,是为了兼容一些老的硬件平台和操作系统,或者某些场合下32位的环境已经足够,使用64位环境会增加成本,例如嵌入式系统、单片机、工控等

这里所说的32位环境是指:32位的CPU + 32位的操作系统 + 32位的程序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JayerZhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值