收藏:通俗讲解计算机工作原理

点击上方“朱小厮的博客”,选择“设为星标”

后台回复”书”,获取

后台回复“k8s”,可领取k8s资料

为解决各种问题,人们发明了不计其数的机器。计算机种类繁多,从嵌入火星漫游机器人的计算机到为操纵核潜艇导航系统的计算机,不一而足。冯? 诺伊曼在1945 年提出第一种计算模型,无论笔记本电脑还是电话,几乎所有计算机都遵循与这种模型相同的工作原理。那么你们了解计算机是如何工作的吗文将讨论这些内容:

◎ 理解计算机体系结构的基础知识

◎ 选择编译器将代码转换为计算机可以执行的指令

◎ 根据存储器层次结构提高数据的存储速度

毕竟,在非程序员看来,编程要像魔法一样神奇,我们程序员不会这么看。

体系结构

计算机是一种根据指令操作数据的机器,主要由处理器与存储器两部分组成。存储器又称RAM(随机存取存储器),用于存储指令以及需要操作的数据。处理器又称CPU(中央处理器),它从存储器获取指令与数据,并执行相应的计算。接下来,我们将讨论这两部分的工作原理。

存储器

存储器被划分为许多单元,每个单元存储少量数据,通过一个数字地址加以标识。在存储器中读取或写入数据时,每次对一个单元进行操作。

为读写特定的存储单元,必须找到该单元的数字地址。

由于存储器是一种电气元件,单元地址作为二进制数通过信号线传输。

二进制数以 2 为基数表示,其工作原理如下:

cf19a27095cd1b4d25b308f94b0ea04f.png

对于某个给定的单元地址,存储器可以进行两种操作:获取其值或存储新值,如图7-2 所示。存储器包括一条用于设置操作模式的特殊信号线。

7fbccd8bb6790f44464570d12fe1604e.png

设置为“写”模式时,存储器从数据传输线获取一个字节,并将其写入相应的单元,如图7-4 所示。

b74467c922aec8d2e3fdb58118ee4633.png

CPU

CPU 包括若干称为寄存器的内部存储单元,它能对存储在这些寄存器中的数字执行简单的数学运算,也能在RAM 与寄存器之间传输数据。可以指示CPU 执行以下典型的操作:

◎ 将数据从存储位置 220 复制到寄存器 3;

◎ 将寄存器 3 与寄存器 1 中的数字相加。

CPU 可以执行的所有操作的集合称为指令集,指令集中的每项操作被分配一个数字。计算机代码本质上是表示CPU 操作的数字序列,这些操作以数字的形式存储在RAM 中。输入/ 输出数据、部分计算以及计算机代码都存储在RAM 中。

通过在RAM 中包含重写部分代码的指令,代码甚至可以对自身修改,这是计算机病毒逃避反病毒软件检测的惯用手法。与之类似,生物病毒通过改变自身的DNA以躲避宿主免疫系统的打击。

图7-6 取自Intel 4004 操作手册,显示了部分CPU 指令映射为数字的方法。随着制造工艺的发展,CPU 支持的操作越来越多。现代CPU 的指令集极为庞大,但最重要的指令在几十年前就已存在。

8bc89ec907f2e4b91fdb7e619d329ddd.png

CPU 时钟 早在20 世纪80 年代,《太空侵略者》就已风靡一时。这个游戏在配备2 MHz CPU 的街机上运行。“2 MHz”表示CPU 的时钟,即CPU 每秒可以执行的基本操作数。时钟频率为200 万赫兹(2 MHz)的CPU 每秒大约可以执行200 万次基本操作。完成一条机器指令需要5到10 次基本操作,因此老式街机每秒能运行数十万条机器指令。

随着现代科技的进步,普通的台式计算机与智能手机通常配备2 GHzCPU,每秒可以执行数亿条机器指令。时至今日,多核CPU 已投入大规模应用,如四核2 GHz CPU 每秒能执行近10 亿条机器指令。展望未来,CPU 配备的核心数量或许会越来越多。

