2011-07-20 12 views
2

私はSUSE Linux Real TimeでC++プログラムを作成しており、ラウンドロビン(RR)スケジューリングポリシーでタイミング統計を収集しようとしています。私はリアルタイムLinuxでラウンドロビンタイムクォンタムを変更できません

#include <sched.h> 
... 
struct sched_param sparms; 
sparms.sched_priority = 99; 
if (sched_setscheduler(0, SCHED_RR, &sparms) < 0){ 
    perror("sched_setsched"); 
    exit(1); 
} 

を経てRRにポリシーを設定することができるよとsched_rr_get_interval()を経由して、時間量子を決定することができます。 OSのドキュメントでは、プロセスの素敵な値によってタイムクォンタムを変更できると述べています。しかし、そうしても効果はありませんでした。 nice値をnice()で変更し、実際にgetpriority()で変更されていることを確認しましたが、sched_rr_get_interval()は同じ時刻に戻ります。 何が起こっているのは誰でも知っていますか?

編集:以下のコードを追加しました。 setpriority()が機能しませんでした。

... 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/resource.h> 
... 
// Set scheduler to RR 
struct sched_param sparms; 
sparms.sched_priority = 99; 
if(sched_setscheduler(0, SCHED_RR, &sparms) < 0){ 
    fprintf(stderr, "Error setting thread scheduling policy & priority."); 
    exit(-1); 
} 
timespec qtm; 
sched_rr_get_interval(0, &qtm); 
fprintf(stderr, "Time quantum(thread 1): %lds %ldns.\n", qtm.tv_sec, qtm.tv_nsec); 
fprintf(stderr, "Current nice value: %d\n", getpriority(PRIO_PROCESS, 0)); 
if(nice(90) < 0) fprintf(stderr, "Error setting time quantum.\n"); 
//setpriority(PRIO_PROCESS, 0, 10); 
fprintf(stderr, "New nice value: %d\n", getpriority(PRIO_PROCESS, 0)); 
sched_rr_get_interval(0, &qtm); 
fprintf(stderr, "New time quantum(thread 1): %lds %ldns.\n", qtm.tv_sec, qtm.tv_nsec); 
... 

編集:OSのバージョン:2.6.33.7-rt29-0.5-RT

+0

@wmjdgla:カーネルのバージョンは? 'nice'と' sched_rr_get_interval'を呼び出すコードを投稿できますか? –

+0

コードは実験室のコンピュータに座っているので、明日(現在は午後10時44分)待つ必要があります。私はすでに家に帰っています。バージョンを確認するために戻る必要があります。見てくれてありがとう! – wmjdgla

+0

@Jasonが今削除されたコメントで提案したことを試す価値があるかもしれません。 'nice()'の代わりに 'setpriority()'を呼び出してください。 –

答えて

3

ラウンドロビン時間量子をコントロールする能力は、Linuxのリアルタイムスケジューラから削除されたようです。ソース(kernel/sched_rt.c)をみる

、タイムスライスカウンタは、それがtask_tick_rt()に満了した場合(0.1秒として定義DEF_TIMESLICE、)一定の値に復元するので、それを動的に変更する方法はありません。 (sched_rr_get_interval()によって呼び出される)get_rr_interval()はいつもあなたが小さいタイムスライスが必要な場合は、私はあなたに合わせて、適切な時期にsched_yield()にFIFOスケジューラとの通話で、それを自分で行う、またはカーネルをハックする必要がありますね一定の値

ことを返します。ニーズ。

関連する問題