avatar

操作系统-进程管理

2. 进程管理

2.1 进程是什么

进程笼统的讲:

  • 进程是系统资源配置和调度的基本单位
  • 进程是程序独立运行的载体,保障程序正常执行
  • 进程使得操作系统资源的利用率大幅提升

但进程的本体是:

  • 用于描述和控制进程运行的通用数据结构
  • 记录进程当前状态和控制进程运行的全部信息
  • 进程控制块(PCB)是使得进程能够独立运行的基本单位

进程的本体也可以认为是一堆信息的集合,包含进程标识符、处理机状态、进程调度信息、进程控制信息。这四种信息包含:

  • 标识符
  • 进程状态
  • 程序计数器
  • 内存指针
  • 上下文数据
  • IO状态信息
  • 记账信息

进程控制块 (Process Control Block, PCB) :描述进程的基本信息和运行状态。本身经常被操作系统读取的,所以要常驻内存(磁盘的读写很慢,内存的较快些),系统会专门为其开辟一个区域

2.1 进程与线程

进程(Process)与线程(Thread)的关系是面试经常考到的,进程是相对大的概念,一个进程包含一个或多个线程。 从系统层来看,进程是系统进行资源配置和调度的基本单位,但是线程是运行调度的最小单位。在执行一个进程时可以同时存在多个线程,这些线程会共享进程的资源。

1
QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。
进程 线程
资源 资源配置的基本单位 不拥有资源
调度 独立调度的基本单位 独立调度的最小单位
系统开销 进程系统开销大 线程系统开销小
通信 进程间IPC通信 读写同一进程数据通信

2.2 五状态模型

image

  • 创建状态: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


2.3.2 哲学家进餐问题
1
2


2.3.3 读者-写者问题
1
2


2.4 进程间通信

进程通信:进程间传输信息。进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

进程间通信方法:

  • 管道
  • FIFO
  • 消息队列
  • 信号量
  • 共享存储
  • 套接字

2.5 Linux的进程管理

2.5.1 Linux 关于进程的常见命令
1
2
3
4
5
>> ps // 查看当前进程
>> top // 查看当前进程的状态,以及CPU、内存等信息,与任务管理器类似
>> kill // 给进程发送指定信号(杀死进程的使用多些 `kill 9`)
>> fork //创建进程
>> pstree // 显示父子进程关系
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),进程正处于退出状态,或僵尸进程
Author: TheOutsider
Link: http://yoursite.com/2020/04/04/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.