如果算上高中的编程课,接触电脑有二十多年了。过去的二十年,几乎天天与电脑打交道,但直到今天,对于电脑是如何工作的,还是一知半解。二十年间,电路图画过、单片机用过、数电模电学过、C和Java写过、安卓游戏也写过,但就是没弄清楚,那一行行代码是怎么变成人类可以感知的东西在电脑上呈现出来的?所以,打算把电脑的工作原理好好琢磨一下,然后写出来。

好吧,上面这一段的想法给自己挖了个大坑。本来以为3天左右可以写出来的,结果前后搞了快2个星期,越写越发觉要搞清楚的东西太多了。也对,从第一台电脑诞生,到如今70多年了,70多年间无数天才积累下来的东西,要说清楚,好难,WTF。

要把电脑是怎样工作的这个问题说清楚,大概要从以下几方面来阐述:

1. 电脑究竟做了些什么?它的本质是什么?

2. 现代电脑的标准结构

3. 二进制与晶体管

4. 基础逻辑电路门

5. 全加器

6. 锁存器

7. CPU是怎样工作的?

8. 软件是什么?

9. 文件是什么?

10. 输入与输出设备的本质

11. 其它

12. 电脑是这样工作的

13. 杂谈

1.电脑究竟做了些什么?它的本质是什么?

要弄懂电脑是如何工作的,我们先想一下它到底做了些什么吧?

世界上的第一台电脑于1946年诞生于美国宾夕法尼亚大学,叫做ENIAC(Electronic Numerical Integrator and Calculator)。从全称“电子数字积分与计算器”,我们可以看出它是一台用来对数字做处理并得出运算结果的机器,而设计ENIAC的目的确实是为了计算出使大炮打得更准的射击数字参数。

七十多年过去了,现在各位家里的PC电脑,Mac Book,包含各位在看这篇文章时使用的手机,都未曾改变一个本质:它们都是一台对数据做处理的设备。是的,你没有看错,无论你打开的微信、刷的抖音快手、玩的吃鸡与英雄联盟、看的头条,无论多么酷炫的影音,无论多么黑科技的AI,它们一切的本质都是源于电脑(手机与PAD都是电脑的一种便携化变体)按照人类事先设计好的规则对数据进行采集、整理、转换与输出,没有其他。所以,电脑能做的一切,如果不计人力多少与时间长短,理论上人同样可以做到。

如果各位对这个观点表示怀疑,那么就请一步一步跟着看下去。

2. 现代电脑的标准结构

在正式开始之前,我们先看一下现代电脑的标准结构。现代电脑的结构称为冯诺依曼结构,由美籍匈牙利人冯.诺依曼提出,他同时也是博弈论之父。

以下是他提出的电脑结构:

1. 采用0和1构成的二进制工作。

2. 硬件上,电脑由五个部分组成:

- 输入设备(例如鼠标、键盘)

- 输出设备(例如显示屏、音箱)

- 运算器与控制器(这两个部分后来合为一体,也就是我们俗称的CPU)

- 存储器(例如内存、硬盘)

3. 程序(软件)需要先存储再执行。

一句话概括,电脑基于二进制工作,由软件和硬件组成;硬件包含:CPU、存储设备、输入与输出设备;软件需要存储之后再执行。

以下这张图来源于百度百科,是冯诺依曼结构的一个概要示意图。

3.二进制与晶体管

好了,让我们来正式开始阐述电脑是如何工作的。

电脑的运作,无论是硬件,还是软件,它们的基石都是二进制。

我们人类在日常生活中使用十进制,也就是满10进1。这不难理解,因为我们的双手是十根手指,原始人类在计数时很自然的会用双手来数数,每当数到10(用满10根手指)的时候,就记一个符号(进1位)。

而电脑是由各种电子元器件构成,对于电子元器件来说,它们的“双手”天然是“两根手指”。正负电子、正负电压、有电流/无电流、有电压/无电压,通通都是两种状态,所以使用二进制是十分符合电子元器件的天然特性的。另外,由于只有两种状态,降低了误判的概率,同时也降低了电子元器件的制作复杂度。

那么电脑里最基础最原子化的用来表示二进制的器件是什么呢?好比一个人是由一个个细胞构成的,那么电脑的细胞是什么?答案是晶体管,电脑的CPU和内存都是由晶体管组成的。

晶体管的种类很多,不一一介绍了,只说明一下它的基本特性。早期的晶体管如下图这样(图片来源于网络):

我们可以看到它有3根金属触角,分别为基极(B)、集电极(C)、射极(E)。以下图的NPN晶体管为例:

当基极(B)给正电流,集电极(C)就与射极(E)导通,也就是电流可以通过晶体管从C流到E;反之集电极(C)与射极(E)断开,也即电流无法通过。这像什么?是不是像一个开关,有打开和闭合两种状态,而这两种状态可以分别对应二进制中的0和1。

