接前一篇文章:Linux内核进程管理子系统有什么第十回 —— 进程主结构详解(6)
本文内容参考:
Linux内核进程管理专题报告_linux rseq-优快云博客
《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超
《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社
特此致谢!
进程管理核心结构 —— task_struct
前几回用了几个回目的篇幅详细讲解了task_struct结构中的任务ID相关成员,本回开始解析struct task_struct中任务状态相关成员。
2. 任务状态相关成员
任务状态相关的成员包括以下几个:
unsigned int __state;
int exit_state;
unsigned int flags;
这几个字段的描述如下:
字段 | 类型 | 描述 |
---|---|---|
__state | int | 进程的状态 |
exit_state | int | 进程退出状态 |
flags | unsigned int | 进程的标记 |
(1)进程的状态
int __state字段描述了进程(当前)的状态,更准确地说,应该是任务的状态。其各个取值的定义详见于include/linux/sched.h中,如下:
/*
* Task state bitmask. NOTE! These bits are also
* encoded in fs/proc/array.c: get_task_state().
*
* We have two separate sets of flags: task->state
* is about runnability, while task->exit_state are
* about the task exiting. Confusing, but this way
* modifying one set can't modify the other one by
* mistake.
*/
/* Used in tsk->state: */
#define TASK_RUNNING 0x00000000
#define TASK_INTERRUPTIBLE 0x00000001
#define TASK_UNINTERRUPTIBLE 0x00000002
#define __TASK_STOPPED 0x00000004
#define __TASK_TRACED 0x00000008
/* Used in tsk->exit_state: */
#define EXIT_DEAD 0x00000010
#define EXIT_ZOMBIE 0x00000020
#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
#define TASK_PARKED 0x00000040
#define TASK_DEAD 0x00000080
#define TASK_WAKEKILL 0x00000100
#define TASK_WAKING 0x00000200
#define TASK_NOLOAD 0x00000400
#define TASK_NEW 0x00000800
#define TASK_RTLOCK_WAIT 0x00001000
#define TASK_FREEZABLE 0x00002000
#define __TASK_FREEZABLE_UNSAFE (0x00004000 * IS_ENABLED(CONFIG_LOCKDEP))
#define TASK_FROZEN 0x00008000
#define TASK_STATE_MAX 0x00010000
#define TASK_ANY (TASK_STATE_MAX-1)
/*
* DO NOT ADD ANY NEW USERS !
*/
#define TASK_FREEZABLE_UNSAFE (TASK_FREEZABLE | __TASK_FREEZABLE_UNSAFE)
/* Convenience macros for the sake of set_current_state: */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
#define TASK_TRACED __TASK_TRACED
#define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD)
/* Convenience macros for the sake of wake_up(): */
#define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)
/* get_task_state(): */
#define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \
TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
__TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \
TASK_PARKED)
从(宏)定义的数值可以看出来,__state是通过bitset的方式设置的。也就是说,当前是什么状态,对应的那一位就置位(置1)。
常见的取值如下表所示:
状态定义 | 描述 |
---|---|
TASK_RUNNING | 进程正在执行或准备执行(就绪) |
TASK_INTERRUPTIBLE | 可中断的休眠 |
TASK_UNINTERRUPTIBLE | 不可中断的休眠 |
__TASK_STOPPED | 停止执行 |
__TASK_TRACED | 被监控 |
TASK_PARKED | 进程处于“停泊”状态,主要用于内核线程 |
TASK_DEAD | 进程已死亡,可进行资源回收 |
TASK_WAKEKILL | 在接收到致命信号时唤醒进程 |
TASK_WAKING | 进程正在被唤醒 |
TASK_NOLOAD | 进程不计算在负载中 |
TASK_NEW | 进程新创建 |
TASK_FROZEN | 进程被冻结 |
关于进程的状态,在前文书讲解进程状态模型的时候就已经涉及到了,参见:
Linux内核进程管理子系统有什么第四回 —— 进程进阶知识(下)-优快云博客
- 三态模型
- 五态模型
- 七态模型
下一回开始,结合进程状态模型,对于进程状态的以上各取值进行详细解析。