进程管理

进程的定义

  • 程序(Procedure):程序是一系列有序逻辑指令的集合,帮助我们达成某个结果。比如,我们去餐馆点黄焖鸡盖饭,服务员根据步骤制作黄焖鸡盖饭,这一过程就像程序一样,需要按步骤执行。
  • 进程(Process):进程是程序在数据集合上的一次执行。在早期的 UNIX 和 Linux 2.4 及更早的版本中,进程是系统资源分配和调度的独立基本单位。比如,我们在餐馆点黄焖鸡盖饭,服务员制作黄焖鸡盖饭是一个程序,而其中的各个步骤,比如做饭、做汤、把饭和汤混合、上桌,分别是不同的进程。

简单来说,程序是为完成某种任务设计的软件,如 vim 编辑器就是一个程序。而进程是程序的运行实例,是动态的。

程序是一系列指令的集合,是静态的实体;而进程具有以下特点:

  • 动态性:进程是一次程序执行的过程,包含创建、撤销等状态变化,而程序是静态的。
  • 并发性:进程可以在同一时间段内有多个运行,而程序只是静态实体,没有并发性。
  • 独立性:进程独立分配资源,独立接受调度,独立运行。
  • 异步性:进程以不可预知的速度向前推进。
  • 结构性:进程拥有代码段、数据段和进程控制块(PCB),是独立运行的实体。

在一个时间段内,多个进程可以并发执行,而每一瞬间只有一个进程实际在运行。引入进程的概念是为了更好地描述操作系统中各项活动的动态性和并发性。

进程控制块

进程控制块(PCB)是描述进程的关键数据结构,它包含进程所需的所有资源。常见的资源包括:内存、文件、信号、控制台等。每个进程占有的资源都是独特的。

在 Linux 中,各种资源都是有限的:

除了系统的总 PID 有限外,每个用户的 PID 也是有限的。可以使用 ulimit 命令查看用户进程资源限制:

# ulimit -u
31136

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority     (-e) 0
file size               (blocks, -f) unlimited
pending signals         (-i) 31136
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files              (-n) 1048576
pipe size               (512 bytes, -p) 8
POSIX message queues    (bytes, -q) 819200
real-time priority      (-r) 0
stack size              (kbytes, -s) 8192
cpu time                (seconds, -t) unlimited
max user processes      (-u) 31136
virtual memory          (kbytes, -v) unlimited
file locks              (-x) unlimited
进程状态

根据进程的特点,可以将进程分为以下三类:

  • 交互进程:由 shell 启动,可以在前台或后台运行,需要用户输入或交互来继续执行。
  • 批处理进程:类似于 Windows 的批处理,是一系列有序的进程序列,按顺序执行。
  • 守护进程:在后台执行特定功能或系统任务,通常在系统启动时自动运行,直到系统关闭时才停止。

根据进程状态的不同,还可以将进程分为:

  • 孤儿进程:父进程退出后,子进程仍在运行,这些子进程被称为孤儿进程,由 init 进程收养。
  • 僵尸进程:子进程结束但未完全释放资源,成为僵尸进程。僵尸进程的父进程可以通过 wait 系统调用清理僵尸进程。

当进程变成僵尸状态后,只能通过其父进程处理,否则会浪费系统资源。

  • 守护进程:(补充)所有守护进程都可以以超级用户(ID 为 0)的优先权运行,没有控制终端,其父进程都是 init 进程(1号进程)。
进程状态

进程在执行过程中会经历不同的状态转换

  1. 运行:进程正在CPU上执行。
  2. 等待:进程可以执行,但当前没有分配到CPU时间。
  3. 睡眠:进程在等待某个外部事件(如I/O操作)完成,此时无法执行。
  4. 终止:进程执行完毕,进入终止状态。
  • 运行等待:当进程需要等待外部信号时,状态从“运行”变为“等待”。
  • 等待运行:当调度器分配CPU时间给进程时,状态从“等待”变为“运行”。
  • 运行睡眠:当进程必须等待事件完成时,状态从“运行”变为“睡眠”。
  • 睡眠等待:事件完成后,进程先进入“等待”状态,然后再进入“运行”状态。
  • 运行终止:进程执行结束,进入“终止”状态。

另外一种特殊状态是“僵尸”状态,当子进程结束但父进程未处理其状态时,子进程变为僵尸进程。

本文由mdnice多平台发布


逼格高的汤圆
10 声望2 粉丝