代码改变世界

《世界是数字的》读书笔记第一部分_硬件篇

2015-05-03 21:16  星星之火✨🔥  阅读(986)  评论(0编辑  收藏  举报

《世界是数字的》是一部科普读物,出自顶尖计算机科学家Brian W.Kernighan之手,如果你不知道此人是谁的话,那么你或许知道The Practice of Programming(中文名程序设计实践,K(后文提到Brian W.Kernighan就简称为K了:)与R.Pick合著),如果你也不知道程序设计实践,那么你肯定知道The C Programming Language(在计算机领域混过还不知道的自行面壁去:-),没错这本K&R,就是Kernighan与C语言之父里奇的著作,此书被誉为C语言的圣经,影响着一代又一代的程序员。

作为一个非科班的计算机爱好者,自然不能错过聆听大师教诲的机会,废话少说,还是赶紧跟随大师的脚步到计算机的世界中一窥究竟吧。

任何先进的技术都与魔术无异(C.克拉克)。K作次书的目的就是揭开魔法的神秘帷幕,让读者了解到形形色色的与计算机密切相关的系统是如何运作的。相片/音乐/电影如何能一瞬间传遍全球?电子邮件是如何运转的?你的电子邮件私密性如何?为何垃圾邮件容易发送却难以清除?手机真的知道你的位置吗?iphon 和安卓手机有什么区别,为什么它们在根本上又是一回事?跟随K的脚步,我们将会对计算机和通信系统的运转有相当靠谱的了解,并知道这些技术如何影响我们的生活。

计算机里有什么

这个问题可以从两方面来看:逻辑上或者说功能上的组成,即每一部分是什么、做什么、怎样做、之间如何连接;以及物理上的结构,即每一部分长什么样子、如何建造起来的。

  • 逻辑构造

计算机在逻辑上或者功能上的体系结构如下图:有处理器(CPU)、主存储器(内存)、大容量存储器(硬盘)和各种各样的其他部件组成,一组叫做总线的线缆把所有这些连接起来,在各部件之间传输信息。

计算机的基本组成,包括处理器、存放指令和数据的存储器以及输入输出设备,这种体系结构通常称为冯·依曼体系结构。

CPU:处理器,或者叫中央处理单元(缩写为CPU),是计算机的大脑。处理器进行运算,来回搬运数据,并控制着一切别的操作。CPU有一张指令表,它可以执行的操作时有限的,但是执行起来速度奇快。高达每秒钟几十亿次。可以根据先前的计算结构决定接下来执行什么指令。购买计算机,常常会看到对CPU诸如此类的描述"英特尔双核酷睿2.1GHz"。这说明了,这款CPU是英特尔制造的,一片封装的内部实际上有两个CPU。这里"核"就是处理器的意思。CPU使用一个跟心跳或者钟表滴答类似的内部时钟来控制基本操作的节拍,度量CPU的指标之一就是看这个内部时钟每秒振动多少次。每秒钟心跳一次或者滴答一次就是1Hz.对于2.1GHz的处理器,它每秒钟跳动21亿次。人类的心跳大约是1Hz,也就是每天大约跳10万次,每年将近3千万次,于是我们的心脏要花70年才能赶上这个CPU在一秒钟里跳动的次数。

主存储器,也就是随机访问存储器(缩写为RAM,即内存),里面保存了处理器和计算机的其他部件正在活跃使用的信息;CPU可以改变内存里的内容。内存里不仅保存了CPU正在处理的数据,还保存了让CPU如何处理数据所需运行的指令。这就是存储程序的概念,这样,同一台计算机,只要在内存里放上适当的指令,就可以运行各种各样的程序。运行中的程序,如Word、QQ、或浏览器,它们的指令就放在内存里;这些程序操作的数据,比如屏幕上显示的照片、正在编辑的文档、正在播放的音乐等,也是放在内存里的;而Windows、Mac OS X或其他操作系统,也就是能让你在同一时间运行多个应用程序的幕后功臣,它们运行的指令还是放在内存里。内存是掉电即失的。因此在台式机上工作的时候,要养成小心谨慎的好习惯,经常保存正在做的工作,不小心踢掉电源线可不是闹着玩的:-)。计算机上的内存大小是有限的。表示容量的单位是字节,一字节大小的内存,可以放入单个字符,可以放入一个整数比如42,还可以放入大数值的一部分。可以把内存想象成一堆大小完全一样的小盒子,上面从1开始编号到一二十亿,每个盒子里可以放进一小片信息。通常而言,内存越大可供发挥的空间就越大(虽然所有程序同时跑起来的时候,内存再多也不够用),而这往往也可以说成计算得越快。如果想要计算机运行更快的话,多买内存看起来是最佳策略。