CPU 体系结构 读者是否思考过,PlayStation 的游戏CD 为何无法在台式计算机中运行Phone 应用为何无法在Mac 中运行因很简单,因为它们的CPU 体系结构不同。

x86 体系结构如今已成为行业标准,因此相同的代码可以在大部分个人计算机中执行。但考虑到节电的要求,手机采用的CPU 体系结构有所不同。不同的CPU 体系结构意味着不同的CPU 指令集,也意味着将指令编码为数字的方式各不相同。台式计算机CPU 的指令并非手机CPU的有效指令,反之亦然。

32 位与64 位体系结构 第一种CPU 是Intel 4004,它采用4 位体系架构。换言之,这种CPU 在一条机器指令中可以对最多4 位二进制数执行求和、比较与移动操作。Intel 4004 的数据总线与地址总线均只有4 条。

不久之后,8 位CPU 开始广为流行,这种CPU 用于运行DOS 的早期个人计算机。20 世纪八九十年代,著名的便携式游戏机Game Boy 就采用8 位处理器。这种CPU 可以在一条指令中对8 位二进制数进行操作。

技术的快速发展使16 位以及之后的32 位体系结构成为主导。CPU 寄存器随之增大,以容纳32 位数字。更大的寄存器自然催生出更大的数据总线与地址总线:具有32 条信号线的地址总线可以对232 字节(4 GB)的内存进行寻址。

人们对计算能力的渴求从未停止。计算机程序越来越复杂,消耗的内存越来越多,4 GB 内存已无法满足需要。使用适合32 位寄存器的数字地址对超过4 GB 内存进行寻址颇为棘手,这成为64 位体系结构兴起的动因,这种体系结构如今占据主导地位。64 位CPU 可以在一条指令中对极大的数字进行操作,而64 位寄存器将地址存储在海量的存储空间中:264 字节相当于超过170 亿吉字节(GB)。

大端序与小端序 一些计算机设计师认为,应按从左至右的顺序在RAM 与CPU 中存储数字,这种模式称为小端序。另一些计算机设计师则倾向于按从右至左的顺序在存储器中写入数据,这种模式称为大端序。因此,根据“字节序”的不同,二进制序列1-0-0-0-0-0-1-1 表示的数字也有所不同。

◎ 大端序:27 + 21 + 20 = 131

◎ 小端序:20 + 26 + 27 = 193

目前的大部分CPU 采用小端序模式,但同样存在许多采用大端序模式的计算机。如果大端序CPU 需要解释由小端序CPU 产生的数据,则必须采取措施以免出现字节序不匹配。程序员直接对二进制数进行操作,在解析来自网络交换机的数据时尤其需要注意这个问题。虽然目前多数计算机采用小端序模式,但由于大部分早期的网络路由器使用大端序CPU,所以因特网流量仍然以大端序为基础进行标准化。以小端序模式读取大端序数据时将出现乱码,反之亦然。

模拟器 某些情况下,需要在计算机上运行某些为不同CPU 设计的代码,以便在没有iPhone 的情况下测试iPhone 应用,或玩脍炙人口的老式超级任天堂游戏。这是通过称为模拟器的软件来实现的。

模拟器用于模仿目标机器,它假定与其拥有相同的CPU、RAM 以及其他硬件。模拟器程序对指令进行解码,并在模拟机器中执行。可以想见,如果两台机器的体系结构不同,那么在一台机器内部模拟另一台机器绝非易事。好在现代计算机的速度远远超过之前的机器,因此模拟并非无法实现。我们可以利用Game Boy 模拟器在计算机中创建一个虚拟的Game Boy,然后就能像使用实际的Game Boy 那样玩游戏。

编译器

通过对计算机进行编程,可以完成核磁共振成像、声音识别、行星探索以及其他许多复杂的任务。值得注意的是,计算机执行的所有操作最终都要通过简单的CPU 指令完成,即归结为对数字的求和与比较。而Web 浏览器等复杂的计算机程序需要数百万乃至数十亿条这样的机器指令。

