2012-05-12 3 views
6

私はSCHED_FIFOで実験していますが、予期しない動作が発生しています。私が使用しているサーバーにはハイパースレッディングが無効な12個のコアがあります。すべての設定可能な割り込みは、CPU 0で実行するように設定されています。Linuxリアルタイムスケジューリングの優先順位(SCHED_FIFOとSCHED_RR)の実際的な使用?

私のプログラムの開始は、CPUアフィニティがコア0に設定されたスケジューリングポリシーを変更せずに、pthreadsライブラリを使用して優先度の低いタスクのスレッドを作成します。コア3との親和性と独自のスケジューリング方針をSCHED_FIFOに設定して、sched_setscheduler()をpid0と優先度1で使用し、ノンブロッキングループの実行を開始します。

プログラム自体は正常に動作します。ただし、プログラムの実行中にサーバーに2度目にログインしようとすると、プログラムを停止するまで端末が応答しなくなります。これは、スケジューラがリアルタイムプロセスと同じコア上で他のプロセスを実行しようとしているようなものです。

  1. 私には何が欠けていますか?
  2. スケジューラはリアルタイムプロセスを実行しているコアで他のプロセスを実行しようとしますか?もしそうなら、これを防ぐ方法はありますか?
  3. 親のスケジューリングポリシーをsched_setscheduler()に設定すると、以前に作成された子の動作が変更されますか?

ありがとうございます。

答えて

5

sched_setschedulerは、プロセスのスケジューラをスレッドではなく設定します。参照:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html

を使用すると、スレッドのスケジューラを設定したい場合、あなたはそれを作成する前に、新しいスレッドの属性オブジェクトにpthread_attr_setschedpolicypthread_attr_setschedparam機能を使用する必要があります。

ため

+0

おかげで...私はLinuxは、これらの要件を称える上でどのように準拠わからないんだけど、あなたは少なくとも、必要に応じてそれを調整した後、あなたのコードが仕様に正しいことを確認することによって開始する必要があります応答。 sched_setscheduler()は、スレッドではなく、プロセスのスケジューリングポリシーを設定していることをドキュメントが正しく示しています。しかし、この返信を読んだ後にpsを使っていくつかのテストを実行し、ポリシーがスレッドに対して正しく設定されています。これは私にいくつかのさらなるテストを実行するよう促しました。最も顕著な問題の1つは、プログラムの実行中にログインに時間がかかることです。新しいログイン用のbashセッションは、最初はリアルタイムプロセスを実行するCPUに設定されているようです。 – digby280

関連する問題