磁盘和大容量存储器:内存的容量很大,但还是有限的,并且掉电后内容会消失。大容量存储器则能在掉电后仍保存着里面的信息。于是数据、指令和信息都长期保存在磁盘上,仅在需要时临时读入内存。磁盘空间比内存便宜100倍,只是访问起来要慢得多。磁盘保存信息的方法是对旋转的金属盘片表面的磁性材料上的微小区间进行不同方向的磁化。计算机工作时的嗡嗡声和咔嗒声就是磁盘把磁头移向盘片表面正确位置时发出来的。标准笔记本盘片的直径是2.5英寸(6.25厘米)。有些计算机配备了固态盘(SSD),使用闪存代替了旋转的机械部件。闪存也是非易失性的,信息保存为电路里的电荷,每一个电路元件上的电荷不需要加电就可以保持其状态。里面保存的电荷可以通过测试来读取其中的值,也可以擦掉后用新的值覆盖写入。目前闪存仍然比同容量的传统硬盘贵,但是速度快、轻便、可靠并且节电,在手机、相机等设备中广泛应用,将来可能会替代机械硬盘。

各式各样其他设备也都发挥着特别的作用。用让用户提供输入的,如鼠标、键盘和触摸屏;有为用户提供输出的,如显示器、打印机、扬声器;网络部件,如以太网或无线网则用来和别的计算机通信。在体系结构示意图里,这些设备看上去是通过一组线缆连接在一起的。借用电气工程的术语,这组线缆称为总线。实际上,计算机内部有好几组总线,每组总线都有适合其功能的特性。比如CPU和内存之间的总线,线路短,传输快,但是价格贵;而连接到耳机插孔的总线,线路长,传输慢,但是价格便宜。有些总线在机箱外也露出了一部分,比如无所不在的通用串行总线,也就是把外设插入计算机所用的USB总线。

  • 物理构造

计算机电子线路基本元件中最重要的一种是逻辑门电路,用来根据一个或两个输入值计算一个输出值,也就是用输入的电压或电流信号来控制输出的电压或电流信号。只要把足够多的门电路用正确的方式连接起来,就能执行任何计算。查尔斯·佩措尔德的《编码·隐匿在计算机软硬件背后的语言》是介绍这方面的好书(PS:他还写过一本书,叫做《Windows程序设计》,也是如雷贯耳,影响甚广啊;另外我认为国内书籍中可与之媲美的就是李忠的那本《穿越计算机的迷雾》,都是不可多得的好书,值得翻阅)。门电路逐步经历了电子管、晶体管时代,而如今的逻辑门电路则是创建在集成电路上的(integrated circuits,缩写为IC,也称芯片或微芯片),集成电路在一个很薄的硅片平面里包含了电路板的所有部件和布线,通过一系列复杂的化学和光化学流程制造出来,这样就没有了分立元件,也没有了传统布线的电路。因此,集成电路比分立部件的电路小的多也可靠的多。

  • 摩尔定律

