文章目录
- CPU执行指令过程
- 进程
- PCB
- “分时复用”
- ☁️结语
CPU执行指令过程
一个CPU能执行那些指令,可以认为是cpu最初设计的时候就已经写死了。有一个“表格”描述了都有哪些指令。
以上的表格只是一个简化版本,真实的cpu指令表要复杂很多。此处假设每个指令只有8bit(实际上更长)。
RAM
即内存,它的全称叫做随机访问存储器。
8 bit的指令可以分成两个部分,前4个bit 是 操作码,表示指令是干啥的,后4bit 是操作数。
CPU中存在了一个特殊的寄存器,“程序计数器”,它保存了接下来要从哪个内存位置来执行指令。随着指令的执行,这里的值也会随着更新,默认情况下就是+1自增过程(顺序执行),如果遇到“跳转类语句”(if、while、for、函数调用…)那么它就会设为其他的值。
执行指令的三个阶段:
- 取指令,cup从内存中读取到指令内容到cpu内部
- 解析指令,识别出这个指令是干啥的,以及对应的功能和操作数
- 执行指令
-
初始情况下,程序计数器的值是0
- 读取指令
- 解析指令
把读到的指令一分为二
左边这里就是操作码
右边这里就是操作数
操作码表示它是干啥的指令;操作数表示这个指令是对谁操作的。
我们可以去指令表中看这个操作码是啥意思。这个指令是LOAD A指令,并且后面的 1110 表示了一个内存地址。这个指令的工作就是把 1110 这个地址的数据,读取到寄存器 A 中。
3. 执行指令
把1110 (十进制的14) 地址的内存数据读取出来,放到寄存器A中。第一条指令执行完毕,系统会自动把程序计数器中的值++ - 读取指令
-
执行为1的指令
- 读取指令
2. 解析指令
把指令拆成 0001(操作码) 和 1111(操作数)。
这个指令是LOAD B,就要把1111(十进制的15)地址上的数据读到寄存器B中。
3. 执行指令
找到15这个地址上的数据,读到B寄存器中。之后程序计数器++(1 -> 2)。
- 读取指令
-
…
进程
进程就是正在执行的应用程序。
谈的一个应用程序,有两种状态
- 没有运行的时候,是一个 exe 文件,躺在硬盘上。
- 运行的时候,exe 就会被加载到内存中,并且cup执行里面的指令了
执行进程里的指令,需要硬件资源。
进程是操作系统进行资源分配的基本单位。
由于一个系统上进程比较多,所以需要管理
- 描述:通过 结构体/类,把进程中的各种属性表示出来
- 组织 :通过数据结构,把多个上面的结构体串起来,并进一步的进行各种增删查改。
对于Linux操作系统来说,它使用“PCB(进程控制块)”这样的结构体来描述进程信息的。
我们可以简单认为,通过链表的方式,把上述多个PCB串到一起。
创建新的进程,就相当于创建了一个PCB结构体,并且插入到链表中;销毁进程,就是把PCB从链表上删除掉,并且释放这个PCB结构体;查看进程列表,就是中遍历这个链表,依次显示出对应的信息。
注意:以上只是简化版本,方便理解,实践的情况要更复杂,不只是一个链表...
PCB
PCB有啥信息?
PCB是一个非常复杂的结构体,里面包含了非常多的属性。我们在这里只讨论一些关键的信息~
- PID 进程的标识符
同一时刻,一个机器上的多个进程之间PID是唯一的,不会重复,系统内部的很多操作,都是通过PID找到对应的进程的。
2. 内存指针(一组)
它描述进程依赖的指令和数据都在内存的哪个区域
操作系统运行exe就会读取exe中的指令和数据,并把它们加载到内存中(内存地址)。
(侧面表示出,进程的执行需要一定的内存资源)
3. 文件描述符表(顺序表/数组)
它描述了进程打开了那些文件(对于到硬盘上的数据),进程中打开了某个文件,就会在顺序表中添加一项。
(侧面表示出,进程的执行需要一定的硬盘资源)
4. 进程状态
5. 进程的优先级
6. 进程的上下文
7. 进程的记账信息
4、5、6、7这几个属性共同决定了进程调度。我们把他们放在一块分析。
计算机上同时存在百八十个进程,这么多进程都是要执行的。
CPU负责执行,CPU每个核心可以执行一个进程。我这台电脑CPU是6核12线程(6个物理核心,12个逻辑核心),只能同时执行12个进程呀~其他进程咋办呢?
这就不得不提到操作系统进程调度的关键——“分时复用”了
“分时复用”
这个时刻CPU运行进程1,运行一会,CPU运行进程2,过一会运行进程3…
由于CPU运算速度非常快,使上述的切换速度也非常快,肉眼察觉不到,站在宏观角度(人),就好像是同时执行了,这叫做“并发执行”。
现在有有了多核心CPU,每个核心和核心之间,微观上也能同时执行不同的进程,这叫做“并行执行”。
并发/并行,都是操作系统内核统一调度的,程序员/普通用户感知不到~
因此,平时也把并行和并发统称为“并发”,对于的编程的手法也就称为“并发执行”。
-
进程状态
可以随时被调度到CPU上执行指令的,称为“就绪状态”。
因为要做一些其他的工作,比如进行IO操作(读写硬盘/读写网卡…),无法调度到CPU上执行,这称为“阻塞状态”。
其实进程还有其他的状态,此处就不展开了~ -
进程优先级
进程优先级就是来解决谁先来,谁后来,谁多执行,谁少执行的问题的。 -
进程的上下文
分时复用,一个进程执行一会之后,就要从CPU上调度走,过一段时间,还会调度回CPU,此时就要沿着上次执行的结果,继续往后执行~
进程的上下文对于进程来说就是寄存器中的值,CPU有很多寄存器,这些寄存器共同描述了上下文。
PCB是内存的数据,把寄存器中的值都保存到PCB特定属性中,下次调度PCB就可以从这里的属性中把数据恢复到对应的寄存器中了。 -
进程的记账信息
在优先级的加持之下,就会使不同的进程吃到的资源差异越来越大。
操作系统会去统计每一个进程在CPU上执行的时间,系统就会根据这个来进一步的调整调度的策略。
这几个属性相互配合,共同构成了进程调度的核心逻辑~
上述的调度过程,都是系统内核负责完成的,虽然是在系统内核完成的,但是我们写程序的时候还是会受到影响的,因此还是需要了解上述的调度过程的!
本文到这里就结束啦~
☁️结语
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!
都看到这里啦!真棒(*^▽^*)
可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家
如有纰漏或错误,欢迎指正