另外还有一种PNP晶体管, 逻辑刚好相反,当基极(B)给负电流,集电极(C)与射极(E)导通;反之集电极(C)与射极(E)断开。

就是这个晶体管,利用它的开关特性,让电脑的二进制(0和1)有了最基本的表现形式。具体怎么表现,我们下一节马上就说。

八卦两句,我们正在使用的各类CPU,都是由几亿甚至几十亿个晶体管组成。当然CPU里面用的晶体管不是上面的形状,否则别说几十亿,10个都塞不进去。CPU里的几十亿晶体管,它们是由光蚀刻技术在一整块硅晶片上,通过反复的光与化学作用刻录上去的。我们经常在新闻中看到的x纳米技术,就是指一个晶体管的大小。而全世界能生产出用于制作这种顶级芯片的光刻机的公司,有一家在荷兰,叫做ASML,是不是在很多新闻中也出现过?

4. 基础逻辑电路门

有了晶体管之后,通过各种晶体管的巧妙组合,我们可以做出几种常用的逻辑电路门(简称逻辑门)。它们是电脑运算数据的基础, 也是组成CPU的基本元器件。

这些逻辑电路门通常叫做xx门,它们的作用是按照一定的逻辑规则对于输入信号进行处理,转变为输出信号。就好比一扇神奇的门,一个人通过前可能是个中年油腻大叔,穿过这道门,就变成了十六岁的花季少女。

这些常用的门有:

1. 非门(NOT Gate)

2. 与门(AND Gate)

3. 或门(OR Gate)

4. 异或门(XOR Gate)

用非门做个详细说明,首先非门的魔法逻辑如下

也就是当输入为0时,输出为1;当输入为1时,输出为0。凡是入此门的都给你变化一下“性别”。

非门是如何通过晶体管来实现的呢?很简单,下面是示意图:

当输入端给正电流(1)的时候,由于晶体管是导通的,电流从晶体管流过,最终从接地处流出,那么输出端没有电流(0);当输入端没有电流(0)时,晶体管闭合,电流无法穿过晶体管流出,于是从输出端流出(1)。

依据同样的原理:

通过2个晶体管串联可以实现与门的逻辑

通过2个晶体管并联可以实现或门的逻辑

通过2个与门、1个或门、1个非门的组合(也就是7个晶体管),可以实现一个异或门

具体的实现方法这里不再详述,免得各位失去看下去的耐心。这里列一下与门、或门、异或门的魔法逻辑,供有兴趣的各位参考。

与门逻辑

或门逻辑

异或门逻辑(输入相同,输出为0;输入不同,输出为1)

5. 全加器

有了上一节介绍的基础逻辑门,我们可以利用它们组成很多神奇而复杂的电路。

第一个是全加器,全加器顾名思义是做加法的器件。

为什么要说全加器呢?因为它是电脑里一切运算的基础:

A-B,可以看做是数字A加上一个负数B

A*B,可以看做是数字A累加B次

A/B,可以看做是数字A不断的减去B,一直到不能再减(余数小于B)

人类如果用以上的方法来做乘除运算,不仅慢,可能还会被认为脑子被门挤了。但对于(早期的)电脑来说,确实是利用这样的逻辑在做乘除运算。其实,个人认为早期的人类也是用同样的方法在做乘除运算 :)

所以,我们得把全加器说清楚。首先,我们看一下全加器的输入和输出:

根据这样的逻辑,可以利用2个异或门+2个与门+1个或门来实现1bit的全加器,如下图所示(大家可以参照上一节基础逻辑门的逻辑表来验证):

上面这个1bit的全加器是用20个晶体管构成。

如果有点晕的话,我们画一个简单的符号来代替这个全加器,如下图:

把两个全加器级联起来,我们可以做出一个2bit的全加器,如下图:

以此类推,可以做出8位、16位、32位、64位的全加器。通常所说的32位处理器、64位处理器,就是指CPU(包含加法器)能处理二进制数字的最大位数。不论处理多少位的二进制数,它们都是由一个个晶体管构成。

6.锁存器

接着再来看锁存器,锁存器是可以在通电状态下记住二进制信息的电子器件,一个1bit的锁存器由1个与门+1个或门+1个非门组成,也就是5个晶体管。

它的魔法逻辑如下所示

- 当设置位为1,清零位为0时,输出为1

- 当清零位为1时,输出为0

- 当设置位和清零位都为0时,输出为上次的输出(如之前输出是1,那么就是1;之前输出是0,那么就是0)

所以,通过对设置位与清零位的操作,可以把输出设为特定值X;然后把设置位与清零位改为0,这时输出就被锁定为X,我们就此存储了1bit的信息!

基于以上锁存器原理,再加上一些控制器件(是否准许数据写入),一个完整的1bit存储器长这样:

- 当准许写入为0时,两个黄色的与门被关闭,无论输入数据是0或者1,这两个黄色与门输出始终为0,使得灰色的锁存器电路保持之前的值不变。

- 当准许写入为1时,两个黄色的与门被打开,输入数据可以通过

