2012-05-16 26 views
9

我們使用的是內核版本2.4-20,我們需要在內核模式下統計活動用戶的數量。目標是改變調度器,所以我們在sched.c中修改schedule()函數。如何統計內核中活動用戶的數量

我們要做的是統計list_for_each宏中的用戶。

list_for_each(tmp, &runqueue_head) { 
    p = list_entry(tmp, struct task_struct, run_list); 
    if (can_schedule(p, this_cpu)) { 
     if (unique(p->uid)) add_new_user(p->uid); 
     int weight = goodness(p, this_cpu, prev->active_mm); 
     if (weight > c) 
      c = weight, next = p; 
    } 
} 

這基本上是將唯一的用戶添加到列表。但是,我們得到隨機結果。有沒有解決這個問題的具體方法?

謝謝。

+4

「隨機結果」是什麼意思? – ArjunShankar

+0

起初我們把用戶計算在goodness()函數中,我們有絕對的任意數字(儘管我們有4個用戶同時運行,我們可以得到1個用戶作爲結果)。在sched()中,我們似乎有一致的值,但我們不確定,因爲sched()運行頻繁,所以我們需要抽取樣本(一次5000輪)。我猜在內核中沒有包含當前活動用戶的字段?如果沒有,最好的方法是什麼?感謝您的答覆。 –

+0

謝謝澄清。我不知道這個答案。我的意圖是指出這個問題並不完全清楚。我建議編輯這個問題。祝你好運! – ArjunShankar

回答

1

您可能想要嘗試統計for_each_task宏內的用戶。這導致計算具有由於I/O或任何其他原因而被阻塞的任務的用戶。這應該會提供更好的結果,因爲如果您使用運行隊列,則無法保證能夠對運行交互式進程的用戶進行計數。

+0

這是有道理的。但我們首先計算善良功能的用戶,這可能是隨機結果的原因。雖然我沒有解釋。出於某種原因,schedule函數中的for_each_task有效。謝謝! –

0

這項工作?誰| awk'{print $ 1}'| sort -ud

+0

然後你可以點數。 – Keshi

+0

我在內核中,我不能使用系統調用和終端程序。 –

相關問題