目录
进程
首先我们要了解一下什么是进程?
那如何管理进程?
PCB中比较重要的属性
进程调度
为什么要进行进程调度?
状态
优先级
上下文
拓展介绍一下寄存器
记账信息
进程
首先我们要了解一下什么是进程?
简单来说,进程:跑起来的程序
我们打开任务管理器,每一个跑起来的进程都是一个应用程序
那如何管理进程?
1.先描述:使用PCB结构(进程管理块 )表示出进程的各种属性。
2.后组织:使用双向链表,把这些PCB结构串起来。
PCB中比较重要的属性
1.pid | 进程标识符 |
2.内存指针 | 进程持有的内存资源 |
3.文件描述符表 | 进程持有的硬盘资源 |
4.状态 | 这些用来完成’‘进程调度”, 和进程持有的CPU资源密切相关 |
5.优先级 | |
6.上下文 | |
7.记账信息 |
接下来我们具体介绍用来完成进程调度的这几个属性
进程调度
为什么要进行进程调度?
因为进程太多,CPU核心数太少(分不过来,狼多肉少)。
这就需要让这些进程轮番在CPU上执行。只要轮转速度够快,那在用户眼中(宏观上),这些进程看起来就是“同时”执行的。
这个“同时”只是看起来同时,实际上并不是同时的,这个就叫做 “并发”; 那如果两个进程同时在两个CPU上执行,在微观上也是同时的,这个叫做 ”并行“。
但在程序员的角度来看,是感受不到到底是“并发”执行,还是”并行“执行,我们通常用”并发“这个概念来表示”并行“和“并发”。
状态
1.就绪状态
这个进程随时可以去CPU上执行 或者 这个进程正在CPU上执行
一个CPU同一时刻只能有一个进程执行,那其他进程就得排队,那一个进程下车,下一个进程就立即补上来。
2.阻塞状态
程序有时候要等待一些其他的条件,其他条件必备,才能执行,比如说等待用户输入,这个用户一直不输入,那就得等待(阻塞了),直到用户输入,我们才能获取到数据。
还有一些其他的状态,不太重要,就不介绍了。
优先级
优先把资源分配给谁谁,
这个好理解,就比如现在同时运行一个游戏,和一个QQ,那此时我们就希望游戏持有更多的运算资源,保证流畅,QQ的话,能收到消息就好,那游戏的优先级就高于QQ
上下文
进程从CPU离开之前,需要保持现场,把当前CPU中各种寄存器的状态都记录到内存中,
等到下次进程回到CPU上执行的时候,此时就可以把保存的这些寄存器的值,恢复回去,进程就会沿着上次执行到的位置,继续往后执行。
就像玩游戏里的存档,读档。
拓展介绍一下寄存器
CPU中有一些寄存器,没有特殊含义,就只是用来保存运算的中间结果的,
还有一些寄存器,有特定含义,特定作用
- 保存当前执行到哪个指令(也叫程序计数器)(是一个2字节/4字节/8字节 的整数,这个整数保存的是一个 内存地址,这个地址就是程序下一条要执行的指令的所在位置)
- 维护栈相关的寄存器 (有了这个 才知道一个方法执行完毕后,要回到哪里执行)通过这一组(一般是两个)维护当前程序的”调用栈“,(栈,也是一块内存,这个内存里就保存当前这个程序方法调用过程中的一系列的关系,也包含局部变量和方法参数......)
- 其他的通用寄存器 一般是用来保存计算的中间结果的。
ps(程序计数器): exe里面就包含了指令 和 数据,把exe 运行起来,操作系统就会把指令和数据加载到内存中(就会有一个内存地址),
那此时CPU就会从内存中取指令,然后在执行指令,
初始情况下,程序计数器就指向进程指令的入口,
每次取完一条指令,程序计数器的值都会自动更新,
默认情况下,直接指向下一条(顺序执行)
但是如果遇到 跳转类指令(jmp(无条件跳转),jcmp(有条件跳转),call(函数调用)),就会被设置成跳转到的地址)
这些都是操作系统自动的。
记账信息
通过优先级机制,对不同的进程分配了不同权重的资源,
但这个机制有可能会出现极端的情况,所有的资源都给了某个进程,其他进程一点都没分着
那就要用到记账信息,记账信息,会记录当前进程持有 CPU 的情况(在CPU 执行多久了),就可以作为操作系统调度进程的参考依据
╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