前言:本篇内容基于《操作系统概念第七版》及《操作系统精髓与设计原理原书第六版》整理生成
什么是进程?
进程常常被理解为执行中的程序,这是一种非正式的说法。进程不只是程序代码(程序代码有时被称作文本段或者代码段)。进程还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示。此外,进程通常还包括:
- 栈段:包括临时数据如函数参数、返回地址和局部变量
- 数据段:包括全局变量
- 堆段:在进程运行期间动态分配的内存
内存中进程的结构如下图:
进程和程序
- 程序本身不是进程
- 程序只是被动实体,如存储在磁盘上包含一系列指令的文件内容(常被称作可执行文件)
- 进程是活动实体,它有一个程序计数器来表示下一个要执行的命令和相关的资源集合
- 当一个可执行文件被装入内存时,一个程序才能成为进程
- 一个程序可能同时存在多个进程,但进程间是独立的,虽然文本段相同,但是数据段、堆、栈段都是不同的
进程状态(五状态模型)
进程在执行期间会根据特定的环境改变状态,每个进程在任意时刻可能处于下列状态之一:
- 新建(New):新创建的进程,系统还没有把它加入到可执行进程组中。通常指进程控制块已经创建但还没加载到内存中的新进程
- 运行(Running):进程正在被执行(若计算机只有一个CPU,则每次只能有一个进程处于这个状态)
- 等待(Wating):进程等待某个事件的发生(如I/O完成或收到信号)
- 就绪(Ready):进程等待分配处理器("进程做好了准备,只要有机会就开始执行")
- 终止(Terminated):进程完成执行
△ 进程状态转移图:
一个尤其重要的状态转移:
运行态 -> 就绪态:这种转换最常见的原因有:
- 正在执行的进程到达了“允许不中断执行”的最大时间段(时间片)
- 进程A处于执行态,等待队列中有一个优先级更高的进程B的等待事件已发生,则操作系统会把B切换到就绪态,然后中断A的执行,将处理器分派给进程B,A从执行态切换到就绪态(抢占)
进程控制块(PCB)
每个进程在操作系统内用进程控制块来表示,简化的进程控制块的结构如下图:
- 标识符:与这个进程相关的唯一标识,用来区别其他进程,常表示为进程编号 pid
- 状态:记录上面提及的状态信息
- 优先级:相对于其他进程的优先级
- 程序计数器:对应程序即将被执行的下一条指令的地址
- 内存指针:包含程序代码和其他与该进程相关数据的地址,还包含和其他进程共享的内存块的地址
- 上下文数据:进程执行时处理器的寄存器中的数据
- I/O状态信息:包含显示的I/O请求、分配给进程的I/O设备(如磁带驱动器)和被进程使用的文件列表
- 记账信息:可能包含处理器时间总和、使用的时钟总和、时间限制和记账号等
进程控制块由操作系统创建和管理,进程控制块包含了充分的信息,这样能保证中断一个正在执行的进程后能再次完整地恢复它原来的执行状态,就像从没中断过一样,所以说,进程控制块是操作系统能支持多进程和提供多处理的关键工具。