* 假设输入数据为0,那么黄色与门A输出为0,黄色与门B输出为1,根据锁存器的逻辑,存储数据被清零,相当于把输入的0写入存储数据

* 假设输入数据为1,那么黄色与门A输出为1,黄色与门B输出为0,根据锁存器的逻辑,存储数据被设置为1,相当于把输入的1写入存储数据

写到这里,不由得对发明这些逻辑电路的大神点个“赞”,真是太聪明了。百度了一下,没搜到锁存器的发明者,有知道的请留个言(微信公号好像还没开通留言功能,请发私信)。

有了1bit的锁存器,我们可以级联出8位、16位、32位、64位的寄存器;如果把这些寄存器排成纵横的矩阵,我们能得到什么?那就是内存,对,就是你电脑里用的8G、16G内存条!它同样由很多晶体管组合而成。

有了全加器,有了寄存器,接下来我们来看看电脑的大脑:CPU(中央处理器)。

7.CPU是怎样工作的

1971年,Intel推出了第一个微处理器4004,它是一个4bit的CPU,由2300个晶体管组成,长这样(图片来源于百度):

前文说过(第2节),一个CPU通常由以下两部分组成

- 运算器

- 控制器

运算器:由算术逻辑单元(ALU)和一堆专用寄存器组成,而ALU的主要组成部件就是上一节提到的X bit全加器。

控制器:用来控制指令的执行,具体一点说分三步:取指令,解析指令、执行指令,循环往复。指令是什么?一条条的指令连接起来,就是我们通常所说的程序(软件、APP),关于软件在下一节会详细说明。

我们先来看一下算术逻辑单元ALU,如下图所示:

- 两个输入数:A和B

- 一个输入操作码:告知ALU执行什么操作,例如:加、减、取反等等

- 一个输出数:输出按照操作码对于A和B操作之后得出的数

- 几个输出标记位:例如是否溢出,是否全零等

ALU的内部组成,以第5节介绍的全加器为核心,再加上一堆组合电路(由晶体管组成)来完成相应的逻辑操作与判断。

有了ALU,加上第6节介绍的由锁存器组成的寄存器和内存,再加上控制器,一个早期的CPU长这样,如下图所示:

首先

- 软件或程序(很多指令的集合体)被装载进内存

- 软件运行需要使用的数据也被装载进内存

接着,控制器按照取指令、解析指令、执行指令的步骤循环往复的执行软件指令。

- 控制器根据指令地址寄存器里的值,上图中是0,去内存中对应的0地址位置读取指令,并把指令1100 0011存进指令寄存器

- 控制器用指令寄存器的前4位1100,通过内部的指令逻辑判断电路,得出指令是“把数据存进寄存器C“,也即LOAD C

- 控制器根据指令寄存器的后4位0011(也就是十进制的3),去对应的内存地址第3位取出操作数据00001111,并把数据存进寄存器C

- 接着控制器会把指令地址寄存器的值设为0000 0001,也即下一条指令的位置

如此第1条指令就执行完成了!

如果要完成1+1的求和运算,首先1+1会被翻译成n个二进制指令(下一节介绍翻译的步骤),并被放入内存中的一个区域,接着CPU根据顺序来执行指令。例如把1放入寄存器A,把另一个1放入寄存器B,把A和B作为ALU的两个输入,通过操作码命令ALU计算两个输入之和;从ALU拿到输出2之后,存入寄存器C,然后把寄存器C的值回写到内存里的一个指定位置(此处需要动画 -_-!)。

至此,CPU是如何通过一个个晶体管组成的电路来工作的,已经说明完毕。

重复前文所说的,无论你打开的微信、刷的抖音快手、玩的吃鸡与英雄联盟、看的头条,无论多么酷炫的影音,无论多么黑科技的AI,都是由大量这样的一条条指令以及二进制数据构成的。这些指令无一例外都是对数据的操作,操作之后的数据通过各类输出设备(屏幕、喇叭、耳机)转化为图像声音呈现给你的眼睛和耳朵。来,让我们继续探索之旅。

8.软件是什么?

上一节提到,软件是很多指令的集合体,这听上去还是很抽象。

下面是一个C语言初学者基本都写过的程序,程序的作用是在电脑屏幕上显示一行字“Hello World”。

这样的程序人类可以读懂,对不起,应该是非典型性人类(程序猿)可以读懂。但是电脑收到这些符号的内心是万马奔腾的,如果电脑有表情的话,它一定是懵逼脸。

前文说过,电脑的世界是二进制的,它只能理解0和1组成的文字,在电脑的世界里,程序应该长成这样:

但电脑爽了,人类却一脸懵逼了。不得不说,最早的程序猿们写出的正是0和1组成的代码。

如果保持用0和1来编程,相信到了2046年,人类也用不上微信和头条。幸运的是,有人发明了汇编语言,它长成这样(下图来源于网络)

