前言
进程的高效管理是操作系统设计的核心挑战。当多个进程竞争有限的CPU和内存资源时,系统需要借助队列调度机制合理分配CPU时间片,同时通过内存交换技术缓解物理内存压力。
目录
一、进程队列(Scheduling Queues)
操作系统通过多个队列管理不同状态的进程,确保调度高效有序:
(1) 就绪队列(Ready Queue)
作用:存放所有处于就绪状态的进程,等待CPU调度。
实现方式:
通常为优先级队列或多级反馈队列(如Linux的CFS调度器)。
例子:
runqueue
是Linux内核中管理就绪进程的核心数据结构。
触发操作:
入队:进程从创建/阻塞/挂起状态转为就绪。
出队:CPU调度器选择下一个运行的进程。
(2) 阻塞队列(Wait Queue)
作用:管理因等待I/O、信号量等事件而阻塞的进程。
特点:
按事件类型分组(如磁盘I/O队列、网络IO队列)。
事件完成后,内核将对应进程移回就绪队列。
示例:
// Linux内核中的等待队列(简化) struct wait_queue_head { spinlock_t lock; struct list_head head; };
(3) 挂起队列(Suspended Queue)
作用:存储被换出到磁盘的挂起进程(就绪挂起或阻塞挂起)。
管理策略:
就绪挂起:可被直接激活到就绪队列。
阻塞挂起:需等待事件完成后再激活。
二、内存与磁盘交换(Swapping)
当物理内存不足时,系统通过交换空间(Swap) 将部分进程数据暂存到磁盘:
(1) 交换触发条件
内存压力:空闲内存低于阈值(由
vm.swappiness
控制)。进程挂起:主动将长时间不运行的进程换出(如后台服务)。
(2) 交换过程
选择牺牲页(Victim Selection)
算法:LRU(最近最少使用)、CLOCK等。
优先换出非活跃进程的内存页。
换出到磁盘:将选中的内存页写入Swap分区(如
/dev/sda2
)。换入回内存:当进程被激活时,从磁盘重新加载数据。
(3) 挂起状态与Swap的关系
就绪挂起 → 就绪:需先将进程数据从磁盘换入内存。
阻塞挂起 → 阻塞:即使换入内存,仍需等待事件。
(4) Linux中的实现
Swap分区/文件:通过
swapon
/swapoff
管理。查看Swap使用:
free -h # 显示内存和Swap使用情况
vmstat 1 # 监控Swap I/O活动