但我们很少会直接使用CPU 指令来编写程序,也无法采用这种方式开发一个逼真的三维计算机游戏。为了以一种更“自然”且更紧凑的方式表达命令,人们创造了编程语言。我们使用这些语言编写代码,然后通过一种称为编译器的程序将命令转换为CPU 可以执行的机器指令。

我们用一个简单的数学类比来解释编译器的用途。假设我们向某人提问,要求他计算5 的阶乘。

5! = /p>

但如果回答者不了解什么是阶乘,则这样提问并无意义。我们必须采用更简单的操作来重新表述问题。

5×4×3×2×1 = /p>

不过,如果回答者只会做加法怎么办们必须进一步简化问题的表述。

5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 +5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 = /p>

可以看到,表达计算的形式越简单,所需的操作数量越多。计算机代码同样如此。编译器将编程语言中的复杂指令转换为等效的CPU 指令。结合功能强大的外部库,就能通过相对较少的几行代码表示包含数十亿条CPU 指令的复杂程序,而这些代码易于理解和修改。

计算机之父艾伦? 图灵发现,简单的机器有能力计算任何可计算的事物。如果机器具有通用的计算能力,那么它必须能遵循包含指令的程序,以便:

◎ 对存储器中的数据进行读写;

◎ 执行条件分支:如果存储地址具有给定的值,则跳转到程序的另一个点。

我们称具有这种通用计算能力的机器是图灵完备的。无论计算的复杂性或难度如何,都可以采用简单的读取/ 写入/ 分支指令来表达。只要分配足够的时间与存储空间,这些指令就能计算任何事物。

238ecd69654731f7cbef3e7a3d8b4cee.png

反汇编与逆向工程

给定一个已编译的计算机程序,无法在编译之前恢复其源代码。但我们可以对二进制程序解码,将用于编码CPU 指令的数字转换为人类可读的指令序列。这个过程称为反汇编。

接下来,可以查看这些CPU 指令,并尝试分析它们的用途,这就是所谓的逆向工程。某些反汇编程序对这一过程大有裨益,它们能自动检测并注释系统调用与常用函数。借由反汇编工具,黑客对二进制代码的各个环节了如指掌。我相信,许多顶尖的IT 公司都设有秘密的逆向工程实验室,以便研究竞争对手的软件。

地下黑客经常分析Windows、Photoshop、《侠盗猎车手》等授权程序中的二进制代码,以确定哪部分代码负责验证软件许可证。黑客将二进制代码修改,在其中加入一条指令,直接跳转到验证许可证后执行的代码部分。运行修改后的二进制代码时,它在检查许可证前获取注入的JUMP 命令,从而可以在没有付费的情况下运行非法的盗版副本。

在秘密的政府情报机构中,同样设有供安全研究人员与工程师研究iOS、Windows、IE 浏览器等流行消费者软件的实验室。他们寻找这些程序中可能存在的安全漏洞,以防御网络攻击或对高价值目标的入侵。在这类攻击中,最知名的当属“震网”病毒,它是美国与以色列情报机构研制的一种网络武器。通过感染控制地下聚变反应堆的计算机,“震网”延缓了伊朗核计划。

开源软件

如前所述,我们可以根据二进制可执行文件分析有关程序的原始指令,但无法恢复用于生成二进制文件的原始源代码。

在没有原始源代码的情况下,即使可以稍许修改二进制文件以便以较小的方式破解,实际上也无法对程序进行任何重大更改(如添加新功能)。一些人推崇协作构建代码的方式,因此将自己的源代码开放供他人修改。“开源”的主要概念就在于此:所有人都能自由使用与修改的软件。基于Linux 的操作系统(如Ubuntu、Fedora 与Debian)是开源的,而Windows 与macOS 是闭源的。

开源操作系统的一个有趣之处在于,任何人都可以检查源代码以寻找安全漏洞。现已证实,政府机构通过日常消费者软件中未修补的安全漏洞,对数百万平民进行利用和监视。

但对开源软件而言,代码受到的关注度更高,因此恶意的第三方与政府机构很难植入监控后门程序。使用macOS 或Windows 时,用户必须相信Apple 或Microsoft 对自己的安全不会构成危害,并尽最大努力防止任何严重的安全漏洞。而开源系统置于公众的监督之下,因此安全漏洞被忽视的可能性大为降低。