有了汇编语言,程序猿们可以直接操作数据和寄存器来完成程序的编写,然后由汇编器把汇编语言翻译成机器可以读懂的0和1组成的机器指令。

再接着,有人发明了高级编程语言,使得程序猿不必再关心具体的寄存器和数据,可以把注意力和智慧专注在程序逻辑的设计上。第一个得到广泛使用的高级编程语言是FORTRAN(Formula Translation的缩写,又一个电脑和数据计算相关的佐证),大约诞生于上世纪五十年代。之后陆续诞生了大家(也许只是程序猿)耳熟能详的的各个高级语言:BASIC、C/C++、Java、Python、Go等等。

所以当程序猿用高级编程语言写完一段程序后,首先由编译器把高级语言翻译成汇编语言,然后再由汇编器,把汇编语言翻译成机器指令。

程序(软件/APP)实质上是很多0和1组成的二进制机器指令的集合,是由程序猿采用高级编程语言编写,通过编译器和汇编器翻译而来,也即程序归根结底也是一堆0和1组成的数据!

9.文件是什么?

第7节介绍CPU怎样工作的时候,我们提到了程序和程序运行时需要用到的数据被存放在内存中。通过第8节我们已经知道程序的本质,那么数据的本质是什么?

首先,数据来源于电脑硬盘里存放的每一个文件。无论一份word,一段视频,还是一个程序,它们都是文件或者由很多文件组成。在操作系统里,文件长这样:

同样,这样的形式,人类看得懂,电脑会懵逼。那么一个文件,电脑为什么能看懂呢?因为它的本质也是一堆0和1组成的数据。

以txt文件举例,txt文件的内容是由很多字母和符号组成。这些字母和符号是按照ASCII码表的规则映射为对应的二进制数字存在电脑里,如下所示

电脑要从众多的文件类型中区分一个文件是不是txt文件,需要在这个文件前面加上约定的元数据(Meta Data),同样meta data也是一串0和1组成的二进制数据,只是有一定的规律可循,这里不再展开。

以此类推,声音、图像等文件也是一堆0和1组成的二进制数据,具体的原理,请看下一节。

10.输入与输出设备的本质

说了这么多,人们操控电脑终归要依靠键盘和鼠标;而感知电脑里的丰富内容,则需要通过屏幕和音箱,所以这一节就说一说电脑输入和输出设备的本质。

输入设备-键盘

键盘相对简单一些,当你在键盘上敲击每一个按键的时候,这些机械动作会被键盘转化为特定规则的电信号,通过有线/无线的方式传输至电脑。这些电信号,不用问,代表的又是一串0和1组成的二进制数字。

当电脑的BIOS(基础输入输出系统)接收到这些二进制数字后,会把它们传送给操作系统(例如windwos),然后再由操作系统转交给具体的程序,最后由程序根据自身的设定来做出相应的反馈。例如我们按一下空格键,word程序会空一格,FPS游戏中的人物通常会跳一下,而视频播放器会暂停/开始播放。

输入设备-鼠标

鼠标有两个基本操作,滑动和点击按键。按键的原理和键盘一样,不再赘述。

关于滑动,无论是早期的机械鼠标,还是现在的光电鼠标、激光鼠标,都是通过机械滚动或者光电感应来感知鼠标的移动方向和距离,并把这些信息转化为数字电信号(0和1组成的二进制数字)传送给电脑。接着通过BIOS->操作系统->应用程序的路径,来做出具体的响应。

输出设备-显示器(屏幕)

电脑的显示器,可以看成一个由大量小点构成的矩形方框(如下图示例,咦,为啥下意识的又画了个2)。

- 显卡从各类程序或者图形文件里读取每个小点的颜色再填充进各个小点里。

- 当显示器(屏幕)上可以显示的点足够多时(例如iphone11的屏幕上大约有155万个这样的点),最终就会呈现出非常细腻的图像。

- 同样,每一个点的颜色又是0和1组成的二进制码。我们知道由红色、绿色和蓝色按比例组合可以调合出任意一种颜色,一个点的颜色信息正是记录了红绿蓝三色的配比。假设我们分别用8位二进制数来记录红绿蓝三种颜色,那么一共需要24个0或者1来组成一个点的颜色信息。例如(00000000, 00000000, 00000000)代表的是黑色,(11111111, 11111111, 11111111)代表的是白色。

- 那么显示器拿到显卡传来的这些0和1组成的颜色,又是怎么通过光电转换为真正的色彩呈现给人眼的?饶了我吧,臣妾确实不想再去深究了。

- 显示器会以很快的速度刷新每个点显示的颜色(大约1秒60次,也就是60Hz;高级一点的显示器可能到了120Hz,也就是1秒刷新120次),所以在屏幕上能呈现出视频动画效果(你以为自己刷完了一部片,实际你只是以很快的速度看了很多图片,再配上音乐)。

串联一下,前面提到按空格键时FPS游戏的人物会跳一下,这个过程实际上是这样的

