2019独角兽企业重金招聘Python工程师标准>>>

“64位”

我们先来谈谈“64位”这个术语及其含义。大家对于这个术语一直比较困惑,很大一部分原因在于,它没有统一的、约定俗成的定义。然而,在大体上却达成了一些共识,尽管这些共识并未为大众所知。

“×× 位”CPU通常是指两个部分的宽度:整数寄存器的宽度和指针的宽度。值得庆幸的是,在大多数现代CPU中,它们是一致的。“64位”通常是指CPU有64 位整数寄存器和64位指针。除了搞清楚“64位”所指的对象外,明白非“64位”所指的对象也十分重要,这些对象通常包括以下几种。

  • 内存(RAM)地址大小。这一数值(关系到硬件可支持的最大内存)与CPU的位数无关。ARM架构的内存地址通常从26位到40位不等。
  • 数据总线大小。CPU从内存或缓存中获取的数据量也与CPU的位数无关,某些CPU指令可能需要特定大小的数据,但在实际应用中,既可一次获取多条指令, 也可多次获取一条指令。上一代iPhone就已经以64位块为单位从内存获取数据了。在PC中,块大小最高可达192位。
  • 与浮点运算相关的参数。FPU寄存器的大小和内部设计是独立的,ARM架构采用64位FPU已颇有段时间了。

“64位”的优点与缺点

尽管64位与硬件可支持的最大内存无关,但便于单一程序使用更大内存。在32位CPU中,单一程序仅有4GB地址空间,减去被操作系统和标准库所占用的部 分,只剩1~3GB可用。如果一个32位系统的RAM超过4GB,单一程序很难充分利用全部空间,除非开发者耍些小聪明,例如直接命令操作系统按需求分配 内存,或将程序拆分成多个进程。但在实际应用中,很少有程序这么做,因为编程更麻烦,还会有损性能。系统拥有更多内存的好处是,能同时运行多个应用并减少 硬盘缓存。这样固然不错,但难免有个别程序需要使用更多内存的情况。

即使对于物理内存较小的系统,更大的地址空间也有帮助。内存映射文件是种有用的结构,在32位系统中,程序不能映射大文件(通常是指超过几百MB的文件),而64位系统的可用地址空间更大,不必有这方面的担心。

不过,增加指针宽度有个严重的缺点:在所有其他条件都相同的情况下,单一程序在64位CPU系统中更占内存。因为指针本身也需要存储于内存中,在64位系统 上,这个空间增加了一倍。而大多数程序运用指针很频繁,所以额外占用的空间往往不少。这给缓存带来了压力,从而导致性能降低。

简而言之,“64位”可以提升某些应用的性能,并使内存映射文件这种编程技术更易用。不过,它也会因占用更多内存而降低性能。

ARM64

iPhone 5S的64位CPU是配有更宽寄存器的ARM处理器,与32位ARM架构相比,64位ARM架构包括以下重大变动:首先是名称的变化——它的官方名称为 “AArch64”,但这个名字读起来很绕口,敲起来也别扭。苹果称它为ARM64,我也更倾向于用这个名字。

较32位ARM架构而 言,ARM64的整数寄存器数量增加了一倍,32位ARM架构有16个整数寄存器,其中1个是专用的程序计数器,还有2个用于堆栈指针和链接,其他13个 则作一般用途。而ARM64位架构有32个整数寄存器,包括1个专用的零寄存器,1个链接寄存器和1个帧指针寄存器,还有1个寄存器预留给平台,另外28 个则为通用整数寄存器。ARM64上可用浮点寄存器的数量有所增加。32位ARM处理器有32个32位浮点寄存器,还有16个额外的64位寄存器。这些寄 存器的结构有些特殊,可被视为等价于16个重叠的128位寄存器。ARM64则将其简化为32个128位寄存器,且没有重叠。

寄存器的数量 会对性能会产生巨大影响。与CPU相比,内存要慢得多。与CPU处理一条指令的时间相比,读取和写入内存都需要更长时间。CPU试图通过引入缓存来缓解这 一差距。但与CPU内部的寄存器相比,即使速度最快的缓存也慢得多。更多的寄存器意味着更多数据能存储在CPU内部,这降低了内存访问频率,同时提高了性 能。

除了增加寄存器数量,ARM64也为指令集带来了重大变化。大多数32位ARM处理器可基于运行时条件寄存器的状态执行条件指令,这使 得在编译if等语句时无需分支。不过这种方式引入的麻烦多于便利,因此ARM64取消了条件执行。ARM64的NEON SIMD单元完全符合IEEE754双精度标准,而32位版本的NEON SIMD单元只支持单精度。ARM64还增加了专门的AES、SHA-1、SHA-256加密指令。这些指令也许对普通应用帮助不大,但对特定领域的应用 来说价值无穷。