摩尔定律是由英特尔(Intel)创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这种指数式的增长,也就是我们所说的摩尔定律。用来描述电路规模的基本数值是集成电路里的特征尺寸(即其中的最小尺寸),比如导线的宽度。在过去的很多年里,这个数值在稳步缩减。如今的很多集成电路的特征尺寸是32纳米,也就是32米的十亿分之一,下一步将会是22纳米。对比一下,一张纸的厚度或者一根头发的粗细是100毫米,即十分之一毫米。到某个阶段,摩尔定律会失效。以前曾多次有人断定摩尔定律的极限已到来,但后来又发现了突破极限的方法。然而现在,我们已经到了这样的阶段:有的电路里仅包含极少数的原子,这么小的结构已经很难控制。CPU速度已经不再每两年翻一番。

比特、字节与信息表示

本章,作者主要论述了计算机表示信息的三个基本思想。

首先,计算机是数字处理器。它们存储和处理离散的信息,这些信息表现为不连续的块,具有不连续的值,基本上就是一个个数值。而与之相对的模拟信息,则是平滑变化的值。

其次,计算机用比特表示信息。比特就是二进制数字,即一个非0即1的值。计算机中的一切都用比特来表示。计算机内部使用二进制,而不是人们所熟悉的十进制。

再次,较大的信息以比特组来表示数值、字母、单词、姓名、音乐、照片、电影,以及处理这些信息的程序所包含的指令,都是用比特组来表示的。

  • 模拟与数字

生活中具有模拟性质的事物有:水龙头、汽车方向盘、温度计等,其值随着其他因素变化而平滑变化。变化过程没有间断,一个事物的微小变化就意味着另一个事物的微小变化。而数字系统处理的则是离散值:某个事物小小的变化,要么不引发其他事物变化,要么就引发其他事物的突变,使其从一个离散的值跳到另一个离散的值。很多现代的技术都是数字的。外部世界的数据——声音、图片、运动、温度等等一切,在输入端都会尽可能早地转化为数字形式,而在输出端则会尽可能晚地转换回模拟形式。原因就在于数字化的数据容易处理,无论最初来源是什么,数字化数据都可以用多种方式来存储、传输和处理,但模拟信息不行。此外,通过删除冗余和不重要的信息,还可以压缩数字化信息。为了安全和隐私可以对它进行加密,可以将它与其他数据合并,可以复制它而不出错,可以通过互联网把它发送到任何地方,可以将它保存到几乎无限种设备中。而对于模拟信息,上述很多做法是根本行不通的。

  • 模数转换

怎么把模拟信息转换为数字形式?通过下面几个简单的例子,可以说明一些重要的思想。

照片:胶卷相机的成像,是通过把胶片感光区曝露给被拍物体反射的光线实现的,胶片上不同区域接收到的不同颜色的光量不同,从而影响胶片上的染料。在胶片显影、印相时,彩色染料数量决定了显示出来的颜色变化。对数码相机来说,镜头把影像聚焦到一块位于红、绿、蓝滤镜后面的矩形感光器阵列上,感光器由微小的光敏探测器组成。每个探测器存储一定数量的电荷,与落在它上面的光量成正比。这些电荷被转化成数字值,照片的数字表示就是这些表现光强度的数值序列。探测器越小,数量越多,电荷测量的结果就越精细,数字化图像就能越清晰地反映原始的影像。传感器阵列的每个单元都由一组能够捕获红、绿、蓝光的探测器构成,每个单元对应一个像素。像素的颜色通常由三个值表示,分别代表红、绿、蓝光的强度,因此600万像素的图像总共要存储1800万个颜色值。屏幕在显示图像时,使用的是红、绿、蓝三元组的阵列,其亮度与像素亮度一致,如果我们用放大镜仔细观察手机或电脑屏幕,很容易看到每个独立的彩色块。

音乐:什么是声音?音源通过振动或快速运动引起空气压力的波动,人的耳朵把这种压力变化转换位神经活动,经大脑解释后就形成了"声音"。把空气压力随时间变化形象地绘制出来并不难,其中压力可以用任何物理方法来表示,在此我们假设用电路中的电压。当然,电流、光的亮度,以及爱迪生发明的留声机中的纯机械装置都没有问题。

