2. 进程管理
2.1 进程是什么
进程笼统的讲:
- 进程是系统资源配置和调度的基本单位
- 进程是程序独立运行的载体,保障程序正常执行
- 进程使得操作系统资源的利用率大幅提升
但进程的本体是:
- 用于描述和控制进程运行的通用数据结构
- 记录进程当前状态和控制进程运行的全部信息
- 进程控制块(PCB)是使得进程能够独立运行的基本单位
进程的本体也可以认为是一堆信息的集合,包含进程标识符、处理机状态、进程调度信息、进程控制信息。这四种信息包含:
- 标识符
- 进程状态
- 程序计数器
- 内存指针
- 上下文数据
- IO状态信息
- 记账信息
- …
进程控制块 (Process Control Block, PCB) :描述进程的基本信息和运行状态。本身经常被操作系统读取的,所以要常驻内存(磁盘的读写很慢,内存的较快些),系统会专门为其开辟一个区域
2.1 进程与线程
进程(Process)与线程(Thread)的关系是面试经常考到的,进程是相对大的概念,一个进程包含一个或多个线程。 从系统层来看,进程是系统进行资源配置和调度的基本单位,但是线程是运行调度的最小单位。在执行一个进程时可以同时存在多个线程,这些线程会共享进程的资源。
1 | QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。 |
进程 | 线程 | |
---|---|---|
资源 | 资源配置的基本单位 | 不拥有资源 |
调度 | 独立调度的基本单位 | 独立调度的最小单位 |
系统开销 | 进程系统开销大 | 线程系统开销小 |
通信 | 进程间IPC通信 | 读写同一进程数据通信 |
2.2 五状态模型
- 创建状态:fork() 函数创建,分配PCB并插入就绪队列,该状态唯一有的就是PCB但是资源、CPU都没有。
- 终止状态: 系统清理并归还PCB的状态。
- 就绪状态(ready): 其他资源都有,只有CPU没有,等待进程调度,一旦获得CPU资源就跳入执行状态。可以想象处在就绪状态的进程是非常多的(对于单核处理器,一次只能有一个执行状态的进程),这些进程就会排成就绪队列。
- 执行状态(running): 获得CPU以及其他资源时,便进入执行状态。
- 阻塞状态(waiting): 在执行态下因某种原因,放弃CPU资源便进入阻塞状态,阻塞状态的进程多了,也就有了阻塞队列。因为相较于CPU的执行速度,有些走IO设备的资源要慢很多(如打印机、串口通信等),所以需要将CPU让给其他进程比较好。
注意点:
- 只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。
2.3 进程同步
同步问题最知名的就是生产者-消费者问题和哲学家进餐问题问题了,这些问题的根源是临界资源的管控出现了问题,彼此之间没有通信。解决方案是“如果生产者通知消费者我已经完成一件生产”和“哲学家向旁边哲学家说我要进餐了”就可以协调好多个进程对临界资源的使用了。
进程同步的方法:消息队列、共享存储、信号量
线程同步的方法: 互斥量、读写锁、自选锁、条件变量
2.3.1 生产者-消费者问题
1 |
2.3.2 哲学家进餐问题
1 |
2.3.3 读者-写者问题
1 |
2.4 进程间通信
进程通信:进程间传输信息。进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
进程间通信方法:
- 管道
- FIFO
- 消息队列
- 信号量
- 共享存储
- 套接字
2.5 Linux的进程管理
2.5.1 Linux 关于进程的常见命令
1 | >> ps // 查看当前进程 |
2.5.2 部分名词解释
-
进程ID:
- ID为一非负整数,是进程的唯一标识符
- ID=0为idle进程,是系统创建的第一个进程
- ID=1为init进程,是idle进程的子进程,完成系统初始化
- init进程是所有用户进程的祖先进程
-
进程状态标记:
状态符号 状态说明 R (TASK_RUNNING),进程正处于运行状态 S (TASK_INTERRUPTIBLE),进程正处于睡眠状态 D (TASK_UNINTERRUPTIBLE),进程正在处于IO等待的睡眠状态 T (TASK_STOPPED),进程正处于暂停状态 Z (TASK_DEAD or EXIT_ZOMBIE),进程正处于退出状态,或僵尸进程
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.