Objective-C Runtime变化

在Mac OS X 10.7操作系统中,苹果引入了标签指针,这种指针允许某些类和其少量实例数据完全存储在指针中。这样在使用某些类时(如NSNumber)就无需分配内 存,并提升性能。标签指针仅支持64位架构,一部分原因是受二进制兼容制约,另一部分原因是32位指针预留的数据空间不足。之前的iOS系统都不支持标签 指针,而在ARM64位架构中,Objective-C Runtime已包含了标签指针,因此也可以享受Mac系统所具备的便利了。

尽管指针为64位,但在实际使用中,这些位数并不是都用上了。例如X86-64的Mac OS X系统仅使用了其中的47位。而ARM64上占用得更少,目前只有33位。只要未被系统全部占用,这些指针就能用于存储数据。这是Objective-C Runtime演进史上最重要的变化之一。

另作他用的ISA指针

Objective-C对象是连续的内存块,这个内存块中第一个指针大小的部分称为ISA。一般来说,ISA是一个指向该对象所属类的指针。

不过这么大的空间仅作为指针有点儿浪费,尤其是在64位CPU上。运行iOS的ARM64目前仅使用了一个指针的33位,而其余31位则另作他用。另外,类 指针还需要对齐,这就释放了另外3位,于是ISA指针中共有34位可另作他用。苹果的ARM64 Runtime正是利用了这一点使性能有了大幅提升。

不过,最重要的性能提升也许得益于内联引用计数。几乎所有的Objective-C对象都采用引用计数(NSString文字等常量对象是例外),这使得修 改引用计数的操作极为频繁。尤其对于采用自动引用计数的系统来说,资源消耗非常高。因此,提高引用计数的性能变得至关重要。

以往,引用计数 并不存储在对象中,因为ISA空间不足。当然,我们可以为每个对象专门分配一块空间用于保存引用计数,但这会占用更多的内存空间。对今天的系统来说,额外 的空间也许不算什么,但对早期的Objective-C系统影响严重。由于这样的原因,引用计数被系统存储在了一个单独的表中。

于是,当为对象增加新引用时,Runtime会执行以下操作:

  • 获取全局计数哈希表;
  • 锁定表以确保线程操作的安全;
  • 查询表中对象的计数;
  • 增加计数,并将新值重新存储到表中;
  • 解除锁定。

这些操作非常缓慢!即使用最快的哈希表,也没有直接从内存访问来得快。

对于ARM64,ISA字段中的19位用于内联存储引用计数。这意味着,增加对象引用的步骤可以简化为:在ISA字段正确部分执行原子操作加一。

仅此而已!速度将会快得多!当然,还有一些极端情况需要处理,真正的操作会略微复杂一些。

以往在回收Objective-C对象时,需要执行大量清除工作,跳过其中不必要的步骤,就可以提高性能。利用剩余的可用位,还有其他一些方法可使回收对象的速度更快。

将上面提到的所有优化集合在一起,ARM64的性能优势就变得非常明显了。根据我自己不太严格的性能测试显示,在iPhone 5S 32位模式下,基本对象的创建和销毁大约需要380ns,而在64位模式,仅需200ns。如果某类实例曾有过弱引用并与对象集合关联,32位模式下的耗 时上升至约480ns,而64位模式下保持不变,仍为200ns。

结束语

“64位”A7处理器既不是一种营销手段,也不是一个能催生创新应用的巨大突破。真实的情况是,它介于两者之间,就像我们经常见到的技术演进一样。

ARM64让某些应用的计算速度快了一些,大多数应用占用的内存变得更多,也让一些编程技巧更容易使用。不过从总体上看,还不算重大变化。

在向64位过渡的过程中,ARM架构增加了寄存器的数量,并对其使用做了修改。改进了指令集,令其性能优于过去的32位处理器。

苹果也从这种过渡中改变自己。最大的变化是内联引用计数,这一改变使得在通常情况下,无需进行代价昂贵的哈希表查找,让对象的创建和销毁代价都减少了近一半。标签指针也有利于性能提升并减少了内存占用。

ARM64使苹果的硬件如虎添翼,尽管我们都知道这一天迟早会到来,但没想到这么快,真是很棒!

转载于:https://my.oschina.net/sunqichao/blog/174846

