2015-11-08 66 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

相關問題