QEQuantumEinsteinSearchCtrl/⌘K

第二章 进程的描述与控制

5 分钟阅读2,21430 个小节
返回目录

第二章 进程的描述与控制

2.1 前趋图和程序执行

前趋图(DAG)

  • 有向无循环图(DAG),用于描述进程间的前后关系
  • 节点表示语句/程序段/进程,有向边表示前趋关系

程序顺序执行的特征

  1. 顺序性:严格按顺序执行
  2. 封闭性:程序独占全部资源,结果不受外界影响
  3. 可再现性:输入相同→结果相同

程序并发执行的特征

  1. 间断性:执行—暂停—执行
  2. 失去封闭性:共享资源,执行环境被外界影响
  3. 不可再现性:结果可能因调度顺序不同而不同

2.2 进程的描述

进程的定义

  • 进程是程序的一次执行过程
  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位(引入线程后,线程成为调度的基本单位)

进程的特征

特征说明
动态性(最基本)进程有创建、运行、消亡的生命周期
并发性多个进程可同时存在于内存中并发执行
独立性进程是独立运行和获得资源的基本单位
异步性各进程按各自独立、不可预知的速度推进

进程的状态

三态模型

就绪 ——调度——→ 运行 ↑ ↓ ← —事件完成—— 阻塞 ↑ ↓ ←←←←←←←←←←←←← 时间片完/被抢占

五态模型:就绪、运行、阻塞 + 创建、终止

七态模型(含挂起):

  • 活动就绪 ↔ 静止就绪(挂起)
  • 活动阻塞 ↔ 静止阻塞(挂起)

挂起(Suspend):进程从内存调至外存;激活(Active):进程从外存调回内存

进程控制块 PCB

PCB是进程存在的唯一标志,包含4类信息:

类别内容
进程标识符内部标识符(PID数字标识)、外部标识符(用户使用的名称)
处理机状态通用寄存器、PC、PSW、用户栈指针
进程调度信息进程状态、优先级、事件(阻塞原因)、调度其他信息
进程控制信息程序和数据地址、同步和通信机制、资源清单、链接指针

PCB的组织方式

  1. 线性方式:所有PCB放在一个线性表中
  2. 链接方式:按状态链成多个队列(就绪队列、阻塞队列等)
  3. 索引方式:建立索引表,表项指向PCB

2.3 进程控制

进程控制通过原语实现(原语在内核态执行,不可中断)。

原语功能
创建原语分配PID→分配资源→初始化PCB→插入就绪队列
终止原语查找PCB→若进程正在运行则终止→终止其子孙进程→归还资源→删除PCB
阻塞原语将进程从运行态→阻塞态,保存现场,插入等待队列
唤醒原语从等待队列移出→将进程从阻塞态→就绪态,插入就绪队列
挂起原语活动就绪→静止就绪,或活动阻塞→静止阻塞
激活原语静止就绪→活动就绪,或静止阻塞→活动阻塞

⚠️ 阻塞和唤醒必须成对出现!阻塞由进程自己调用(主动),唤醒由其他相关进程调用(被动)。


2.4 进程通信

方式说明
共享存储器多个进程通过读/写共享内存区域通信;需同步互斥机制保护
管道(pipe)半双工,固定大小缓冲区(通常4KB),FIFO字节流;写满时写进程阻塞,读空时读进程阻塞;连接读写进程的共享文件
消息传递直接通信:点对点,send(P,msg)/receive(Q,msg);间接通信:通过邮箱,send(A,msg)/receive(A,msg)
客户机-服务器socket(套接字,可跨网络)/ RPC(远程过程调用)

2.5 线程

线程的概念

  • 线程是CPU调度的基本单位
  • 进程是资源分配的基本单位
  • 一个进程可包含多个线程,共享进程资源
  • 线程比进程更轻量,切换开销更小

进程 vs 线程

比较项进程线程
资源分配资源分配的基本单位不拥有系统资源(共享进程资源)
调度(无线程时)调度的基本单位调度的基本单位
并发性进程间可并发进程内的多线程也可并发
系统开销进程创建/撤销/切换开销大(需切换页表导致TLB失效/Cache冷)线程切换开销小(不切换地址空间,TLB/Cache仍有效)
独立性进程间独立同一进程内的线程共享地址空间

