Linux内核进程管理子系统有什么第十一回 —— 进程主结构详解(7)

接前一篇文章: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;

 这几个字段的描述如下:

字段类型描述
__stateint进程的状态
exit_stateint进程退出状态
flagsunsigned 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内核进程管理子系统有什么第四回 —— 进程进阶知识(下)-优快云博客

  • 三态模型

  • 五态模型

  • 七态模型

下一回开始,结合进程状态模型,对于进程状态的以上各取值进行详细解析。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值