- 键盘把空格键按下弹起的动作转换为一串0和1的数字传递给电脑的BIOS

- BIOS把这串数字交给操作系统,操作系统再交给对应的游戏,比如吃鸡或者CSGO

- CPU根据这串0和1的数字,跳转到内存中相应的游戏指令,开始执行;也就是把人物跳一下的动画(0和1组成的数字)传递给显卡

- 显卡通过驱动程序把这些0和1组成的数字,按照1秒60次的速度在屏幕上刷新

- 于是通过屏幕上图像的变化(0和1数字值的变化),你的眼睛看到人物跳了一下

所以,你以为是在打游戏,而实际上你是在操作无数的0和1。

输出设备-音箱和耳机

音箱和耳机都是用来输出声音的,先来看一下声音的本质。

声音实际上由物体的振动(例如人类的声带)引发空气的共振,产生声波,进而传入人类的耳朵,引起耳鼓的振动从而带动听觉神经,再传输给大脑感知。所以没有空气的地方是没有声音的,例如太空。下图是声波的示意图(此图来源于网络)

既然声音是一种振动的波,和图像显示的道理一样,如果我们用数字来代表每一个时刻声波的幅度,当这些数字的密度足够大时(例如一秒钟采集44100次),就可以记录下声音。

然后,电脑把这些数字声音信息传递给喇叭或者耳机,由它们把数字声音信息还原为振动,声音就被再造了出来。

那么问题又来了,郭德纲和迪丽热巴都说了一句“新年好”,按上面的理论波形应该是一样的,那么请郭老师来做程序猿鼓励师和热巴的效果不就一样了么?好吧,这里又涉及到很多声学知识,恕臣妾无能为力了,以我有限的知识,这里面涉及到formant(共振峰),当采样密度足够大的时候,这些声音特征信息也被保留在了这数不清的0和1之中。

11.其它

至此,电脑每个主要部件运作的基本原理都弄清了。当然还有很多没说的,例如

- 硬盘的数据存储原理

- CPU的工作频率(这是驱动CPU处理数据的源泉,要说清楚估计又得开一篇)

- 操作系统(例如windows)的作用

- 互联网和云

- AI

这些点和一台电脑的基本运作关(yin)联(wei)性(wo)不(hen)大(lan),就不再详述了。

稍微展开两个点:

互联网是什么?互联网是一个传播媒介,它把一台电脑里存储的0和1的二进制数据,按照约定好的规则发送给另一台电脑,比如你敲的字、P的自拍都被转化为0和1,传到另一台电脑(手机)上,再由接收的电脑(手机)按照上一节介绍的图像和声音的呈现方式呈现出来。

云呢?云不是天上的棉花糖,云是一台或者多台通过互联网连接起来的电脑,它们可能在佳木斯,可能在贵州的某个山里,还可能在隔壁老王家,反正不在你家。这些云端电脑存储了一些我们自己电脑不具备的信息,或者能处理一些我们自己电脑无法处理的任务,例如:转点钱、买点货、人脸识个别、看个小电影,诸如此类。它们的本质是提供我们没有的数据,或者处理我们不能处理的数据,而这一切都是基于互联网来实现。

AI呢?AI也是数据和数据的处理,更复杂一些而已,比如从图中识别一条狗。人类认识一条狗,是从小时候起无数次路上遇条狗,被大人灌输:“离远点,当心被狗咬。”久而久之,就认识狗了。AI也是一样,用无数张带有狗或者不带狗的照片传进AI系统,告诉它这是条狗或者这里没有狗,AI通过算法总结出狗的样子,当下一次你给AI一张照片时,它就能判断出照片里有没有狗。

当然,还有终极AI(这可能是终结人类社会的终极),这类AI就像人类一样具有自我发现和自我创造力。牛顿家亲戚从来没有告诉过牛顿万有引力,但他自己发现了万有引力;冯诺依曼的老爸老妈不知电脑为何物,但是他却能准确定义出电脑的结构。同样,终极AI可以不依靠人类的输入,自我发现宇宙自然的规律,或者创造出新兴的事务。这一天,无法说还很遥远,记得二十多年前当深蓝战胜卡斯帕罗夫的时候,人们说电脑在围棋上永远无法战胜人类,因为围棋的变化是无穷的。可二十年的时间,人类最好的围棋国手已被电脑击败。

扯远了,让我们用一个例子来看看电脑到底怎样工作的。

12.电脑是这样工作的

举个什么样的例子合适呢?太复杂的怕说不好,用hello world举例有点脱离时代,思来想去,小视频那么火,那么就举个例子:大家在手机上点击抖音、快手小视频并播放出来的过程。

先说明一下,手机也是电脑的一种,是电脑的一种便携化变体。鼠标被触摸屏取代,键盘被触摸屏+软键盘取代,加上了电话功能,其余没有大的不同。一句题外话,个人判断电话这个功能终有一天要消失,取而代之的是通过互联网模拟电话功能的通话软件。

