进程管理中的队列调度与内存交换机制
前言
进程的高效管理是操作系统设计的核心挑战。当多个进程竞争有限的CPU和内存资源时,系统需要借助队列调度机制合理分配CPU时间片,同时通过内存交换技术缓解物理内存压力。
目录
一、进程队列(Scheduling Queues)
(1) 就绪队列(Ready Queue)
(2) 阻塞队列(Wait Queue)
(3) 挂起队列(Suspended Queue)
二、内存与磁盘交换(Swapping)
(1) 交换触发条件
(2) 交换过程
(3) 挂起状态与Swap的关系
(4) Linux中的实现
一、进程队列(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活动