2015-11-08 79 views
1

在Linux内核树中,文件/include/linux/sched.h包含task_struct,除其他数据外,其中定义了变量volatile long state为什么task_struct中的进程状态存储为'long'类型?

this page,存储在state数量代表的五种状态之一:

#define TASK_RUNNING   0 
#define TASK_INTERRUPTIBLE  1 
#define TASK_UNINTERRUPTIBLE 2 
#define TASK_ZOMBIE    4 
#define TASK_STOPPED   8 

我的问题如下:

为什么用这么大的数据类型来存储状态?单个字节不会完全足以存储上述状态吗?当然,long是不是因为预期成千上万个可能的状态而选择的?

我知道long的定义会因不同的体系结构而有所不同,但我认为char已经足够了。

+1

您是否检查过该标头的实际内容?有'#define TASK_NOLOAD 1024'定义,所以任务状态肯定不适合'char'。很可能,未来会添加另一个标志,即使是“int”也是不够的。 – Tsyvarev

回答

1

你可以很容易地看到这些值是2的幂。这是处理/ flags /的标准方法。您可以逻辑或('|')来创建联合状态。然后,您可以使用AND('&')轻松测试它们。

在32位平台上的长只有32位。

因此,长期在32位平台上,您只有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) 

所以,问题是为什么这将是长而不是int。我不知道,但不太可能有什么特别好的理由。

+0

long还可能需要处理寄存器大小... 8个字节对64位处理器有意义 – basav

相关问题