私は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
@wmjdgla:カーネルのバージョンは? 'nice'と' sched_rr_get_interval'を呼び出すコードを投稿できますか? –
コードは実験室のコンピュータに座っているので、明日(現在は午後10時44分)待つ必要があります。私はすでに家に帰っています。バージョンを確認するために戻る必要があります。見てくれてありがとう! – wmjdgla
@Jasonが今削除されたコメントで提案したことを試す価値があるかもしれません。 'nice()'の代わりに 'setpriority()'を呼び出してください。 –