2012-05-16 1 views
9

カーネルバージョン2.4-20を使用しており、カーネルモードでアクティブユーザー数をカウントする必要があります。目標はスケジューラーを変更することです、従って私達はスケジュール()機能を変更するsched.cにあります。カーネル内のアクティブユーザー数をカウントする方法

私たちが行うことは、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回に1回)。私は現在のアクティブなユーザーを保持するフィールドがカーネルにないと思いますか?そうでない場合、それらを数える最善の方法は何ですか?お返事をありがとうございます。 –

+0

ご清聴ありがとうございます。私はこれに対する答えを知らない。私の意図は、その質問が完全にはっきりしていないことを指摘することでした。これを質問に編集することをお勧めします。がんばろう! – ArjunShankar

答えて

1

for_each_taskマクロ内のユーザー数をカウントしてみてください。この結果、I/Oまたはその他の理由でブロックされたタスクを持つユーザーがカウントされます。これは、実行キューを使用する場合、対話型プロセスを実行するユーザーを数えることができないため、より良い結果が得られるはずです。

+0

となります。最初に機能の良さでユーザーを数えると、ランダムな結果の原因になる可能性があります。私はそれについての説明がありません。何らかの理由で、スケジュール機能のfor_each_taskが機能します。ありがとう! –

0

これは機能しますか?誰が| awk '{print $ 1}' | sort -ud

+0

あなたはそれから数を取ることができます。 – Keshi

+0

私はカーネルに入っているので、システムコールや端末プログラムを使用することはできません。 –

関連する問題