为什么 task_struct 中的进程状态存储为 'long' 类型?
Why is the process state in task_struct stored as type 'long'?
在 Linux 内核树中,文件 /include/linux/sched.h
包含 task_struct
,它在其他数据中定义了一个变量 volatile long state
.
根据this page,state
中存储的数字代表五种状态之一:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
我的问题如下:
为什么要用这么大的数据类型来存储状态?单个字节是否足以存储上述状态?当然,long
不是因为预期 thousands/millions 可能的状态而被选中的?
我知道 long
的定义在不同的体系结构中会有所不同,但我认为 char
就足够了。
您可以很容易地看出这些值是 2 的幂。这是处理/flags/ 的标准方式。您可以对它们进行逻辑或 ('|') 以创建联合状态。然后您可以使用 AND ('&').
轻松测试它们
long 在 32 位平台上只会是 32 位。
因此,在 32 位平台上使用 long 时,您只有 32 个不同的标志,而不是数百万个。
最后,我强烈建议检查实际来源,最好是这十年的来源,请参阅:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_DEAD 16
#define EXIT_ZOMBIE 32
#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
#define TASK_PARKED 512
#define TASK_NOLOAD 1024
#define TASK_STATE_MAX 2048
并在下面标记用法,例如
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
所以,问题是为什么它是 long 而不是 int。我不知道,但不太可能有任何特别好的理由。
在 Linux 内核树中,文件 /include/linux/sched.h
包含 task_struct
,它在其他数据中定义了一个变量 volatile long state
.
根据this page,state
中存储的数字代表五种状态之一:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
我的问题如下:
为什么要用这么大的数据类型来存储状态?单个字节是否足以存储上述状态?当然,long
不是因为预期 thousands/millions 可能的状态而被选中的?
我知道 long
的定义在不同的体系结构中会有所不同,但我认为 char
就足够了。
您可以很容易地看出这些值是 2 的幂。这是处理/flags/ 的标准方式。您可以对它们进行逻辑或 ('|') 以创建联合状态。然后您可以使用 AND ('&').
轻松测试它们long 在 32 位平台上只会是 32 位。
因此,在 32 位平台上使用 long 时,您只有 32 个不同的标志,而不是数百万个。
最后,我强烈建议检查实际来源,最好是这十年的来源,请参阅:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_DEAD 16
#define EXIT_ZOMBIE 32
#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
#define TASK_PARKED 512
#define TASK_NOLOAD 1024
#define TASK_STATE_MAX 2048
并在下面标记用法,例如
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
所以,问题是为什么它是 long 而不是 int。我不知道,但不太可能有任何特别好的理由。