task struct原始碼解讀

2022-04-03 01:22:51 字數 3561 閱讀 4975

task_struct英文原始碼原文

以下是中文以及解釋:(未完待續,慢慢敲)

#define task_running 0x0000//程序要麼正在執行,要麼準備執行,核心中有乙個佇列,裡面都是等待執行的程序。

#define task_interruptible 0x0001 //可中斷的睡眠,可以通過乙個訊號喚醒

#define task_uninterruptible 0x0002//不可中斷睡眠,不可以通過訊號進行喚醒

#define __task_stopped 0x0004 //程序停止執行,在程序接收到 sigttin、sigstop、sigtstp、stgttou訊號後會進入此狀態

#define __task_traced 0x0008//程序被追蹤,被 debugger 等程序監視。

/* used in tsk->exit_state: */

#define exit_dead 0x0010//殭屍狀態的程序,表示程序被終止,但是父程序還沒有獲取它的終止資訊,比如程序有沒有執行完等資訊。 

#define exit_zombie 0x0020//程序的最終狀態,程序死亡

#define exit_trace (exit_zombie | exit_dead)

/* used in tsk->state again: */

#define task_parked 0x0040//停放狀態

#define task_dead 0x0080//死亡,最終狀態

#define task_wakekill 0x0100//喚醒並殺死的程序

#define task_waking 0x0200//喚醒程序

#define task_noload 0x0400//空載狀態

#define task_new 0x0800//新的狀態

#define task_state_max 0x1000//任務狀態的最大值

2. 

/* 為set_task_state提供便利的巨集 */

#define task_killable (task_wakekill | task_uninterruptible)

#define task_stopped (task_wakekill | __task_stopped)

#define task_traced (task_wakekill | __task_traced)

#define task_idle (task_uninterruptible | task_noload)

/* 為了方便喚醒而使用的便利巨集 */

#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)

#define task_is_traced(task) ((task->state & __task_traced) != 0)

#define task_is_stopped(task) ((task->state & __task_stopped) != 0)

#define task_is_stopped_or_traced(task) ((task->state & (__task_stopped | __task_traced)) != 0)

#define task_contributes_to_load(task) ((task->state & task_uninterruptible) != 0 && \

(task->flags & pf_frozen) == 0 && \

(task->state & task_noload) == 0)

3.#ifdef config_debug_atomic_sleep  這個巨集的實際含義不大,要是深究的話解釋連線在這裡

# define might_sleep() 

do  while (0)

在當前config_debug_atomic_sleep選項使能的前提下, 可以看到__might_sleep還是幹了不少事情的,最主要的工作是在第乙個if語句那裡,尤其是preempt_count_equals和 irqs_disabled,都是用來判斷當前的上下文是否是乙個atomic context,因為我們知道,只要程序獲得了spin_lock的任乙個變種形式的lock,那麼無論是單處理器系統還是多處理器系統,都會導致 preempt_count發生變化,而irq_disabled則是用來判斷當前中斷是否開啟。__might_sleep正是根據這些資訊來判斷當前正在執行的**上下文是否是個atomic,如果不是,那麼函式就直接返回了,因為一切正常。如果是,那麼**下行。

所以讓config_debug_atomic_sleep選項開啟,可以捕捉到在乙個atomic context中是否發生了sleep,如果你的**不小心在某處的確出現了這種情形,那麼might_sleep會通過後續的printk以及dump_stack來協助你發現這種情形。

extern enum system_states  system_state;
最常見的狀態當然是system_running了,你的系統正常起來之後就處於這個狀態。因為跟當前的話題沒有直接的關聯,這裡只提一下好了。

4.設定當前task和特殊task的狀態,特殊狀態是不使用常規等待迴圈模式的狀態。 參見帶有set_special_state()的注釋。

#define is_special_task_state(state)                \

((state) & (__task_stopped | __task_traced | task_parked | task_dead))

#define __set_current_state(state_value) \

do while (0)

#define set_current_state(state_value) \

do while (0)

#define set_special_state(state_value) \

do while (0)

openTLD 原始碼解讀

首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...

thinkphp原始碼解讀

thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...

HashMap原始碼解讀

一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...