何らかの理由でスレッドを中断しないように、Linux のスレッド スケジューラにどのように指示しますか? ユーザーモードでプログラミングしています。単にミューテックスをロックするだけでこれが達成されますか? 特定の関数の実行中に、プロセス内の他のスレッドがスケジュールされないようにしたいと考えています。それらはブロックされ、コンテキストスイッチでCPUサイクルを浪費していました。スレッドのタイムスライスを超えた場合でも、関数を実行するスレッドが中断することなく実行を終了できるようにしたいと考えています。
5 に答える
何らかの理由でスレッドを中断しないように、Linux のスレッド スケジューラにどのように指示しますか?
実際にはできません。そのためにはリアルタイム システムが必要です。Linux で得られる最終的なことは、スケジュール ポリシーを SCHED_FIFO などのリアルタイム スケジューラに設定し、PTHREAD_EXPLICIT_SCHED 属性も設定することです。たとえばここを参照してください。ただし、現在でも、たとえば irq ハンドラやその他のものはスレッドを中断して実行します。
ただし、自分のプロセス内のスレッドが何もできないことだけを気にする場合は、実行中のスレッドが保持するミューテックスでスレッドをブロックするだけで十分です。
難しいのは、他のすべてのスレッドを調整して、スレッドが処理を行う必要があるときにそのミューテックスを取得することです。
アプリの観点から「正しい」ことを行うスケジューラに依存しないように、sw を設計する必要があります。スケジューラは複雑です。それはそれが最善だと思うことをします。
コンテキスト スイッチは安価です。あなたは言う
コンテキストスイッチでCPUサイクルを無駄にします。
しかし、そのように見てはいけません。ミューテックスとブロック/待機プロセスのマルチスレッド機構を使用します。機械はあなたが使用するためにそこにあります...
できません。スレッドがリクエストを決して解放せず、他のスレッドを枯渇させないようにすることができれば、どうすればよいでしょうか。
できる最善の方法は、スレッドの優先度を設定して、スケジューラが優先度の低いスレッドより優先するようにすることです。
競合するスレッドを単純にブロックさせないのはなぜでしょうか。そうすると、スケジューラーは、生きているスレッド以外にスケジュールするものが何もなくなりますか? スケジューラを推測して設計を複雑にするのはなぜですか?
Linux でのリアルタイム スケジューリングを調べてください。私はそれを行ったことはありませんが、実際にこれが必要な場合、これはユーザー アプリケーション コードで取得できる限り近いものです。
あなたが怖がっているように見えることは、実際にはそれほど大したことではありません. カーネルが実際の割り込みや優先度の高いタスクを実行したい場合にプログラムに割り込むのを止めることはできませんが、通常のスケジューリングでは、カーネルは独自に計算された優先度値を使用し、心配していることのほとんどを処理します。スレッド A がリソース X を排他的に保持しており (X はロックである可能性があります)、スレッド B がリソース X が使用可能になるのを待っている場合、A の実効優先度は少なくとも B の優先度と同じになります。また、プロセスが大量の CPU を使用している場合や、優先度を計算するために多くの時間をスリープ状態に費やしている場合も考慮されます。もちろん、素敵な価値もそこにあります。