实验楼


理解Linux进程

进程概念

我对于程序已经有了一定程度的认知——一段指令集合。那么进程又是什么,进程不应该就是一种程序吗?一个经典的例子,把程序比喻成菜谱,记录了做一道菜的过程,那么进程就是动手做出一道菜的过程。可以说,进程就是执行的程序,程序的一次执行。

程序是静态的,进程是动态的实体

进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间、文件描述符、环境变量等资源,进程之间相互隔离,互不干扰。

进程具有并发性,也就是说,程序的执行并不一定是顺序的,是并发的,并发能够极大提高了程序的执行效率和资源利用率,于是引入线程的概念。

21b10a6fc224d5704279bbe987c4e67c

线程(Thread) 是进程中的一个执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但每个线程有自己的栈和程序计数器。

多线程编程可以提高程序的并发性和响应性,但也需要注意线程安全问题(如竞态条件、死锁等)。

进程状态

创建(New):进程正在被创建。

就绪(Ready):进程已准备好运行,等待CPU分配时间片。

运行(Running):进程正在CPU上执行。

阻塞(Blocked):进程等待某些事件(如I/O操作完成)而暂停执行。

终止(Terminated):进程执行完毕或被强制终止。

8c87b1dcc6efe3c59ad91892b5adb68e

以上的进程分类是广义上的,对于特定的操作系统可能有更细化特殊的状态分类。

拓展:Linux进程状态

R (Running / Runnable):进程正在运行或准备运行(在运行队列中等待CPU时间)。
S (Interruptible Sleep):进程在等待某个事件(如I/O操作完成或信号),并且可以被信号中断。
D (Uninterruptible Sleep):进程在等待I/O操作完成,且不会被信号中断。常见于磁盘I/O操作。
Z (Zombie):进程已终止,但其父进程尚未回收其资源(如PID、退出状态等)。
T (Stopped):进程被信号(如SIGSTOP)暂停,或正在被调试器跟踪。
X (Dead):进程已完全终止,通常不会在ps或top的输出中看到。
I (Idle):内核线程处于空闲状态,等待任务。
t (Tracing stop):进程因被跟踪而暂停(如调试器)。
W (Paging):进程正在等待分页(已废弃,现代内核中很少见)。
K (Wakekill):进程正在等待不可中断的内核操作,且可被致命信号中断。
P (Parked):进程被内核“停放”,通常用于内核线程。

进程分类

​ 功能与服务:用户进程系统进程

​ 应用程序的服务类型:交互进程批处理进程守护进程

  1. 按功能与服务分类

(1)用户进程(User Process)

  • 定义:由用户启动的进程,通常运行在用户空间。
  • 特点
    • 执行用户编写的应用程序(如浏览器、文本编辑器、游戏等)。
    • 权限受限,不能直接访问硬件或内核资源。
    • 依赖于操作系统提供的系统调用(System Call)来访问底层资源。
  • 示例
    • 用户打开的Chrome浏览器进程。
    • 用户运行的Python脚本进程。

(2)系统进程(System Process)

  • 定义:由操作系统内核启动和管理的进程,通常运行在内核空间。
  • 特点
    • 负责管理硬件资源、内存、文件系统等。
    • 具有较高的权限,可以直接访问硬件和内核资源。
    • 通常是操作系统的核心组件。
  • 示例
    • 内存管理进程。
    • 文件系统管理进程。
    • 调度器进程。
  1. 按应用程序的服务类型分类

(1)交互进程(Interactive Process)

  • 定义:与用户直接交互的进程,通常需要用户输入并实时响应。
  • 特点
    • 依赖于用户的输入(如键盘、鼠标)。
    • 需要快速响应,对延迟敏感。
    • 通常运行在前台。
  • 示例
    • 文本编辑器(如Vim、Notepad)。
    • 图形界面应用程序(如浏览器、游戏)。

(2)批处理进程(Batch Process)

  • 定义:不需要用户交互,按预定义的任务列表自动执行的进程。
  • 特点
    • 通常用于处理大量数据或执行重复性任务。
    • 对实时性要求较低,注重吞吐量。
    • 可以在后台运行。
  • 示例
    • 数据备份任务。
    • 日志分析任务。
    • 编译大型项目。

(3)守护进程(Daemon Process)

  • 定义:在后台运行的系统服务进程,通常没有用户界面。
  • 特点
    • 在系统启动时自动运行,持续提供服务。
    • 不依赖于用户交互。
    • 通常以低优先级运行,避免影响系统性能。
  • 示例
    • Web服务器(如Apache、Nginx)。
    • 数据库服务(如MySQL、PostgreSQL)。
    • 系统日志服务(如syslogd)。
  1. 其他分类方式

