一、CPU如何执行指令
1、读指令
把内存中的指令数据读取到cpu的寄存器。这个地方要注意寄存器与存储器的区别:
寄存器是cpu上的一个模块,存储器是内存与硬盘的统称,存储空间:硬盘大于内存大于寄存器,速度:寄存器大于内存大于硬盘,价格:寄存器大于内存大于硬盘;由于寄存器与内存之间速度差异较大,现代的cpu提供了缓存模块,将使用频率高的数据存放在缓存中,操作系统在读指令时优先看缓存中有没有,有则直接读取,没有则去内存中读取,可以提高开发效率。
2、解析指令
指令通常包括操作数和操作码组成,每个cpu被设计出都会自带一个指令表,上面明确的解释了每个操作码负责的工作。
3、执行指令
cpu通过操作数对应的指令表做出动作,cpu在执行完一条指令后,默认把pc数加一,执行下一条指令。pc为程序计数器
栗子:
第一步读指令,假设从下标为0的地址开始执行,该指令的操作码为0010,操作数为1110,根据指令表可以得到0010对应的操作为LOAD_A(红色线)
第二步解析指令,由指令表可以知道当前指令需要将1110位置的数据放到寄存器A
第三步执行指令,如图。
二、进程
一个程序运行时,操作系统中就会出现一个对应的进程,要想进程运行就要给进程分配资源,进程可以视为资源分配的基本单位。
1、PCB
操作系统对于多个进程需要进行管理,通用的做法是:先描述,再组织。
描述:通过结构体或类将一个进程的核心信息抽象提取并表示出来。此处的结构体称为PCB
组织:通过一定的数据结构将多个PCB串联起来,操作系统通常使用链表。
2、PCB包含的信息
(1)Pid:进程的id,同一机器 同一时刻进程的id一定不同。可以通过任务管理器查看
(2)内存指针
一组指针分别指向了该进程的指令与数据在内存中存储的地址。
当双击一个exe文件执行时,此时操作系统会产生一个进程,先创建一个PCB与内核中的PCB链表连接,exe包含的指令数据保存到内存之中。此处重点理解PCB的指针与内存、硬盘之间的关系,以及创建一个进程时都发生了什么。可以根据下图帮助理解
(3)文件描述符表:记录下当前进程打开了哪些文件,使用顺序表这样的数据结构存储。
3、PCB的属性
(1)状态:包含就绪状态与阻塞状态,往往在这个进程等待IO时会进入阻塞状态
(2)优先级:分配的资源会不同
(3)上下文:进程在cpu执行过程中会产生很多的中间结果,在进程切换出cpu之前将中间结果保存到PCB的上下文(寄存器的数据保存到内存),下次这个进程回到cpu执行时就需把之前的中间结果恢复(内存的数据保存到寄存器)。此处的中间结果大多是cpu中各种寄存器的值。
(4)记账信息:记录分配的资源
在了解完本篇文章后能帮助学习后面的多线程,下一篇文章更新多线程,请多多期待(●'◡'●)。