为什么 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 pagestate中存储的数字代表五种状态之一:

#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。我不知道,但不太可能有任何特别好的理由。