存储器层次结构

我们知道,计算机的操作可以归结为使CPU 执行简单的指令,这些指令只能对存储在CPU 寄存器中的数据操作。但寄存器的存储空间通常被限制在1000 字节以内,这意味着CPU 寄存器与RAM 之间必须不断进行数据传输。

如果存储器访问速度过慢,CPU 将被迫处于空闲状态,以等待RAM 完成数据传输。CPU 读写存储器中数据所需的时间与计算机性能直接相关。提高存储器速度有助于加快计算机运行,也可以提高CPU 访问数据的速度。CPU 能以近乎实时的速度(一个周期以内)访问存储在寄存器中的数据,但访问RAM 则慢得多。

对于时钟频率为1 GHz 的CPU,一个周期的持续时间约为十亿分之一秒,这是光线从本书进入读者眼中所需的时间。

处理器与存储器之间的鸿沟

近年来的技术发展使得CPU 速度成倍增长。虽然存储器速度同样有所提高,但却慢得多。CPU 与RAM 之间的这种性能差距称为“处理器与存储器之间的鸿沟”。我们可以执行大量CPU 指令,因此它们很“廉价”;而从RAM 获取数据所需的时间较长,因此它们很“昂贵”。随着两者之间的差距逐渐增大,提高存储器访问效率的重要性越发明显。

5eee974bd84a6490e57df1b10cda6523.png

使用一级/ 二级/ 三级缓存能显著提高计算机的性能。在配备200 KB的二级缓存后,CPU 发出的存储请求中仅有不到10% 必须直接从RAM获取。

读者今后购买计算机时,对于所挑选的CPU,请记住比较一级/ 二级/三级缓存的容量。CPU 越好,缓存越大。一般来说,建议选择一款时钟频率稍低但缓存容量较大的CPU。

第一级存储器与第二级存储器

如前所述,计算机配有不同类型的存储器,它们按层次结构排列。性能最好的存储器容量有限且成本极高。沿层次结构向下,可用的存储空间越来越多,但访问速度越来越慢。

7bef9f867b6f9b56894e4fb3f0e01de8.png

小结

本文介绍了一些基本的计算机工作原理。任何可计算的事物都能采用简单的指令来表示。为将复杂的计算命令转换为CPU 可以执行的简单指令,需要使用一种称为编译器的程序。计算机之所以能进行复杂计算,仅仅是因为CPU 可以执行大量基本操作。

计算机的处理器速度很快,但存储器相对较慢。CPU 并非以随机方式访问存储器,而是遵循空间局部性与时间局部性原理。因此,可以将访问频率较高的数据缓存在速度更快的存储器中。这一原则在多个级别的缓存中得到了应用:从一级缓存直到第三级存储器,不一而足。

本文讨论的缓存原则可以应用于多种场景。确定应用程序频繁使用的数据,并设法提高这部分数据的访问速度,是缩短计算机程序运行时间的最常用策略之一。

——本文选自《计算机科学精粹》

07a2ca33d52343e5124f2a85d73f6c7e.png

想知道更多/strong>描下面的二维码关注我

c5c5d0079d8d8d7a88d9463b69f78c4a.png

后台回复”技术”,加入技术群

后台回复“k8s”,可领取k8s资料

【精彩推荐】

  • ClickHouse到底是什么什么如此牛逼!

  • 原来ElasticSearch还可以这么理解

  • 面试官:InnoDB中一棵B+树可以存放多少行数据/h2>

  • 架构之道:分离业务逻辑和技术细节

  • 星巴克不使用两阶段提交

  • 面试官:Redis新版本开始引入多线程,谈谈你的看法/h2>

  • 喜马拉雅自研网关架构演进过程

  • 收藏:存储知识全面总结

  • 微博千万级规模高性能高并发的网络架构设计

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91449 人正在系统学习中

来源:朱小厮

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月28日
下一篇 2021年9月28日

相关推荐