对于程序员,那些既陌生又熟悉的计算机硬件

程序员一步入中年,不知不觉便会被铺天盖地的“危机感”上身,曾经的那个少年已经不在,时间就是这样公平。就算你能发明c语言,随着时间的推移,你注定还是要成为慢慢变蔫的茄子,缓缓变黑的葡萄。

看着乐视退市的消息,周末我赶紧拉着儿子的小手,复习起了大学那曾经考试”满分“的计算机基础,你别说,只读了一小部分我就发现一个事实,记忆力果然指数级下降,儿子一遍就可以熟记,我却衰退的就像没上过大学。

原来程序员写的程序实际上就是一个由0和1组成的位序列,或者说是比特序列,8个比特(bit)被分为一组,称为字节。系统中所有的信息,包括网络传送的数据,内存中的数据以及磁盘文件,程序等,都是由一串比特(bit)表示的。如果你要问为什么非要8个字节呢?难道不会百度吗?我又不是计算机发明者_。可能有一点非常重要,你可以拿去和面试官吹水:一个同样的字节可能代表一个整数,浮点数,甚至字符串,区分他们的唯一方法是这些数据的上下文信息。

顺便提一下,在计算机中数字的表示方式其实是对实际值的有限近似值,只不过一些高级语言对这些值处理的很好而已,不得不吐槽,JavaScript在处理这个问题上做的不是太好,不信你可以浏览器的F12 运行一下

0.1+0.2
0.30000000000000004
0.01 + 0.05
0.060000000000000005

言归正传,作为一个有着”代码改变世界“梦想的程序员,对自己手艺要精益求精,就必须了解你的真爱的物力构成。无论多diao的软件都运行在硬件基础之上,虽然近几年硬件的发展速度比你衰老的速度还要快,但是核心内容几乎没变,这才是你真爱的裸妆。

CPU

先撸一下这个不成熟的百度百科

中央处理器(CPU,central processing unit)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元

说的直白一点,这个家伙几乎是软件运行的核心,是解释和执行指令的引擎。目前主流的cpu的核心是一个32位或者64位(未来还可能更大)长度的存储设备或者寄存器,被称为程序计数器(PC,一个蛋疼的简称)。在任何时刻,程序计数器都指向内存中某条指令的地址。

CPU表面上是按照一个特定的模型去执行指令,这个模型由指令集的架构来决定的(每个架构类型都不一样,所以才会有AMD,Intel)。自系统通电开始,直到系统断电,CPU一直都在不断的执行指令。如果没有实际的软件执行指令呢?拿windows来说,软件层虚拟出来了一个“System Idle Process”进程,被称为系统空闲进程,这个进程会告诉cpu挂起(停止工作),所以这个进程的cpu使用率和其他进程是相反的意思,它的使用率越高说明CPU的压力越小。

CPU从程序计数器指向的内存地址读取指令内容,并解释该指令执行指令的操作,然后更新程序计数器,使他指向下一条指令,而这条指令很有可能和上条指令并非相邻。简单来说,cpu可能会频繁的执行以下操作

  1. 数据加载:从主存复制一段数据到寄存器,以覆盖寄存器中原来的内容。
  2. 数据存储:把寄存器中的一段数据复制到主存的一个位置,以覆盖主存原来位置上的内容。
  3. 指令操作:把两个寄存器的内容复制到逻辑计算单元,逻辑计算单元会对这两段数据做指令运算,并将结果存储在一个寄存器中。
  4. 指令跳转:从指令本身抽取一段内容并复制到程序计数器中,以覆盖程序计数器中原来的值。
主存

老规矩,没有百度不到的知识,一个没有百度百科的名词,说明不是很有名

主存储器(Main memory),简称主存。是计算机硬件的一个重要部件,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。现代计算机是为了提高性能,又能兼顾合理的造价,往往采用多级存储体系。即由存储容量小,存取速度高的高速缓冲存储器,存储容量和存取速度适中的主存储器是必不可少的。主存储器是按地址存放信息的,存取速度一般与地址无关。

主存是一个临时的存储设备,在程序被执行过程中用来临时存放程序内容和处理结果。从物理来讲,主存是由一组动态随机存取存储器芯片组成(你可以想象成一大排二极管),从逻辑上来讲,主存是一个线性的字节数组,每个字节都有一个唯一的地址,这些地址是从0开始的,现在主流的主存在个人计算机上已经是16G的大小,让我这个还在用4G主存的老人无言以对呀。

输入输出设备

当年计算机第一堂课,那个地中海的老师就讲过这个概念,虽然具体内容现在已经和我的秀发一并褪去,但是每天的工作中还是能偶尔看到IO这个词。

IO(输入输出)是系统与外部世界的连接通道,像我们每天撸王者农药的鼠标键盘,释放压力看小电影的高清显示器,存储苍老师的磁盘等等,这些都隶属于输入输出设备。

每个IO设备都有一个控制器或者适配器,它是和系统交互的途径,一般都和IO总线连接。说直白一点,每个IO设备都有它的驱动程序,要不然系统不可能无缘无故就能使用键盘鼠标这些设备的,即使现在的外设都是免驱的。

系统总线

总线是连接整个系统的桥梁,物理上是一组电子管道。他负责携带信息字节并在各个组件之间进行传递,就像我们软件系统设计SOA中的总线。总线根据系统定义的位数来传输定长的数据,每个系统都不一样,不过现在主流的长度要么是四个字节(32位),要么是8个字节(64位)。从这里就可以联想到,64位的系统在数据传输速度上要比32位的系统快一倍,也许将来很快会迈入128,256时代呢

如果非要加一张图的话,此图最有代表性
image