图中声波的高度表示声音强度或大小,水平方向的坐标轴表示时间。每秒钟声波的数量就是声调或频率,假设我们以固定时间间隔连续测量这条曲线的高度(在这里就是电压值),就会得到下图所示的这些垂直线条。

测量得到的数值连接起来与曲线近似,测量越频繁越准确,结果也就越吻合。测量得到的数值序列是波形的数字化表示,可以存储、复制、操作它们,也可以把它们发送到任何地方。如果有设备把这些数值转换成对应的电压或电流,然后再通过电压或电流驱动音箱或耳机,就能够实现回放。从声波到数值是模数转换,相应的设备叫A/D(Analog/Digital)转换器,反过来当然是数模转换,或者叫D/A。转换过程并不是完美无缺的,两个方向的转换都会损失一点信息。但大多数情况下,这种损失是人所觉察不到的(当然,也有不少唱片发烧友会说CD音质不如LP好:)。

声音和图片经常会被压缩,因为这两种包含很多人类根本感知不到的细节。对于音乐,典型的压缩技术就是MP3,大约能把音频文件的体积压缩到原来的十分之一,同时让人感觉不到音质下降。对于图片,最常用的压缩技术就是JPEG(制定该标准的联合图像专家组——Joint Photographic Expert Group的缩写),它的压缩率也能达到十倍甚至更高。上文提到的很多处理对数字信息能做,但对模拟信息却很难,压缩就是一个例子。

电影:摄影师埃德沃德·迈布里奇在1870年代向世人证明,快速连续地显示一系列静态图片能够创造出运动的错觉。今天,电影显示影像的速度是每秒24帧,而电视大约是25到30帧,这个速度足以让人的眼睛把顺序播放的影像感知为动画。而通过组合(并同步)声音和影像,就可以创造出数字电影。而利用压缩技术减少空间占用,则催生了包括MPEG(Moving Picture Experts Group)在内的标准电影格式。

还有一些信息很方便以数字形式来表示,因为除了想好怎么表示它之外,根本不需要做什么转换。比如书本中的文字、字母、数字和标点符号。我们称之为普通文本。表示普通文本的最有名的一个标准叫做ASCII,即American Standard Code for Information Interchange(美国信息交换标准代码)。但它只包含了全部的英文字符,而不同的地区有不同的字符集标准,因此我们需要一个世界通用的标准,即Unicode码。它为所有语言的所有字符都规定了一个唯一地数值。

一言以蔽之,数字表示法能够表示上述所有信息,以及任何可以转换为数值的信息,因为有数值,所以就可以用数字计算机来处理。

  • 比特、字节与二进制

这个世界上有10种人:会二进制的和不会二进制的;这个世界上有10种人:会二进制,不会二进制的,和错把它当成二进制的:-P

数字系统用数值来表示所有信息,但使用的却不是我们熟悉的10进制,而是二进制(此处你应该做深思状,表示你的纳闷、怀疑),这是为什么呢?

首先,制造只有两种状态的物理设备,比制造有十种状态的设备更容易。而且世界上二选一的例子比比皆是,开关、真假、高低、左右、男女(不考虑例外情况:P),都可以用一个比特来表示。其次,相较于十进制算术,执行二进制算术的计算机电路要简单得多。冯·依曼很早就清楚地认识到这一点,他在1946年说过:"我们储存器中最基本的单位自然是采用二进制系统,因为我们不打算度量电荷的不同级别。"

在某些计算机广告中,我们会看到"64位"这个说法("Windows 7家庭高级版64位")。什么意思呢?计算机在内部操作数据时,是以不同大小的块为单位的,这些块包含数值(32位和64位表示数值比较方便)和地址,而地址也就是信息在RAM中的位置。前面所说的64位指的就是地址。