当年大明湖畔的夏雨荷,发生了这么几件事(以下步骤为了说清楚还是忽略了很多细节,轻拍)

a. 首先,程序猿们按照产品经理和设计狮们的设定,通过好几种高级编程语言,把抖音/快手APP的操作逻辑编写好。再通过编译汇编的过程,把高级语言转化为电脑可以理解的0和1组成的机器指令。这些指令一部分被放在云端的电脑上,另一部分被用户下载安装到自己手机存储空间的某个位置,回顾下这样图。

b. 当用户点击APP图标时,触摸屏感知到手指的触达与松开(机械能),它把这些动作转化为相应的数字电信号,也即一串由0和1组成的二进制数字。这串数字包含了一些信息:触压点的坐标、手指触压的动作、手指脱离屏幕的动作(松开)。

c. 这串信号被传递给手机的操作系统(安卓或者IOS),操作系统判断出触压坐标点对应的程序是抖音/快手APP。于是操作系统把APP从手机的存储空间里唤起,也就是把APP的一条条指令装载进手机内存中,回顾下这张图。

d. 手机CPU中的控制器,从内存中APP对应的第一条指令处开始执行。这里面涉及很多指令,但必然有指令是读取APP用户界面的图片颜色与文字信息(实际上有很多张图片,有些图片还是从云端获得,这里简化为一张图片;且过程中省略了GPU的概念)。当屏幕的上百万个点的颜色信息被读取完毕后,这些信息被推给屏幕的驱动程序去驱动屏幕的硬件做出响应,在每一个小点上显示出对应的颜色信息,先回顾下这张图。

于是我们看到了APP的首页(如下图),接下来我们点击这几个视频当中的一个

e. 手机的各个部件重复步骤b,触摸后产生的0和1二进制信息被传递给操作系统,操作系统进一步传递给APP,而APP根据坐标信息判断出用户点击的是哪一个短视频。这一过程的实质是触摸信息被存放于内存的某一个地址中;CPU控制器的指令地址寄存器移动到操作系统指令对应的地址,执行后再把指令地址寄存器移动到APP指令存放的对应地址。

接着CPU控制器开始执行APP的播放视频相关指令,由于视频的内容存在云端,所以首先要从云端获取相应的视频文件。这时APP按照互联网传输协议的规定格式,开始准备相应的指令,以便这些指令能被顺利的传递到云端的电脑上,进一步从云端电脑获取视频内容。

大家心里可能会有疑问,这么复杂的功能,那个CPU中看似简单的ALU能处理么?答案是肯定的。APP发到云端的指令,它的本质还是一串符号。我们假设这串符号为“play”(实际上远比这复杂),那么CPU的工作就是通过ALU的计算,在内存中的某一段中存下这个指令。

在前文提到的ASCII表中,p对应二进制符号0111 0000,l对应二进制符号0110 1100,a对应二进制符号0110 0001,y对应二进制符号0111 1001。在一个32位的CPU体系中,按如下步骤可以组成play:

- 把0111 0000(p)通过ALU左移24位,存入寄存器

- 把0110 1100(l)通过ALU左移16位,存入寄存器

- 把0110 0001(a)通过ALU左移8位,存入寄存器

- 把0111 1001(y),存入寄存器

- 把四个寄存器的数字依次相加后得到E,并把E存入内存中

指令组合完毕,CPU再转去执行网络驱动的指令,驱动网络硬件把这些0和1的二进制字符转换为电磁波发送给中国移动的交换机(一台负责转发信息的电脑),最终这串0和1的指令进入云端的电脑。

f. 云端的电脑按照指令准备好相应的视频数据(包括图像和声音,一长串由0和1组成的二进制数字),通过互联网返回给用户的手机。这时手机里的CPU跳转到屏幕和喇叭的驱动程序指令地址开始执行指令,把图像和声音数据分别传送给屏幕和喇叭,通过快速的刷新数据,图像和声音就被连续的呈现出来了(其实图像和声音是串行执行的,只是因为切换的速度很快,人类的感知才认为是同时播放的)。

注:实际的步骤更复杂,云端先返回视频存放的地址,再由手机去相应的地址获取数据;而数据也不是一次性传输完,是分段传输的,为了描述简单就当做一次性都返回了。

至此,好像简单梳理了一下电脑的工作流程,但感觉又好像什么都没说明白 -_-! 只能写到这个程度了,见谅。另外,由于涉及的领域众多,时间仓促,如有错漏之处,请各位海涵。

13.杂谈

在写这篇文章的同时,杂七杂八想了很多,画蛇添足扯一扯吧,毕竟2020年的春节待在家里码字是最安全的 :)

社会发展为何加速?

在我们祖父、父辈的那个年代,时间过去5年、10年,甚至30年,都感觉不到太大的变化。可进入21世纪后,明显感觉到随着时间的推移,社会发展的速度越来越快,以至于30-40岁的人都开始觉得有点儿跟不上了。

