cpu类型

  • X64(CISC)
  • ARM(Acorn RISC Machine)
  • mm68000,m68k (moto)
  • Power(IBM)
  • Powerpc(apple,ibm,moto)
  • Ultrasparc (Sun)
  • Alpha(HP)|
  • 安腾(compaq)

按照CPU体系架构来区分,服务器主要分为两类:。

  • 非x86服务器:使用RISC,(精简指令集)或EPIC(并行指令代码)处理器,并且主要采用UNIX和其它专用操作系统的服务器,指令系统相对简单,它只要求,硬件执行很有限且最常用的那部分执l令,CPU主要有Compaq的Alpha、 HP的PA-RISC、IBM的P ower PC、 MIPS的MIPS和SUN的Sparc、 Intel研发的EPIC安腾处理器等。这种服务器价格昂贵,体系封闭,但是稳定性好,性能强,主要用在金融、电信等大型企业的核心系统
  • x86服务器:又称CISC(复杂指令集)架构服务器,即通常所讲的PC服务器,它是基于PC机体系结构,使用Intel或其[它兼容x86指令集的处理器芯片的服务器。目前主要为intel的Xeon E3,E5, E7系列,价格相对便宜、兼容性好、稳定性较差、安全性不算太高

为什么叫 x86 和 x86_64 和 AMD64?
为什么大家叫 x86 为 32 位系统?
为什么软件版本会注明 for amd64 版本,不是 intel64 呢?

x86 是指 intel 的开发的一种 32 位指令集,从 386 开始时代开始的,一直沿用至今,是一种 cisc 指令集,所有 intel 早期的 cpu,amd 早期的 cpu 都支持这种指令集,intel 官方文档里面称为 “IA-32”

x84_64 是 x86 CPU 开始迈向 64 位的时候,有 2 选择:

1、向下兼容 x86。

2、完全重新设计指令集,不兼容 x86。

AMD 抢跑了,比 Intel 率先制造出了商用的兼容 x86 的 CPU,AMD 称之为 AMD64,抢了 64 位 PC 的第一桶金,得到了用户的认同。

Intel 选择了设计一种不兼容 x86 的全新 64 为指令集,称之为 IA-64(这玩意似乎就是安腾),但是比 amd 晚了一步,而且 IA-64 也挺惨淡的,因为是全新设计的 CPU,没有编译器,也不支持 windows(微软把 intel 给忽悠了,承诺了会出安腾版 windows server 版,但是迟迟拿不出东西)。后来不得不在时机落后的情况下也开始支持 AMD64 的指令集,但是换了个名字,叫 x86_64,表示是 x86 指令集的 64 扩展,大概是不愿意承认这玩意是 AMD 设计出来的。

实际上,x86_64,x64,AMD64 基本上是同一个东西,我们现在用的 intel/amd 的桌面级 CPU 基本上都是 x86_64,与之相对的 arm,ppc 等都不是 x86_64。

x86、x86_64 主要的区别就是 32 位和 64 位的问题,x86 中只有 8 个 32 位通用寄存器,eax,ebx,ecx,edx, ebp, esp, esi, edi。

x86_64 把这 8 个通用寄存器扩展成了 64 位的,并且比 x86 增加了若干个寄存器(好像增加了 8 个,变成了总共 16 个通用寄存器)。同样的 MMX 的寄存器的位数和数量也进行了扩展。此外 cpu 扩展到 64 位后也能支持更多的内存了,等等许多好处。

对于普通程序来说,CPU 位数的扩展、寄存器数量的增加不会带来明显的性能提升,比如 IE 浏览器、Office 办公这类的软件。特定的程序很能够充分利用 64 位 CPU、更多的寄存器带来的优势,比如 MMX 除了能提升多媒体程序的性能,对矩阵、多项式、向量计算都能带来提升,更多的 MMX 寄存器、更大的寄存器字长都有利于 SIMD 指令的执行,能够提升 CPU 对数据的吞吐量(RISC 指令集的 CPU 动不动就有数百个寄存器,可以有效的缓存中间计算结果,不需要把中间结果写入内存,从而减少内存访问次数,显著提升性能)

x86

x86 架构(The x86 architecture)是微处理器执行的计算机语言指令集,指一个 intel 通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合。

1978 年 6 月 8 日,Intel 发布了新款 16 位微处理器 “8086”,也同时开创了一个新时代:x86 架构诞生了。

在 40 年的发展史中,x86 家族不断壮大,从桌面转战笔记本、服务器、超级计算机、编写设备,期间还挫败或者限制了很多竞争对手的发展,让不少处理器厂商及其架构技术成为历史名字,即使有些封闭发展的也难以为继,比如苹果就已经放弃 PowerPC 了。

AMD64/x86-64

x86-64 有时会简称为 “x64”,是 64 位微处理器架构及其相应指令集的一种,也是 Intel x86 架构的延伸产品。

“x86-64”1999 由 AMD 设计,AMD 首次公开 64 位集以扩充给 IA-32,称为 x86-64(后来改名为 AMD64)。 AMD64 架构在 IA-32 上新增了 64 位寄存器,并兼容早期的 16 位和 32 位软件,可使现有以 x86 为对象的编译器容易转为 AMD64 版本。

由于 AMD64 和 Intel64 基本上一致,很多软硬件产品都使用一种不倾向任何一方的词汇来表明它们对两种架构的同时兼容。出于这个目的,AMD 对这种 CPU 架构的原始称呼 - “x86-64”被不时地使用,还有变体 “x86_64”。其他公司如微软和 Sun 在营销资料中使用“x64” 作为对 “x86-64” 的缩写。

许多操作系统及产品,尤其那些是在 Intel 进入这块市场之前就引入 “x86-64” 支持的,使用 “AMD64” 或“amd64”同时指代 AMD64 和 Intel64。

现在的 x86 CPU 在位数上有 32/64bit 之分,在 ARCH 上有又 x86/x86_64/x64/i386/IA32/IA64/amd64

最近又新出来一个 x32,还好不是 ARCH,只是 ABI,没有那么混乱。

先说一下 x86 的这些 arch,不要求很严格的话,基本上可以用下面的公式来表达:

x86=i386=IA32

amd64=x86_64=x64!=IA64

其实这两个等式里很多都是别名,严格说的话,x86 的世界里只存在 x86/x86_64/IA64 三种架构。

当年 AMD 先于 Intel 推出向下兼容的 amd64 CPU,而 Intel 推出的不兼容 32 位系统的 IA64 惨淡收场 (被 MS 放了鸽子),后来 Intel 在指令上支持了 amd64,不过不愿意叫 amd64,改了个名字 x86_64。

再说 64bit/32bit 的兼容性问题:

现在的 64bit CPU 实际上都做了兼容 32bit 的特殊设计,所以 64bit 的 CPU 上运行 32bit 的软件 (包括 kernel/app, driver 除外) 是没有问题。反过来,32bit 的 CPU 上运行 64bit 的软件是不可以的。

最后说重点,64bit 相比 32bit 的性能优势:

这里不考虑 64bit 硬件上运行 32bit 软件的这种过度方式。

从架构上来说,64bit 拥有 64bit 的 register 和 64bit 的 bus,在数据传输效率上比 32bit 要高不少;另外,64bit 地址总线的寻址空间突破了 4G 的限制。

所以,对于大内存,密集数据运算的应用场景,64bit 的优势是非常明显的。网上有一些 benchmark,这里不贴了。

但是,对于小内存系统,64bit 的 CPU 在某些状况下可能比 32bit CPU 的效率更低。

因为 64 bit 的 CPU 的地址是 64 位的,指针是 64 位的,编译生成的二进制文件更大,运行时占用的内存更多; 另一方面,因为 64 位地址的问题,cache 中能存放的指令就更少,所以更容易导致 cache 的 miss。

所以在某些应用场景,64 bitCPU 的更大的寻址空间,更快的数据传递,更快的浮点运算的特性, 与其 64 bit 的地址 / 指针所导致的 cache miss 的特性,始终并存。

为了充分利用 64 的优势,又避免 64bit 地址导致的 cache miss 的问题,Intel 提出了 x32 ABI 的概念。

x32 不是一个 ARCH,是一个 ABI。

x32 可以充分的使用 64 bit 硬件的 64 bit 寄存器,64bit 总线,以及 64bit 新增的指令,从而获得更快的数据处理速度。

同时 x32 又使用 32bit 的地址 / pointer,32bit 的 C 数据类型,因此 cache miss 并不会增加。

x32 是一个 ABI,其设计到的部分包括:kernel 的 support,toolchain 的 support,system lib 的 support。现在 kernel(from 3.4) 和 toolchain 的 support 都已经 OK。

ARM,AMD,X86,AArch64 的概念

AMD,中文名(超威)超微半导体,是除了英特尔以外最大的 x86 架构微处理供应商,也是除了英伟达以外仅有的独立图形处理供应商。

x86 泛指一系列由英特尔公司开发的处理器的架构,最早为 1978 年面世的 “Intel 8086”CPU。早期的处理器均是以此格式来命名,如 Intel 8086,80186,80286,80386,80486, 这些架构被统称为 x86。由于数字不能被注册成为商标,因此公司每当有新的处理器使用,均会采用可注册的名称,如 Pentium。

基于 x86 的 32 位架构(常被称为 i386,x86),IA-32, 而基于 x86 的 64 位架构,x86-64 常称为 AMD64 或 Intel64。最早是由 AMD 公司首先根据 x86 的架构生产出了 64 位的处理器,但是由于是竞争关系,Intel 公司不愿意承认 AMD64, 近些年才推出了 Intel64

ARM(英文为 Advanced RISC Machine,或 Acorn RISC Machine)也是一个架构,非常适用于移动通信这种低成本,高性能,低耗电的领域。ARM 的公司为安谋控股(ARM Holding plc), 又称为 ARM 公司,总部位于剑桥的设计与软件公司,现在已被日本的软银公司收购,后者同时也是国内互联网巨头阿里巴巴的最大股东。

AArch64 是 ARMv8 的一种执行状态。

为了更广泛地向企业领域推进,需要引入 64 位构架,同时也需要在 ARMv8 架构中引入新的 AArch64 执行状态。

AArch64 不是一个单纯的 32 位 ARM 构架扩展,而是 ARMv8 内全新的构架,完全使用全新的 A64 指令集。这些都源自于多年对现代构架设计的深入研究。更重要的是, AArch64 作为一个分离出的执行状态,意味着一些未来的处理器可能不支持旧的 AArch32 执行状态。

虽然最初的 64 位 ARM 处理器将会完全向后兼容,但我们大胆且前瞻性地将 AArch64 作为在 ARMv8 处理器中唯一的执行状态。我们在这些系统中将不支持 32 位执行状态, 这将使许多有益的实现得到权衡,如默认情况下,使用一个较大的 64K 大小的页面,并会使得纯净的 64 位 ARM 服务器系统不受遗留代码的影响。立即进行这种划分是很重要的,因为有可能在未来几年内将出现仅支持 64 位的服务器系统。没有必要在新的 64 位架构中去实现一个完整的 32 位流水线,这将会提高未来 ARM 服务器系统的能效。

这样回想起来, AArch64 作为在 Fedora ARM 项目中被支持的 ARM 构架是一个很自然的过程: armv5tel、armv7hl、aarch64。新的架构被命名为:aarch64,这同 ARM 自己选择的主线命名方式保持一致,同时也考虑到了 ARM 架构名与 ARM 商标分开的期望。

ARMv8-A 将 64 位架构支持引入 ARM 架构中,其中包括:

64 位通用寄存器、SP(堆栈指针)和 PC(程序计数器)

64 位数据处理和扩展的虚拟寻址

两种主要执行状态:

AArch64 - 64 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持

AArch32 — 32 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持

这些执行状态支持三个主要指令集:

A32(或 ARM):32 位固定长度指令集,通过不同架构变体增强部分 32 位架构执行环境现在称为 AArch32。

T32 (Thumb) 是以 16 位固定长度指令集的形式引入的,随后在引入 Thumb-2 技术时增强为 16 位和 32 位混合长度指令集。部分 32 位架构执行环境现在称为 AArch32。

A64:提供与 ARM 和 Thumb 指令集类似功能的 32 位固定长度指令集。随 ARMv8-A 一起引入,它是一种 AArch64 指令集。

ARM ISA 不断改进,以满足前沿应用程序开发人员日益增长的要求,同时保留了必要的向后兼容性,以保护软件开发投资。在 ARMv8-A 中,对 A32 和 T32 进行了一些增补,以保持与 A64 指令集一致。
https://www.jianshu.com/p/2753c45af9bf

CPU time与WALL time

CPU时间
进程时间也称CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟嘀嗒计算,实际时间(Real),用户CPU时间(User),系统CPU时间(Sys)

实际时间指实际流逝的时间;用户时间和系统时间指特定进程使用的CPU时间:

  • real time是从进行开始执行到完成所经历的墙上时钟时间(wall clock)时间,包括其他进程使用的时间片(time slice)和本进程耗费在阻塞(如等待I/O操作完成)上的时间。
  • user time是进程执行用户态代码(内核外)耗费的CPU时间,仅统计该进程执行时实际使用的CPU时间,而不计入其他进程使用的时间片和本进程阻塞的时间
  • sys time 是该进程在内核态运行所耗费的CPU时间,即内核执行系统调用所使用的CPU时间

CPU总时间(user + sys)是CPU执行用户进程操作和内核(代表用户进程执行)系统调用所耗时间的总和,即该进程(包括线程和子进程)所使用的实际CPU时间。若程序循环遍历数组,则增加用户CPU时间;若程序执行exec或fork等系统调用,则增加系统CPU时间。
在多核处理器机器上,若进程含有多个线程或通过fork调用创建子进程,则实际时间可能小于CPU总时间,因为不同线程或进程可并行执行,但其时间会计入主进程的CPU总时间。若程序在某段时间处于等待状态而并未执行,则实际时间可能大于CPU总时间:

  1. real < CPU 表明进程为计算密集型(CPU bound),利用多核处理器的并行执行优势
  2. real ≈ CPU 表明进程为计算密集型,未并行执行
  3. real > CPU 表明进程为I/O密集型 (I/O bound),多核并行执行优势并不明显