关于比特和字节,最重要的是必须知道,一组比特的含义取决于他们的上下文,光看这些比特可看不出来。一个字节可以只用一个比特来表示男或女,另外7个空闲不用,也可以用来保存一个不大的整数,或者一个ASCII字符,它还可以是另一种书写系统中一个字符的一部分,或者用2、4或8个字节表示的一个大数的一部分,一张照片或一段音乐的一部分,甚至是供CPU执行的一条指令的一部分。

深入了解CPU

CPU可以做出决定,尽管是简单的决定:它可以比较数值(这个数比那个数大吗?)或者比较其他数据(这段信息与那段信息一样吗?),还能根据结果决定接下来做什么,这一条最重要,因为这意味着CPU能做的虽然比计算器多不了多少,但它可以在无人看管的情况下完成自己的工作。正如冯·诺依曼所说:"要让这种机器完全自动化,即让它在计算开始后不在依赖人工操作"。由于CPU能根据它所处理的数据决定下一步做什么,因此它就能自己运行整个系统。虽然其指令系统并不大,或者说并不复杂,但CPU每秒可以执行数十亿次运算,所以它能完成极为复杂的处理。

  • 玩具计算机

作者在本章构造了一台假想的计算机,教给我们一些汇编指令,其中最重要的就是分支和循环。再加上一些其它为数不多的指令就足以应对数字计算机能够完成的任何计算——任何计算都可以分解为能使用基本指令完成的小步骤。这里值得注意的一点是,任务分解的思想很重要,尤其是在计算机领域里。

指令和数据在RAM中是如何表示的?一种可能性是:比如每条指令都需要一个存储器的位置存储其数值代码,而在该指令引用存储器位置或有一个数据值的情况下,还需要另一个紧随其后的位置,所以要占两个存储器单元。其中第二个单元中保存的是它引用的位置,同样假设数据值也要占用一个位置。这是一种简化,但实际情况也差不多。

  • 真正的CPU

真正的处理器执行循环:"取指令—译码—执行"这样的过程。只不过为了加快速度,还会配备精心设计的各种机制,但核心只有循环。

真正的计算机由一些移动数据的指令,一些完成算数运算及操作不同大小和类型数值的指令,一些比较和分支指令,以及一些控制计算机其它组件的指令构成。典型的CPU有几十到数百个不同的指令,指令和数据通常要占用多个内存位置,通常为2至8个字节。真正的处理器有多个累加器,通常是16个或者32个,所以可以保存多个中间结果,而且都是速度极快的存储器。

计算机体系结构是研究CPU与其他计算机组件连接的一门学科。计算机体系结构研究的一个问题是指令集,也就是处理器配备的指令表。是设计较多的指令去处理各式各样的计算,还是设计较少的指令以简化制造并提升速度?体系结构涉及复杂的权衡,要综合考虑功能、速度、复杂性、可编程能力(太复杂的话,程序员将无法利用其功能)、电源消耗及其他问题。设计师在设计体系结构的时候有一套方法可以使处理器跑的更快。比如流水线技术(CPU设计为交替地取得和执行指令,而同一时刻会有几个指令处于执行过程的不同阶段,结果就是,虽然某个特定的指令仍旧要花同样的时间完成,但其他指令都有机会得到处理,从整体上看完成这些指令则会快很多)、并行乱序(并行执行多条互不干扰、互不依赖的指令,有时候,只要指令的操作不会相互影响,甚至可以不按顺序执行)、同时运行多个CPU(就是"多核",在一块芯片上集成越来越多的处理器已经成为明显的趋势。由于集成电路特征尺寸越来越小,因而可以集成在一块芯片上的晶体管数量必将越来越多,这些晶体管可以构成更多CPU,也可以构成更多缓存)。

