多线程与任务调度 — PCB、ABI 与轮询调度

tags: 操作系统, 线程
@烩面 18/01/2026

《操作系统真相还原》学习笔记:进程与线程的关系、PCB 进程控制块、ABI 寄存器约定,以及内核多线程轮询调度的核心实现。

进程与线程

进程 = 资源 + 线程

  • 程序:静态的、存储在文件系统上、尚未运行的指令代码
  • 进程:正在运行的程序,获得运行所需资源后才能成为进程
  • 线程:最小的执行单元,是进程中真正被 CPU 调度、实际执行代码的单元

进程拥有整个地址空间(包括各种资源),而进程中的所有线程共享同一个地址空间。

PCB 进程控制块

PCB(Process Control Block)记录与进程相关的信息:进程状态、PID、优先级等。所有 PCB 放到一张表格中维护,这就是进程表。调度器根据这张表选择上处理器运行的进程。

PCB

ABI 寄存器约定

不管被调函数是否使用以下寄存器,被调函数执行完后它们的值不该被改变:

  • ebp, ebx, edi, esi, esp

被调函数必须在自己的栈中保存这些寄存器的值,返回前恢复。

实现多线程的核心

内核多线程轮询调度的四个核心要素:

  1. 多线程要形成队列,调度从队列中挑选 PCB,通过 PCB 去运行线程
  2. main 要把自己初始化成主线程与其他线程参与轮询调度
  3. 用时钟中断来打断线程的运行,统计线程运行时间,由时钟中断来决定是否调度切换
  4. 有切换机制来完成线程之间的切换

任务调度器

调度器的主要任务:读写就绪队列,增删里面的结点。

完整调度过程需要三部分配合:

  1. 时钟中断处理函数
  2. 调度器 schedule
  3. 任务切换函数 switch_to