互联网、移动互联网、AI,一个紧跟一个。不但个体容易被淘汰,就连头部公司的更新换代也越来越快,5年就可能产生一个新的巨无霸。

个人认为,社会演进的加速,来自电脑和相关技术的普及。

电脑大规模普及之前的社会,人类的处理速度限制了事物发展的速度。电脑的普及,从方方面面提升了演进的速度;而且随着时间的推移,加速度越来越大。

例如信息的交换,以前发一封信需要几天的时间才能到达,而如今只需要几秒;当信息交换加速,提升了沟通效率,于是很多事情的决策变快了。

例如设计,无论是基础设施设计还是产品设计,没有电脑之前,需要人们手工画图并且推演各种数据进行论证。有了电脑辅助之后,加速了。

例如资金,资金是很多事物发展的助推剂。银行电子化之前,资金需要在各类实体间转运,即使是支票,也需要一定的时间成本来兑现。而现在,只要几秒钟,资金就可以在全球流转;资金流转的加速,推动了社会演进的加速。

再例如教育,社会的演进离不开人才。电脑普及之前,培养一个职业人才需要大量的言传身教。电脑普及之后,知识的传播提速了。社会发展需要的方方面面的人才,可以快速的培养与获取。因此,也推动了社会的演进。

当AI时代来临,这个加速度还会进一步的提升。“三十年河东三十年河西”这句老话,恐怕得变为“三年河东三年河西”了。

中国在电脑技术基础领域,什么时间可以追上世界水平?

这篇文章涉及了电脑相关技术的很多基础领域,但这些可能只是九牛一毛;而且技术的深度,估计也就高中到大一的水平。

但我们国家每年毕业的几百万大学生里,到底有多少人是钻研这些领域的呢?在初高中,到底有多少有天赋的00后能获取学习到相关的技术知识呢?

我们所看到的,是大量优秀的有天赋的人才流向了可以快速挣钱的行业(应用软件研发、应用芯片研发、AI应用、互联网金融等等)。无一例外,都是技术的组合应用。

如果拿造楼来比喻,我们不缺建筑师、不缺设计师、不缺施工队,但造楼的水泥、钢筋我们自己做不出来,得依靠别人。而电脑技术基础领域的水泥、钢筋,其技术复杂度要更胜一筹。

这一类的人才不是集中培养几个人就可以出来的。集中培养,我们可以造出世界第一的超级计算机,但是我们造不出世界通用的芯片架构。要追上世界水平,需要依靠大量的人才梯队。随着时间的推移,一些人在发展竞争中从梯队里崭露头角。道理和中国足球一样,没有足够的梯队,就永远没有11个世界水平的主力。

所以,当我们的电脑技术基础教育能真正夯实,吸引大量的年轻人进入方方面面相关的领域(底层芯片设计、软件编译器设计、光刻机制造、新电子材料研发等等),以这个时间为起点,再过20年,才有可能追上世界水平。

好了,就扯到这里了,祝各位阖家安康、开工大吉!

写在最后

此文完成之时,疫情还没有很糟糕。那么现在,就再写点什么吧。

鼠年的正月初八,街市的冷清与医院的喧嚣是这个春节的主旋律。圈里的热度不减,各类关于新型冠状病毒的消息铺天盖地,而我自己也不由得为这场信息漩涡添加了一份助力。

记起1999年我们在南联盟的大使馆被炸,一时群情激奋,各类游行请愿。而我所在的学校还专门开了辩论会,那个纷杂的现在看来毫无意义的辩论会,已然记不起辩题到底是什么了。只记得在旁观了很多人的慷慨陈词之后,轮到自己时说了一句冷场的话,大意是这样:“现在坐在这里的每一个人说的每一句话都毫无意义,对于太平洋另一端的那个国度毫发无伤,我们只是在安慰自己。如果要做点什么,我们应该好好学习。大家都这么做,将来就不会再发生同样的事。”感谢过去这二十年里,那些默默用自己所学为我们这个国度添砖加瓦的普通人,正是千千万万这样的普通人使得我们今天不会再遭受二十年前的屈辱(同样的戏码,前段时间刚刚发生在伊朗头上)。

正如此,今天的我们如果希望将来不再出现类似的情况,能做的就是做好自己分内的事儿,让我们的国度在方方面面继续一点一滴的强大起来。怒其不争也好,哀其不幸也罢,意见要表达,但行动更重要。捐钱捐物资,不占用有限的医疗资源;等到情况好转的时候,多出去吃吃饭购购物,多加加班,便是行动。而魑魅魍魉,已然曝露在光天化日之下,自会有人收拾。

