2014-11-14 36 views
0

我正在學習調度程序,並且只是爲了理解數據結構的組織方式而進行各種攻擊。現在我試圖瞭解調度程序的運行隊列是如何組織的。所以給定一個過程,我想我可以找到它的運行隊列。但我只是想遍歷所有正在運行的隊列。我怎樣才能做到這一點?如何訪問系統中的所有正在運行的隊列?

+0

你試過使用init_task來追蹤runqueue嗎? –

+0

不,我會怎麼做?跟蹤是什麼意思? –

+0

在linux內核中有一個變量名稱init_task,它基本上是runqueue鏈接列表的頭部。使用這個頭,嘗試遍歷runqueue。你還使用哪個內核版本? –

回答

0

糾正我,如果我錯了。 每個處理器只有一個隊列(它被組織爲雙鏈表)用於運行進程。但系統上可能有更多的進程。一個任務可以從一個處理器開始,然後調度程序切換上下文,或者該任務進入睡眠狀態並遷移到另一個處理器並在那裏完成其工作。

爲了看到處理器上的任務,可以在簡單內核模塊中使用for_each宏。

+0

你幾乎是正確的,有兩個運行隊列前CPU(一個工作,一個用於過期的任務)。無論如何,你的意思是哪個'for_each'?有很多。例如, –

+0

。 如果您在函數「static int thread(void * data)」中查看https://github.com/0xDen/unptrace/blob/master/unptrace.c,您可能會看到循環 - ** list_for_each **宏用於迭代任務。 – 0xDen

+0

我想過這個。這種方法給了我任務,而不是運行隊列,它也給我所有不能運行的任務,這些任務不屬於運行隊列。另外,如何知道在我運行模塊時是否有另一個運行隊列(偶然)空了? –

相關問題