进程状态(操作系统)
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux 内核里,进程有时候也叫做任务)。

进程的状态决定了系统该如何处理进程。在操作系统里,可以用#define,宏定义来定义进程的状态,在 task_struct 结构体定义整形变量来对应状态。进程状态就是 task_struct 中的一个整数。
运行&&阻塞&&挂起(概念)
CPU 运行一个进程,先找到 PCB,通过 PCB 找到进程对应的代码和数据。一个 CPU 有一个调度队列。调度队列就是进程状态为 ready 或 running 的'候选人名单',它决定谁可以被 CPU 执行,而调度器就是挑选'下一个上场的选手'的裁判。运行队列 struct runqueue,里面有一个个 PCB 结点。所以 PCB 既在全局链表也在运行队列中。运行:进程在调度队列中,进程的状态就是 running。阻塞:等待某种设备或者资源就绪。操作系统对计算机的软硬件资源进行管理。像键盘,显示器,网卡等设备。操作系统像对这些硬件资源进行管理--先描述在组织。一个一个结构体 device 串联起来。每个 device 里面有个等待队列。
挂起:CPU,内存资源比较紧时,将进程的代码和数据放到外设磁盘交换分区中,腾出可用资源。(阻塞挂起和就绪挂起)
进程调度与设备管理
本质:结构体与队列管理
我们可以把操作系统的运行抽象为:'通过维护多个队列和结构体,实现对 CPU、内存、设备等资源的调度与控制'。
PCB:进程控制块是调度核心
struct task_struct {
pid_t pid;
long state; // 进程状态:running、sleeping 等
unsigned long flags;
struct mm_struct *mm; // 指向进程地址空间的指针
struct task_struct *parent;
struct list_head run_list; // 运行队列用的链表节点
...
};
位置:
- 所有 PCB 放在一个全局链表中,便于进程查找和管理
- 同时活跃进程还会被挂入运行队列 runqueue 中,供调度器选择运行
运行队列 runqueue
struct runqueue {
nr_running;
};




./code &(在后面加&)
等待键盘输入,S 阻塞 sleeping 可中断休眠,浅度睡眠,可以杀掉
T,t 暂停例子
debug 下,gdb 对程序断点调试,t 进行追踪
ctrl Z 暂停程序
D 深度休眠,代表进程正在等待某个 I/O 操作(如磁盘读写、网络请求、外设交互等)完成,且在此期间无法被中断或杀死。该状态不做演示,一般都是高 IO 操作,若出现 D,就要检查磁盘等设备了。
当子进程在 5 秒后退出时,由于父进程没有调用