2012-01-30 125 views
0

爲了學習的目的,我想遍歷模塊中的所有任務 並輸出關於它們的不同信息。對於這個任務 我需要鎖定所有任務的列表(我也不確定是否應該這樣做)。我在鎖定tasklist_lock的內核代碼中看到了一些示例 。但是這個符號 不能被模塊使用。其出口被刪除了 c59923a15c12d2b3597af913bf234a0ef264a38b提交。模塊中tasklist_lock的替代方案?

是否有任何其他方式可以鎖定任務列表呢?

+0

你正在使用哪個內核版本? – ciphor 2012-01-31 08:30:22

+0

@ciphor上一個穩定版本 - v3.2.2。但我不明白它是如何產生影響的。 – Beginner 2012-01-31 08:55:46

回答

1

stop_machine()引入空閒線程並禁用每個系統的CPU中的中斷,除了執行用戶定義的函數的那個​​函數作爲參數傳遞給stop_machine()。這相當於將每個自旋鎖保持在內核中,並且只要用戶定義的函數運行就會導致系統凍結。不用說,它對性能有很大影響,但也提供了強大的一致性保證。

如果您只想讀取系統任務中的數據,並且您不介意絕對精確(一致性),則可以在read-copy-update (RCU)關鍵部分中遍歷流程的會計清單。您也可以檢查RCU in Wikipedia

struct task_struct *iter; 
rcu_read_lock(); 
list_for_each_entry_rcu(iter, &init_task.tasks, tasks) { 
    printf("The current task of the list is: %s\n.", iter->comm); 
} 
rcu_read_unlock(); 
1

您可以使用stop_machine()如下:

int for_each_task(void * data) 
{ 
    struct task_struct * g, * p; 
    do_each_thread(g, p) { 
    // do the work 
    } while_each_thread(g, p); 
    return 0; 
} 

... 
stop_machine(for_each_task, NULL, NULL); 
... 

stop_machine接口,將暫停所有的任務,並把高優先級的線程上的每個處理器。所以,在回調時沒有其他任務被安排。