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提供便利的巨集 */3.#ifdef config_debug_atomic_sleep 這個巨集的實際含義不大,要是深究的話解釋連線在這裡#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)
# 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...