比较不同CPU的速度并不是特别有意义。即便是最基本的算术运算,其处理方式也可以完全不同,很难直接比较。比如,同样是计算两个数的和并保存结果,有的处理器需要用三个指令,有的则需要两个,而有的可能只需要一个。有的CPU具有并行处理能力,或者说能够同时执行多条指令,从而让这些指令在不同阶段上执行。为了降低处理器的耗电量,牺牲执行速度,甚至根据是不是电池供电动态调整速度都是很常见的。对于某个处理器比另一个处理器"更快"的说法,不必太当真,因为很多情况下都要具体问题具体分析。

  • 缓存

CPU与RAM和计算机的其他组件是如何连接的?处理器非常快,通常执行一条指令只需要零点几纳秒。相对而言,RAM则慢得让人难以忍受——从存储器中取得数据或指令大概要花25到50纳秒。假如CPU不必等待数据,那它可能早就执行完上百条指令了。现代计算机会在CPU和RAM之间使用少量的高速存储器来保存最近使用过的指令和数据,这种高速存储器叫做缓存。缓存是一个在计算机领域中广泛适用的思想。在CPU中,缓存是容量小但速度快的存储器,用于存储最近使用的信息,以避免访问RAM。通常,CPU会在短时间内连续多次访问某些数据和指令。而这些指令和数据都可以放在缓存中以提高访问速度。

典型的CPU有两到三个缓存,容量依次增大,但速度递减,一般称为一级缓存、二级缓存和三级缓存。最大的缓存能存储以兆字节计的数据。大多数CPU的指令和数据缓存都是独立的。缓存之所以有用,关键在于最近用过的信息很可能再次被用到,而把它们存储在缓存里就意味着减少对RAM的等待。缓存通常会一次性加载一组信息块,比如只请求一个字节,但会加载RAM中一段连续的地址。因为相邻的信息也可能被用到,要用的时候它们同样已经在缓存里了,换句话说,对邻近信息的引用也不需要等待。

除了发现性能提升之外,用户是感受不到这种缓存的。但缓存的思想却无处不在,只要你现在用到的东西不久还会用到,或者可能会用到与之邻近的东西,那运用缓存思想就没错。CPU中的多个累加器本质上也是一种缓存,只不过是高速缓存而已。RAM也可以作为磁盘的缓存,而RAM和磁盘又都可以作为网络数据的缓存。计算机网络经常会利用缓存加速访问远程服务器,而服务器本省也有缓存。

为了检查缓存的效果,可以做个实验,如:打开Word等大程序,看看从启动到加载完成并可以使用要花多少时间。然后退出程序,立即重新启动它。正常情况下,第二次启动的速度会明显加快,因为程序的指令还在RAM里,而RAM正在充当磁盘的缓存。使用其他程序一段时间后,RAM里会填满该程序的指令和数据,原先的程序就会从缓存中被删除。

  • 其他计算机

PC、MAC、手机、平板电脑,拥有嵌入式系统的数码相机、摄像机、GPS导航系统、家电、游戏机等等都是各色各样的计算机。所有这些计算机系统都有相同的基本原理。它们都使用通用处理器,可以通过编程完成无穷无尽种任务。每个处理器都有一个有限的简单指令表,能够完成算术运算、比较数据、基于前置计算结果选择下一条指令。不管物理结构的变化让人多么眼花缭乱,它们的一般体系结构从1940年代至今都没有太大的变化

硬件部分小结

可以看到,计算机的功能固然很强悍,但是我们还是有很多事物不知道怎么用比特表示,更不必说怎么用计算机来处理了。比如,日常生活中最重要的一些事物:艺术、创意力、真理、美、爱、荣誉和价值。我想在一定的时期内,这些事物将超出计算机的能力之外。如果你碰到一个人,他声称知道怎样"通过计算机"处理这些东西,可不要随随便便就相信他:P。

 

All Rights Reserved.
Author:海峰:)
Copyright © xp_jiang. 
本文是一篇读书笔记,辛苦劳作,转载请标明出处:http://www.cnblogs.com/xpjiang/p/4472041.html
以上.