爲了學習的目的,我想遍歷模塊中的所有任務 並輸出關於它們的不同信息。對於這個任務 我需要鎖定所有任務的列表(我也不確定是否應該這樣做)。我在鎖定tasklist_lock的內核代碼中看到了一些示例 。但是這個符號 不能被模塊使用。其出口被刪除了 c59923a15c12d2b3597af913bf234a0ef264a38b提交。模塊中tasklist_lock的替代方案?
是否有任何其他方式可以鎖定任務列表呢?
爲了學習的目的,我想遍歷模塊中的所有任務 並輸出關於它們的不同信息。對於這個任務 我需要鎖定所有任務的列表(我也不確定是否應該這樣做)。我在鎖定tasklist_lock的內核代碼中看到了一些示例 。但是這個符號 不能被模塊使用。其出口被刪除了 c59923a15c12d2b3597af913bf234a0ef264a38b提交。模塊中tasklist_lock的替代方案?
是否有任何其他方式可以鎖定任務列表呢?
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();
您可以使用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
接口,將暫停所有的任務,並把高優先級的線程上的每個處理器。所以,在回調時沒有其他任務被安排。
你正在使用哪個內核版本? – ciphor 2012-01-31 08:30:22
@ciphor上一個穩定版本 - v3.2.2。但我不明白它是如何產生影響的。 – Beginner 2012-01-31 08:55:46