学习目标
本篇文章我们会从工程师的角度解释计算机是如何工作的,本篇的主要目标是希望能够让家了解计算机的核心工作机制后,打破计算机的神秘感,并且有利于理解我们平时编程时的一些行为、动作的历史渊源。
1.计算机的发展史
1946年,第一台计算机“ENIAC”诞生于美国的宾夕法尼亚大学,我们所熟悉的股神巴菲特,美国前任总统特朗普都曾在这所学校学习。在当时,因为这台电脑所诞生的时间点正处在二战期间,所以它最早使用在军事领域,用来计算弹道导弹的轨迹的。而它是由莫克利和艾克特两个人共同发明的,其中,我们很熟悉的计算机之父,约翰·冯·诺依曼也参加了此台计算机的研发。
学过计算机的同学对冯·诺依曼这个名字应该是很熟悉了,他可以说得上是计算机领域的祖师爷,而他呢,既是一个数学家,也是物理学家和化学家,还是“博弈论”之父;这位大佬除了研究计算机之外,还参与了曼哈顿计划(美国陆军部于1942年6月开始实施利用核裂变反应来研制原子弹的计划),是奥本海默的技术顾问,冯·诺依曼生前是普林斯顿高等研究院教授,奥本海默生前是美国普林斯顿高等研究院院长,我们熟知的著名物理学家爱因斯坦就在这个大学任教,而且是终身教授,由此可知这所大学的地位之高。
冯·诺依曼不仅研发出了计算机,他在计算机理论上的贡献也让人可望而不可即,以至于我们现代的计算机,大多还遵守着冯诺依曼体系(Von Neumann Architecture)结构。
- CPU 中央处理器: 进行算术运算和逻辑判断
- 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
- 输入设备: 用户给计算机发号施令的设备
- 输出设备: 计算机给用户汇报结果的设备
- 针对存储空间
硬盘 > 内存 >> CPU针对数据访问速度CPU >> 内存 > 硬盘
2.CPU
2.1 介绍
在一台计算机中,CPU占据着不可或缺的地位,中央处理器(Central Processing Unit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。
2.2 CPU基本工作流程
2.2.1逻辑门
通过电子开关,我们可以实现 1 位(bit) 的看似无用的逻辑运算,但至少它工作起来了,怎么使用电子开关组合出真正有用的逻辑组件,我们接来下会做进一步的学习了解。
2.2.2 门电路(Gate Circuit)
门电路可以实现 1 位(bit) 的基本逻辑运算。
2.2.3 算术逻辑单元 ALU(Arithmetic & Logic Unit)
ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑。
2.2.4 算术单元(Arithmetic Unit)
算数单元,负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些。接下来我们会带着大家实现一个 8 位(bits)的加法器(adder),来演示整个过程:
2.2.5 逻辑单元(Logic Unit)
逻辑单元主要用来进行逻辑操作,最基本的操作就是与、或、非操作,但不只是一位(bit)数的比较。
2.2.6 ALU 符号
经过我们的努力,通过基本的逻辑门电路,我们一步步地做出了一个8 位(bits) ALU。
2.2.7 寄存器(Register) 和内存(RAM)
内存的构建要比这个复杂一点,但基本原理一致。如此构建的内存被称为 RAM(Random Access Memory),可以支持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1)的硬件支持。
2.2.8 控制单元 CU(Control Unit)
2.3 CPU主要参数
我们这里主要讲两个参数,即核心数和频率。
2.3.1 核心数
那么什么是核心数呢?核心数是CPU的一个关键指标,指的是处理器内部的核心数量。每个核心都是一个独立的处理器单元,能够独立执行指令和处理数据。核心数的多少直接影响到处理器能够同时处理的任务数量,从而影响计算机的整体性能。核心数越多,处理器能够同时处理的任务就越多,这有助于提高计算机在多任务处理、并行计算、游戏和多媒体应用以及服务器和数据中心等领域的性能和效率。
我们下滑鼠标但我们电脑的任务栏,右键后点击任务管理器
点击性能:
鼠标移动到图形中间并右键,点击逻辑处理器:
此时,在这里有几个方框图形显示,那么就有几个核心数。
2.3.2 频率
CPU的频率,也称为时钟频率或主频,是指CPU内核工作的主时钟频率,它表示在CPU内数字脉冲信号震荡的速度。单位是赫兹(Hz)。CPU的频率越高,意味着CPU的处理速度就越快,因为它可以在一秒内执行更多的指令。
2.4 指令
2.4.1 指令的概念
这里面的内存地址,我们可以想象成在一栋宿舍楼里面,有很多个房间,每个房间都有自己的门牌号,通过门牌号我们就能找到房间里面的人,而我们的计算机内存是很大的,基本上有上亿个房间,门牌号大的数字一般用十六进制来表示。
2.4.2 指令三大阶段
一条指令运行过程可以分为3个阶段:取指令阶段、分析指令阶段和执行指令阶段。
取指令:根据程序计数器PC的值,从程序存储器读出当前要执行的指令,并将该指令送到指令寄存器。
解析指令:取出指令寄存器中的指令操作码进行译码,解析出指令要实现那种操作。(例如是执行数据传送还是进行数据的加减运算)。
执行指令:执行指令规定的操作。(例如对于带操作数的指令,先取出操作码,再取出操作数,然后按照操作码的类型对操作数进行操作)。
2.4.3 指令工作流程
在知道什么是指令后,接下来我们来了解它的工作流程。
有这么一串地址和数据,它给定了一段内存空间以及里面的数据。在CPU当中有这么一个寄存器,叫做程序计数器,它用于存放下一条指令所在单元的地址的地方。此处就认为程序计数器被置零,从0号内存地址开始执行指令,同时随着指令的执行,这里的值也会跟着改变。上面表格中的数据前4bit是操作码(opcode),表示指令是干什么的,后4bit是操作数。
1) 执行地址为0的指令
该数据前4bit为0010,我们参考指令表可以知道,0010这个指令是LOAD A的指令,后面的1110表示一个内存地址。这条指令的任务就是将1110这个地址的数据读取到寄存器A中,1110是十进制的14,所以最后我们把14地址的内存数据读出来,放到寄存器中。
2) 执行地址为1的指令
该数据前4bit为0001,我们参考指令表可以知道,0001这个指令是LOAD B的指令,后面的1111表示一个内存地址。这条指令的任务就是将1111这个地址的数据读取到寄存器B中,1111是十进制的15,所以最后我们把15地址的内存数据读出来,放到寄存器中。
3) 执行地址为2的指令
该数据前4bit为1000,我们参考指令表可以知道,1000这个指令是ADD的指令,后面的0100表示一个内存地址。这条指令的任务就是计算两个指定寄存器的数据的和,并且将结果放入第二个寄存器,通过步骤1和步骤二我们知道此时寄存器A存放的数据是3,寄存器B存放的数据是14,这里就是计算3+14的值并且将结果放入寄存器A中。
4) 执行地址为3的指令
该数据前4bit为0100,我们参考指令表可以知道,0100这个指令是STORE A的指令,后面的1101表示一个内存地址,1101是十进制的13.这条指令的任务就是将数据从A寄存器写入RAM指定地址(这里为13号地址)。
5) 由于3+14结果为17,二进制为00010001,所以13号地址存入00010001,此时应该执行地址为4的指令,但是通过表格我们可以知道4号地址中数据位0,所以我们认为此次任务结束。
3. 编程语言(Program Language)
3.1 程序(Program)
程序 = 指令 + 指令要处理的数据 。
3.2 编程语言的发展
高级语言的一条语句(Statement)往往对应很多条指令(Instruction)才能完成。
4.操作系统(Operating System)
4.1 定位
操作系统有两个基本功能: 管理不同的硬件设备 ; 给软件提供一个稳定的运行环境 。
4.2 进程/任务(Process/Task)
4.2.1 含义
4.2.2 进程控制块抽象(PCB Process Control Block)
// 以下代码是 Java 代码的伪码形式,重在说明,⽆法直接运⾏
class PCB {
// 进程的唯⼀标识 —— pid
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使⽤的各个资源
// 进度调度信息(留待下⾯讲解)
}
这样,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。
4.3 CPU 分配⸺进程调度(Process Scheduling)
进程调度:系统中处于就绪状态的进程对处理机的竞争是由进程调度程序来协调的。调度是依照确定的策略将一批进程排序,从就绪队列中移出一个进程并给它提供处理机的使用权。
进程调度的关键在于四个字:分时复用。
分时复用(Time Division Multiplexing,TDM),是采用同一物理连接的不同时段来传输不同的信号,能达到多路传输的目的。在网络中应用于用一条线路传输多路数据。
对于现代计算机来说,我们使用的时候可能现在要登录音乐播放器听音乐,过一会要打开steam下载想玩的游戏,再过一会可能又要敲代码,由于我们的CPU运行速度非常快,可能会使得上述过程切换的速度非常快,站在宏观角度来说,我们肉眼是看不到的,以为是同时执行的,这种情况我们称之为“并发执行”;现在,又有了多核心的CPU,此时,每个核心与核心之间,站在微观角度来说,也能同时执行不同的进程,我们称之为“并行执行”。
4.4 进程状态
进程是一个动态的实体,所以它是有生命的,从创建到消亡,是一个进程的整个生命周期。一般有三个状态。
1.就绪态 :进程已经获得所需的其他资源,正在申请处理器资源,准备开始执行,这种情况下,称进程处于就绪态。
2.阻塞态(休眠态或者等待态):进程需要等待所需资源而放弃处理器,或者是进程不拥有处理器而且其他资源也没有满足,从而即使得到处理器也不能运行的状态。
3.执行态:进程得到了处理器,并不需要等待其他任何资源,正在执行的状态,称之为运行态,只有在运行态时,进程才可以使用所申请的资源。
4.5 进程优先级
每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。
比如说:现在你有三件事想做,一个是打游戏,另一个是上网看电影,还有一个就是敲代码,对于某些人来说,他们喜欢编程,可能一天有一半的时间都在敲代码,敲完代码之后想放松一下就选择打游戏,到了晚上的时候闲着无聊就花一点时间看了个电影,此时,我们就认为敲代码的优先级最高,其次是打游戏,优先级最低的是看电影。
4.6 进程的上下文
所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
例如:今天小明和你说:下周一起去海边冲浪,你记得要来,然后你答应了下来,这时候你就要把他说的话记录下来;到了第二天,小红又和你说,下周她的妈妈过生日,邀请你参加,你也答应了下来,这时候,你还是要记住她说的话。如果不去记录,可能会造成你带着一套老式连衣裙去了海边,带着冲浪板参加了生日宴会这种尴尬场面。
4.7 进程的记账信息
在进程优先级的加持下,使得不同的进程吃到的资源差异越来越大,比如你一天看电影的时间太少了,于是你打算一天多花一个小时看电影,电影看腻之后,再继续减少看电影的时间;你一天打游戏花了太多时间,你想放下手机,做点其他事,等到其他事做完后,再拿起手机决战到底。
4.8 内存分配⸺内存管理(Memory Manage)
4.9 进程间通信(Inter Process Communication)
网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同⼀网络内部非同一主机上的进程间进行通信。