ARM64移动处理器解惑相关推荐

  1. ARM64移动处理器解惑 iphone5s

    "64位" 我们先来谈谈"64位"这个术语及其含义.大家对于这个术语一直比较困惑,很大一部分原因在于,它没有统一的.约定俗成的定义.然而,在大体上却达成了一些共 ...

  2. 苹果ARM64移动处理器

    原文链接:http://www.mikeash.com/pyblog /friday-qa-2013-09-27-arm64-and-you.html "64位" 我们先来谈谈&q ...

  3. 【学习笔记】解决Linux32位编译程序无法在arm64位处理器上运行

    (本次实验以Toybrick RK3399ProD实验板为例) 最近学习了嵌入式Linux,在电脑上安装虚拟机运行Linux系统(我使用RHEL 6) 由于虚拟机里安装了arm-Linux,发现在RH ...

  4. 《程序员》 -- 《程序员》2013年11月刊: 运维

    自己非常喜欢<程序员>杂志,<程序员>杂志在一定程序上很能开阔我们的视野.因此,一直都想推荐给大家. 方便大家相互学习交流,本文转自<程序员>杂志 http://w ...

  5. 《程序员2013精华本》

    <程序员2013精华本> 基本信息 作者: <程序员>杂志社 出版社:电子工业出版社 ISBN:9787121224560 上架时间:2014-2-21 出版日期:2014 年 ...

  6. 详解 ARM64 内核中对 52 位虚拟地址的支持

    当 64 位硬件变得可用之后,处理更大地址空间(大于 232 字节)的需求变得显而易见.现如今一些公司已经提供 64TiB 或更大内存的服务器,x86_64 架构和 arm64 架构现在允许寻址的地址 ...

  7. ARM64内核内存布局图

    ARM64架构处理器采用48位物理寻址机制,最大可以寻找到256TB的物理地址空间.对于目前的应用来说已经足够了,不需要扩展到64位的物理地址寻址.虚拟地址也同样最大支持48位支持,所以在处理器的架构 ...

  8. arm处理器下的对齐异常1-简介

    一.问题引入 什么是对齐异常呢,为什么ARM处理器下会有对齐异常?这个要先从arm 32位处理器下的两条指令LDR与STR说起.作为A32指令集的两条最基本指令,STR/LDR 可以用于寄存器与内存之 ...

  9. Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定

    ARM64的启动过程之(六):异常向量表的设定 作者:linuxer 发布于:2015-11-24 18:22 分类:ARMv8A Arch 一.前言 本文主要描述了4.1.10内核初始化过程中如何初 ...

  10. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

最新文章

  1. Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
  2. SAP MM UB类型STO不能转供应商寄售库存?
  3. 关于服务器虚化的优势,服务器虚拟化优缺点总结
  4. python手册中文版apk-Go、Python 语言解析安卓 APK 包
  5. 【学习】009 NIO编程
  6. 043_对象构造器和原型
  7. LeNet试验(二)权重参数随训练的变化
  8. Navicat导入TXT到数据库
  9. day02 while循环 运算符 格式化输出 编码
  10. 智能商业大会构造信息化交流平台
  11. IOS--CALayer的介绍及使用技巧
  12. arcgis api for js之echarts开源js库实现地图统计图分析
  13. PPT计时软件(可手动、可自动,支持OFFICE、WPS)
  14. 2018厦门大学计算机技术分数线,厦门大学2018年各省市录取分数线
  15. 基于UML的高校教务管理系统的设计与实现
  16. [XJTU计算机网络安全与管理]——第八讲密钥管理和分发
  17. 图计算库 igraph 在 windows 10 上的编译安装
  18. hibernate之HQL实体更新与删除
  19. 随手记_英语_学术写作_常用近义词区分
  20. 上网十八手 做出个倒数计时器

热门文章

  1. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah
  2. 祝威廉 :Rust FFI 实践
  3. Kubernetes 是什么?为什么也称为 K8S?| 科普
  4. 超算简史:练飞天之技,登峰一战后,终有落地日 | 凌云时刻
  5. 一文掌握 Linux 性能分析之 CPU 篇
  6. java基础教程 吴仁群 试读_清华大学出版社-图书详情-《Java基础教程》
  7. 【元胞自动机】基于matlab保守策略元胞自动机三车道(不开放辅路,软件园不影响)交通流模型【含Matlab源码 1293期】
  8. 【电力负荷预测】基于matlab灰狼算法优化LSTM短期电力负荷预测【含Matlab源码 1518期】
  9. html原生listview,Html中使用M$控件系列之 ListView 篇
  10. Java密码类型_java加密类型和算法名称