Linux中《进程状态--进程调度--进程切换》详细介绍

发布时间:2026/7/16 20:31:56
Linux中《进程状态--进程调度--进程切换》详细介绍 目录进程状态Linux内核源代码怎么说运行阻塞挂起内核链表进程状态查看Z(zombie)-僵尸进程僵尸进程危害孤儿进程进程优先级进程切换Linux2.6内核进程O(1)调度队列进程状态Linux内核源代码怎么说为了弄明白正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。进程状态就是task_struct内的一个整形变量,也是一个标记位(宏定义的)。状态决定了当前系统如何处理这个进程。运行阻塞挂起运行状态该进程在调度队列中或者正在被CPU执行。阻塞状态等待某种设备或资源就绪(如果不就绪,我的进程就不会被调度)。运行状态转化为阻塞状态,本质上就是把PCB链入到不同的数据结构当中!只有在运行队列中,进程才会被调度,但是现在进程在设备队列中,那么如何再被CPU调度呢?总结:进程状态变化的表现之一,就是CPB要在不同的数据结构之间进行流动,本质都是数据结构的增删查改。挂起状态当内存资源不足时,将wait_queue里的进程的代码和数据唤出到磁盘当中swap交换分区。如果次数键盘就绪了,OS会把磁盘当中该PCB的代码和数据再重新加载到内存,构建指针映射,这个也叫做唤入。我们把这个称为阻塞挂起,运行挂起也是同样的道理。内核链表注意:Linux 内核通过著名的 container_of 宏实现了利用链表节点反推整个进程控制块(PCB)首地址的魔法:由于编译器在编译时就确定了 tasks 链表字段在整个 task_struct 结构体内部的固定相对偏移量,因此在遍历链表时,内核只需用当前 tasks 节点的实际内存地址减去这个偏移量(即宿主首地址 = 节点地址 - 偏移量),就能瞬间计算并定位到外层 task_struct 的起始地址,从而完美实现了对所有进程的高效遍历。下⾯的状态在kernel源代码⾥定义:/**The task state array is a strange “bitmap” of*reasons to sleep. Thus “running” is zero, and*you can test for combinations of others with*simple bit tests.*/staticconstchar*consttask_state_array[]={"R (running)",/*0 *///运行"S (sleeping)",/*1 *///阻塞