理解できません (私が思うに) は、Linux でのプロセス/スレッド スケジューリングに関する特殊な状況です。[環境: Ubuntu 12.10、カーネル バージョン 3.5.0-...]
「テスト」アプリケーション (sched_pthread と呼びます) には、合計 3 つのスレッド (「メイン」 + 他の 2 つ) があります。main() は 2 つの新しいスレッドを生成します。
スレッド 1 [main()]: SCHED_NORMAL (または SCHED_OTHER) として実行されます。2 つのスレッド (以下のスレッド 2 とスレッド 3) を作成します。
それらは、メインのスケジューリング ポリシーと優先度を自動的に継承します。文字「m」をループで端末に出力します。終了します。
スレッド 2 [t2]: 2 秒間スリープします。そのスケジューリング ポリシーを SCHED_FIFO に変更し、そのリアルタイム優先度を
コマンド ラインで渡された値に設定します。文字「2」をループで端末に出力します。終了します。
スレッド 3 [t3]: スケジューリング ポリシーを SCHED_FIFO に変更し、リアルタイム優先度をコマンド ラインで渡された値に 10 を加えた値に設定します。4 秒間スリープします。文字「3」をループで端末に出力します。終了します。
ルートとして実行します。スケジューリング ポリシーに従って、最初に main() print 'm' が約 2 秒間表示され、次に t2 によってプリエンプトされ (2 秒後に起動するため)、その後約 2 秒間端末に「2」が表示されるはずです。どの t3 がウェイクアップするか (4 秒間スリープしていた); これで、他のすべての人を先取りし、ディスプレイに「3」を出力する必要があります。それが終了した後、p2 が終了するまで '2' が表示され、次に main() が終了するまで 'm' が表示されます。
大丈夫です、これはうまくいきます:コンソールモード(Xサーバーなし)でテストすると。もちろん、次のように実行するように注意します。
sudo taskset 02 ./sched_pthrd 8
そのため、実際には 1 つのプロセッサ コアのみで実行されます。
グラフィカル モード (X を使用) で同じことを実行すると、main() による最初の 'm' の後、画面に何も表示されない長い一時停止 (数秒) があります。すると突然、2 と 3 と m が画面に叩きつけられます。 これは説明できます。X サーバー (Xorg) が SCHED_FIFO スレッドによってプリエンプトされたため、画面にピクセルを「ペイント」できませんでした。
しかし - ここで最後に質問があります - : Xorg プロセスが他のコアにスケジュール/移行されなかったのはなぜですか? taskset は、Xorg の CPU アフィニティ マスクが 'f' (1111b) であることを確認します (私のラップトップには 4 つのコアがあります)。
何か案は??
ソース コードは次のとおり です : https://dl.dropboxusercontent.com/u/9301413/code_shared/so_sched_pthrd.c
ティア!-カイワン。