Skip to content

进程、线程与调度

进程和线程

  • 进程(process):运行中的程序实例,拥有独立虚拟地址空间、打开文件、句柄等资源,是资源隔离的重要边界。
  • 线程(thread):进程内的一条执行流,拥有自己的程序计数器、寄存器、栈和线程局部存储;同一进程的线程共享代码、堆、全局数据和多数进程资源。操作系统通常以线程作为实际调度实体。
对比进程线程
地址空间通常隔离同进程内共享
创建/切换资源和页表等状态更多,开销通常较大上下文较少,通常更轻量
通信管道、共享内存、Socket、消息队列等 IPC可直接共享内存,但需同步
隔离性一个进程崩溃通常不直接破坏其他进程一个线程越界/崩溃常导致整个进程受影响

并发与并行

  • 并发(concurrency):多个任务在同一时间段推进;单核可通过时间片交替实现。
  • 并行(parallelism):多个任务在同一时刻由多个硬件执行单元同时执行。

并发关注结构和任务协作;并行关注真实的同时执行与吞吐提升。多核程序可同时具备二者。

用户态与内核态

CPU 通过特权级别保护系统资源:

  • 用户态:应用运行的受限模式,不能直接执行特权指令、操作页表或直接管理硬件。
  • 内核态:操作系统内核运行的高特权模式,可管理硬件、内存、调度和文件系统。

状态切换常由以下事件触发:

  1. 系统调用:如 readwriteopen,应用通过受控入口请求内核服务;
  2. 异常:如缺页、除零、非法指令;
  3. 中断:如网卡、磁盘、时钟产生的外部事件;
  4. 调度:时钟中断或阻塞事件使内核选择其他可运行线程。

用户态/内核态切换不等同于进程或线程上下文切换;系统调用返回原线程时可能没有发生任务切换。

常见调度算法

算法特点问题/适用点
先来先服务 FCFS按到达顺序执行简单,但长任务会造成护航效应
最短作业优先 SJF优先预计运行最短的作业平均等待时间低;长任务可能饥饿,且难精确预测时长
最短剩余时间 SRTFSJF 的抢占式版本新短任务可抢占;长任务仍可能饥饿
优先级调度按优先级选择低优先级可能饥饿,可用 aging 提升等待者优先级
时间片轮转 RR轮流执行固定时间片适合分时交互;时间片过大退化 FCFS,过小切换开销高
多级反馈队列 MLFQ多个优先级队列,按行为动态迁移兼顾交互和吞吐,是通用系统常见思路

进程间通信(IPC)

方式特征
匿名管道内核缓冲区字节流,常用于有亲缘关系的进程,通常单向
命名管道 FIFO有路径名,可用于无亲缘进程,仍是字节流
消息队列以消息为单位传递,可带类型/优先级
共享内存多进程映射同一物理页,数据通路最快,但必须额外同步
信号异步通知某事件,携带信息有限,不适合传大量数据
Socket可跨主机,也可本机 UNIX domain socket;接口通用
信号量/进程共享锁主要用于协调对共享资源的访问,而非承载大量数据

条件变量、互斥锁常用于线程同步;在支持进程共享属性和共享内存时,也可被用于进程间同步。

使用 Markdown 与 VitePress 构建