线程控制块 TCB

包含:线程标识符、寄存器状态(PC、PSW、通用寄存器)、线程运行状态、优先级、栈指针等。

线程的实现方式

方式优点缺点
用户级线程ULT不需内核支持,切换快,进程可专用调度算法,平台无关一个线程阻塞→整个进程阻塞;不能利用多处理机
内核级线程KST多处理机上可并行,一线程阻塞不影响其他,内核本身也可多线程模式切换开销大(用户态→内核态)
组合方式结合两者优点实现复杂

多线程模型

模型说明缺点
多对一多个ULT映射到一个KST一阻塞全阻塞,不能多处理机并行
一对一每个ULT对应一个KST创建开销大(如Windows NT)
多对多多个ULT映射到≤ULT数的KST结合优点,最灵活

轻量级进程(LWP)

  • 作为ULT与KST之间的中间层
  • 每个LWP连接一个KST
  • ULT通过LWP间接使用内核服务

2.6 程序运行环境与进程内存映像(2026趋势)

进程内存映像(Memory Image)

典型用户进程地址空间自低地址到高地址可概括为:

text(代码段) → data(已初始化全局/静态区) → bss(未初始化全局/静态区) → heap(堆,向高地址增长) ... stack(栈,向低地址增长)

  • text段:机器指令与只读常量,通常只读且可共享
  • data段:已初始化的全局变量和静态变量
  • bss段:未初始化全局变量和静态变量(装入时清零)
  • heap堆:由 malloc/new 等动态扩展和回收
  • stack栈:函数调用现场、局部变量、返回地址

⚠️ 易考辨析:进程共享“代码和只读数据”通常发生在同一程序多进程场景;线程共享进程地址空间,但各线程栈独立。

fork 与 COW(写时复制)

  • fork() 后父子进程最初共享物理页框(只读映射)
  • 任一方尝试写入时触发保护异常,OS复制该页(Copy-On-Write)
  • COW的目标:减少无效复制开销,提高创建子进程效率

2.7 信号(Signal)机制(2025新增)

信号的本质

  • 信号是软件层面的异步事件通知机制,用于告知进程“发生了某事件”
  • 信号不是数据传输通道,主要表达“发生了什么”而非“传了什么”

信号处理方式

  1. 默认处理(终止/忽略/停止/继续/核心转储)
  2. 显式忽略(部分信号可忽略)
  3. 自定义处理函数(signal handler)

常见高频信号

  • SIGKILL(9):立即终止,不可捕获、不可忽略
  • SIGTERM(15):请求终止,可被捕获处理
  • SIGCHLD:子进程状态变化通知父进程
  • SIGSEGV:非法内存访问

生命周期与检查时机

  • 流程:产生(generate)→ 未决(pending)→ 递送(deliver)→ 处理(handle)
  • 内核通常在从核心态返回用户态前检查并递送可处理信号

信号 vs 信号量(常考)

对比项信号(Signal)信号量(Semaphore)
作用异步事件通知同步与互斥
是否计数资源是(value体现资源数/等待数)
典型场景进程终止、异常通知、子进程回收生产者-消费者、互斥临界区

⚠️ 一句话区分:Signal解决“事件到了吗”,Semaphore解决“资源够不够/次序对不对”。

🎯 本章真题锚点与最短模板

  • 高频题号(2009-2025):2011Q25、2014Q26、2017Q27、2019Q23/Q24、2024Q24/Q25/Q28、2025Q22/Q46
  • 优质例题:判断“创建子进程、I/O完成、时间片用完、请求I/O”引起的进程状态转换。
  • 最短解题模板
    1. 建立五态图:就绪、执行、阻塞及方向箭头。
    2. 逐事件映射:时间片到期→执行→就绪;I/O请求→执行→阻塞;I/O完成→阻塞→就绪。
    3. 涉及线程时先判“共享什么”:地址空间共享,栈/寄存器私有。

⚡ 秒杀版口令卡(10秒回忆)

  • 口令:时间片到=就绪;等I/O=阻塞;I/O完=就绪。
  • 口令:进程管资源,线程管调度。
  • 口令:共享地址空间,私有栈与寄存器。