除了上述分类方式,进程还可以根据其他标准进行分类:

(1)按优先级分类

  • 实时进程(Real-Time Process):对响应时间要求极高的进程(如音视频处理)。
  • 普通进程(Normal Process):对响应时间要求较低的进程(如批处理任务)。

(2)按资源占用分类

  • CPU密集型进程:主要消耗CPU资源(如科学计算)。
  • I/O密集型进程:主要消耗I/O资源(如文件读写、网络通信)。

(3)按父子关系分类

  • 父进程(Parent Process):创建其他进程的进程。
  • 子进程(Child Process):由父进程创建的进程。
分类方式 类型 特点 示例
功能与服务 用户进程 由用户启动,运行在用户空间,权限受限 Chrome浏览器、文本编辑器
系统进程 由操作系统启动,运行在内核空间,权限较高 内存管理、文件系统管理
服务类型 交互进程 与用户直接交互,对实时性要求高 文本编辑器、图形界面应用程序
批处理进程 自动执行任务,注重吞吐量,无需用户交互 数据备份、日志分析
守护进程 后台运行,提供系统服务,无用户界面 Web服务器、数据库服务

进程衍生

由进程产生进程,进程之间是有家族关系

f8e7e74dfdb653db93a57e7332dd9234

关键词:父子进程,僵尸进程,孤儿进程,进程0,进程1

父进程产生子进程,通过fork()创建,子进程是父进程的副本

僵尸进程是系统资源已被回收但还未被父进程回收的进程,不占用系统资源但还有PID,占用进程表

孤儿进程是父进程不正常结束而导致没有父进程的进程,会被init进程收容接管

进程0,内核启动的第一个进程,是计算机启动时引导程序创建的最原始系统进程,负责初始化系统,进程0会产生进程1

进程1,init进程,用户空间的第一个进程,是始祖进程,产生其他所有进程,是所有进程的始祖,负责系统初始化进程管理

进程管理

进程组(Process Group)和会话(Session)

  1. 进程组(Process Group)
  • 定义
    • 进程组是一个或多个进程的集合,这些进程通常是由同一个父进程创建的,并且共享同一个进程组ID(PGID)。
    • 进程组ID通常等于该组中第一个进程(组长进程)的进程ID(PID)。
  • 作用
    • 用于作业控制(Job Control),例如将一组进程作为一个整体进行管理(如暂停、恢复、终止)。
    • 方便向一组进程发送信号(如SIGKILLSIGSTOP)。
  • 特点
    • 每个进程都属于一个进程组。
    • 进程组可以包含多个进程,但只能有一个组长进程。
    • 进程组的存在与终端会话无关。
  1. 会话(Session)
  • 定义
    • 会话是一个或多个进程组的集合,通常与一个终端(Terminal)相关联。
    • 每个会话有一个唯一的会话ID(SID),通常等于会话首进程(Session Leader)的进程ID(PID)。
  • 作用
    • 用于管理终端会话,例如用户登录后启动的所有进程都属于同一个会话。
    • 控制终端的输入输出(如键盘输入、屏幕输出)。
  • 特点
    • 每个会话可以有一个控制终端(Controlling Terminal)。
    • 会话中的进程组分为前台进程组(Foreground Process Group)和后台进程组(Background Process Group)。
    • 前台进程组可以接收终端的输入和信号(如SIGINT),而后台进程组不能。

关键概念

  1. 进程组与会话的关系
  • 一个会话可以包含多个进程组,但只能有一个前台进程组。
  • 进程组可以属于某个会话,但不能跨会话。
  1. 前台进程组与后台进程组
  • 前台进程组
    • 与终端交互的进程组。
    • 可以接收终端的输入(如键盘输入)和信号(如SIGINT)。
  • 后台进程组
    • 不与终端直接交互的进程组。
    • 不能接收终端的输入,但可以接收信号。
  1. 会话首进程(Session Leader)
  • 创建会话的进程称为会话首进程。
  • 会话首进程的PID通常等于会话ID(SID)。
  1. 控制终端(Controlling Terminal)
  • 会话可以与一个终端关联,称为控制终端。
  • 控制终端用于处理输入输出和信号。

进程查看

jobs #查看当前Shell会话的后台进程组
top #实时查看进程信息
ps #静态查看当前系统的进程信息
ps aux #静态查看所有用户的进程信息
ps axjf #以树状结构显示进程及其父子关系
ps aux | grep zsh #查看zsh相关的进程(结合grep命令来实现)

#查看物理CPU的个数
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
#每个cpu的核心数
cat /proc/cpuinfo |grep "physical id"|grep "0"|wc -l