CPU 上电后如何工作?

在传统的 8086 机中,任意时刻,CPU 将 CS:IP 指向的内容当作指令执行。
8086 CPU 加电启动后,默认 CS=FFFFH,IP=0000H ,即从 FFFF0H 开始读取指令执行。
https://lookcos.cn/usr/uploads/2022/02/2765400955.png
读取一条指令后,IP 中的值自动增加。当前读取的指令为"mov ax, 1",长度为 3 个字节,所以 IP+=3,此时 CS:IP 指向 FFFF3H。可以看出,CPU 是自动取值执行。

对 CPU 的简单理解

在现代 X86 系列处理器中,给程序计数器(英语:Program Counter,PC)一个初值,CPU 就以该初值(地址)在内存中对应的内容作为指令来逐条的往下执行。
https://lookcos.cn/usr/uploads/2022/02/3599946934.png

拖后腿的 IO

给 CPU 设置一个 PC 初值就完事了,看起来没什么问题。但是一旦涉及 IO 读写就会出现问题。

IO 有多慢

从磁盘上读信息的时间为毫秒级,比从 DRAM 读慢了 10 万倍,比从 SRAM 读慢了 100 万倍。《深入理解计算机操作系统》

以机械硬盘读为例,电机带动盘片不断旋转,在读操作时,传动臂带动磁头沿着半径轴前后移动,这个操作称为寻道(seek),直到找到期望的磁道。
而 CPU 与内存则不同于机械构件,它们是固态的,是电子级的,自然要比机械硬盘快非常多。机械硬盘读写,95%的时间都花费在机械运动上。

频繁的 IO 操作

也就是说,可能执行了十几万条指令,只花费数毫秒,而当下一个指令是 IO 操作时,可能也花费了数毫秒。
但实际上,很有可能执行数条指令后就执行了 IO 操作,例如 IO 密集型程序。
这就导致,CPU 大部分时间都在等待 IO 操作,CPU 利用率非常低,几乎等于 0。

交替执行程序

为了充分调度 CPU,提升 CPU 的利用率,我们可以交替的执行程序。
https://lookcos.cn/usr/uploads/2022/02/2537909158.png

CPU 中有多道程序,交替执行,这样 CPU 就能忙碌起来了。这里有一个例子:一个人要做两件事:看电视(10 分钟)和烧水(5 分钟),如果他先烧水并且等水烧开,再看电视,或者颠倒一下,那么总共需要花费 15 分钟。如果在烧水的时候,把水放到炉子上然后去看电视,等水烧开了再去熄灭炉子。然后继续回去看电视。那么理想情况下,整个过程只花费了 10 分钟。

一个 CPU 交替的执行多个程序就是并发

交替执行带来的问题

https://lookcos.cn/usr/uploads/2022/02/2335676021.png

左边的程序,是为了计算1+1=2;右边的程序,是为了计算10+10=20。
但假如左侧程序在执行完

mov bx,1

之后,转而执行右侧的程序,最终的程序执行序列就会变成:

;CPU执行程序1
mov ax, 1; ax=1
mov bx, 1; bx=1
;CPU转而执行程序2
mov ax, 10; ax=10
mov bx, 10; bx=10
add ax, bx; ax=20
;CPU回到程序1继续执行
add ax,bx; ax=ax+bx = 20+10 = 30

显然,右侧的程序改变了寄存器ax与bx的值,导致左侧程序出错。另外,CPU执行完右侧程序,不一定知道PC=3,从而执行

add ax, bx

这只是理想的状态下。

解决办法:保护现场

切来切去,将数据都切乱了,而且回到某程序执行时我们也无从得知:该从此程序的哪一行开始执行?所以,我们需要用一个叫做PCB(Process Control Block)的东西,保护一下现场。

假如CPU在执行左侧程序即将切出去之前,保存一下各个寄存器的值和PC的值不就好了?
例如当CPU执行完PC=2的语句后,将左侧程序的状态进行一个保存:

keyvalue
AX1
BX1
PC2

有了这样一个结构体保存状态,我们就可以放心的切到右侧程序继续执行。等执行完右侧程序回到左侧程序时,就用该结构体对寄存器的值进行还原,而且还可以得知PC=2,那么CPU接着执行PC=3的语句。

这样一来,两边的程序就能够不出岔子的完成了。

从而有了进程的概念

硬盘中的程序只是普通的文件,一串二进制的代码,而当它运行起来,就必然有对应的PCB来刻画它的状态等所有与该进程相关的信息。就成为了进行中的程序,是程序在内存中运行的实体。它是动态的、运行中的。

进程与程序的不同之处:

  1. 进程走走停停,程序则是静止的。
  2. 进程有PCB,程序没有
  3. 进程有始有终,程序没有。
  4. ....

添加新评论