1、什么是进程/任务
计算机上所有的应用程序在现代的操作系统上运行时,操作系统都会提供一种假像,好像是计算机上所有的硬件资源都调用过来,为该程序所支配的假想,这种假想是通过抽象了一个进程的概念来概括的。
进程是操作系统对一个正在运行的应用程序的一种概况,咱们可以认为是一个程序从开始到结束的过程就是进程。
同时,进程又是操作系统进行资源分配的基本单位。
2、进程控制块
计算机内部想要实现什么功能或者管理什么数据,都需要用抽象来描述吧,抽象成能让计算机能读懂的数据,咱们总不能在程序里打个进程就表示进程吧,这里我们就可以把进程抽象成PCB控制块,在java里,我们就通过类/对象来描述这一特征,比如以下的代码:
// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息
}
每一个PCB对象其实就代表一个正在运行的程序,PCB是操作系统为了维护管理进程而专门维护的数据结构。它包括了进程执行的各种信息,如进程的状态、程序计数器、CPU 寄存器、内存管理信息、调度信息等。
操作系统就是通过PCB控制块来跟踪进程执行状态,以便进程切换时能够保存和恢复进程状态;通俗来说就是操作系统是房子的主人,PCB是管家,进程是仆人,主人通过管家来管理仆人干活。
2.1、PCB 与进程的关系
-
进程是一个实体,PCB是进程的描述和管理工具:
- 每个进程都有一个对应的 PCB。操作系统根据 PCB 来管理进程的生命周期,包括进程的创建、调度、执行、终止等。
-
进程的生命周期与 PCB 密切相关:
- 当一个进程被创建时,操作系统为它分配一个 PCB。
- 进程的执行过程会不断更新 PCB 中的信息(如程序计数器、寄存器内容等)。
- 当进程被挂起或终止时,操作系统根据 PCB 的信息来保存或清理进程的状态。
2.2、PCB 中常见的信息
- 进程状态:表示进程当前的执行状态,如就绪、运行、阻塞等。
- 程序计数器(PC):存储当前进程执行的下一条指令的地址。
- CPU 寄存器:记录进程执行时使用的寄存器内容。
- 内存管理信息:如页表、段表等,用于描述进程的内存布局。
- 调度信息:包括进程优先级、调度队列指针等,用于操作系统决定进程的调度顺序。
- I/O 状态信息:记录进程与 I/O 设备的交互状态。
咱们计算机的任务管理器里面的每一条进程就是以PCB规范的进程相关信息,zhi
3、CPU分配——进程的调度
进程调度是操作系统管理资源分配最关键的任务,它决定了进程什么时候要运行,如何切换进程以及如何分配CPU资源。进程调度的基本过程可以分为五步:进程状态的转换、选择就绪队列中的进程、调度中断和切换进程、恢复进程的执行、更新进程控制块。
3.1、进程状态的转换
进程在不同的阶段会处于不同的状态,通常分为以下几种:
就绪状态:进程已经获得足够资源,等待cpu分配时间。
运行状态:进程在cpu上运行。
阻塞状态:进程因等待资源分配而被挂起。
就好比如准备出发的赛车就是就绪状态的进程,在赛道上高速运动的赛车就是运行状态的进程,还在修理厂组织的赛车就是阻塞的赛车。
进程状态的转换是进程调度的基础,操作系统通常是会根据进程的资源需求和系统的资源情况进行状态转换。
3.2选择就绪状态队列中的进程
在调度过程中,操作系统会从就绪队列中选择一个进程,准备用cpu来执行。就比如你做了一些已经完成的蛋糕,你就准备从这些蛋糕中挑一个出来,用嘴巴吃。
调度程序会根据某种调度算法(如先来先服务(FCFS)、短作业优先(SJF)、轮转调度(RR)、优先级调度等)来选择一个进程。也就好比如我们会根据自己的口味来挑一个蛋糕。
3.3调度中断和切换进程
调度的程序会根据系统的调度策略进行进程切换,而进程切换的话,系统决定停止正在运行的进程切换到另外一个进程,就会形成一个调度中断,这是操作系统就会:
- 保存当前进程的状态(如寄存器值、程序计数器等)。
- 根据调度策略选择下一个进程,并将其从就绪队列中取出。
- 加载新进程的上下文。
注:上下文(Context)是指进程或线程在执行过程中所需的所有信息和资源的集合,用于描述一个进程的执行状态。在操作系统中,进程上下文是指一个进程在CPU执行时的状态信息,操作系统通过保存和恢复上下文来进行进程切换。
3.4恢复进程的执行
一旦完成了上下文切换,操作系统会恢复被调度进程的执行。恢复时,操作系统会重新加载该进程的状态,包括程序计数器、寄存器值等,并将其分配到CPU上执行。
3.5更新进程控制块(PCB)
每次进行进程调度时,操作系统都会更新进程控制块(PCB),PCB保存了进程的相关信息,如进程状态、程序计数器、CPU寄存器的值、内存分配情况等。调度过程中的状态变更都会反映到PCB中,方便下次恢复执行时能够准确恢复进程的执行状态。
总结
进程的调度基本步骤分为:
- 进程状态的转换。
- 选择就绪队列中的进程。
- 调度中断和切换进程。
- 恢复进程的执行。
- 更新进程控制块(PCB)。