做了n年程序猿,才知道电脑是这样工作的相关推荐

  1. 金领航三版网站程序总是出问题,如何做个好的程序猿?

    金领航三版网站程序总是出问题,如何做个好的程序猿? 王明富是金领航网的CEO,他最近花费大量时间雇佣.评估很多不同的程序员,并和他们一起协作.在这个过程中他发现并总结了十种程序员无法意识到自己潜力的原 ...

  2. 段子合集|做一个欢乐的程序猿!

    1 问:程序猿最讨厌康熙的哪个儿子?. A.皇长子允禔 C.皇八子允禩 B.皇三子允祉 D.皇十六子允禄 点击空白处查看答案 C 皇八子胤禩.因为他是八阿哥(bug) 2 程序猿要了3个孩子,分别取名 ...

  3. 内涵!!!程序猿才懂的动图...

    bug多了,总有一个把你坑了 产品经理跟程序员提需求时 线上运行时出现bug 自动化一切,避免手动出错 只要功夫深,EJB也可以写Hello World 咱们做项目,没有高质量的IDE工具可不行 线上 ...

  4. 幽你一默:江湖上流传只有程序猿才懂的幽默

    亲试只有程序猿知道的梗 1.一程序员去面试,面试官问:"你毕业才两年,这三年工作经验是怎么来的?!"程序员答:"加班." 2.某程序员对书法十分感兴趣,退休后决 ...

  5. 程序猿才感同身受的10个图!

    1 当我决定整理代码后-- %@#¥#-- 2 现实中的编程 VS 电影里的编程 3 尝试修改多年没人改动的代码 4 开发快完成时,产品经理提出要改需求后,程序猿脑中的情景 5 一张图看懂 try.. ...

  6. 到底应不应该学代码,要不要做人们口中的程序猿。

    前言 今天我们说说编程之外的事情,就是要不要学程序.女生应该学程序吗? 编程是近几年非常热门话题,大家都知道编程属于费脑的工作.我们的七大姑八大姨都不知道编程是干什么的,但他们一听是学编程的,就知道这 ...

  7. 程序员笑话:只有程序猿才看得懂

    1.世上有10种人:懂二进制的和不懂二进制 2.程序员写诗: 我一直以为 愚蠢是一个 抽象类, 但却发现了你这个实例.我以为微软错了,然后拨开你的封装,才发现,原来你还是无耻,无能,变态的子类. 更让 ...

  8. 做了5年程序员才明白,这项能力原来这么重要

    对于每一个工程师,似乎都在工作.学习中遇到以下这几样问题: 毕业季找工作的时候,即使是名校毕业,企业也都会优先考虑数学专业的毕业生,因为数学越好,越容易上手: 每次找工作的时候,都想从小公司向大厂跳槽 ...

  9. 打印心形图案---程序猿才有的浪漫---入门级---C语言实现

    ❤❤❤给初学者们的浪漫❤❤❤ 1.效果展示 2.打印思路 3.配色优化 1.效果展示 2.打印思路 我们整体上可以将心形图案划分为三个部分: 1.心形上方的两个梯形(3行) 2.心形中间的一个矩形(3 ...

最新文章

  1. Linux 下五款出色的流媒体客户端
  2. Intel VT学习笔记(七)—— EPT物理地址转换
  3. bzoj1051 [HAOI2006]受欢迎的牛 tarjan缩点
  4. 2018“百度之星”程序设计大赛 - 复赛
  5. [转帖]Oracle 11G RAC For Windows 2008 R2部署手册
  6. python爬虫bs4_Python爬虫系列-Xpath自如和bs4链家
  7. 转:oracle常见重要视图-v$sql,v$sql_plan,v$sqltext,v$sqlarea,v$sql_plan_statistcs
  8. QA: c# IHttpFactory配置代理或者HttpClient配置代理
  9. TCPDUMP 用法(转)
  10. 2020图灵奖颁给“龙书”两位作者!合作数十年,他们让计算机读懂码农代码
  11. SAP SLT数据同步配置
  12. 十二星座匹配对象_水瓶座最佳配对对象是谁
  13. win10设置护眼颜色(豆沙绿)
  14. 电子竞技——靠智力取胜的体育项目
  15. KO data-bind=“click: func“函数自动执行问题
  16. i7处理器好吗_英特尔酷睿i5处理器和i7有什么区别
  17. 学会这三招引流方法,让你的淘宝店铺流量暴增
  18. c语言程序设计实践万年历,c语言程序设计万年历-20210408030342.docx-原创力文档
  19. word中怎么看图片内存大小
  20. python判断三角形是否直角_Python3如何判断三角形的类型

热门文章

  1. Android项目实战登录注册
  2. LoadRunner 中的 Unique Number 参数类型小结
  3. 基于事件的异步模式概述
  4. 看上冰岛的域名con.is
  5. Storm-Engine 基于 C++ 的开源游戏引擎
  6. 最好免费的 HTML5 JS 网站视频播放器收集
  7. javascript绘制静态或者动态的图表、关系表、流程图-JointJS
  8. 文件名lin.php是什么,宝塔面板-PHP服务添加‘扩展名=ixed.5.4.lin
  9. mysql 存储过程 out cursor_Mysql存储过程中使用cursor
  10. 什么是mysql事物定义_MySQL中事务概念的简洁学习教程