5

RR スケジューリング ポリシーでは、優先度の低いスレッドがミューテックスをロックし、別の優先度の高いスレッドが待機しているためにスケジューラによって削除されるとどうなりますか?

優先度の低いスレッドが保持しているロックも解放しますか?

たとえば、RR スケジューリング ポリシーで優先度 10、20、および 30 のプロセスで実行されている 3 つのスレッドを考えてみます。

現在、特定の時点で、優先度の低いスレッド 1 がミューテックスをロックし、優先度の高いスレッドがポップインし、スレッド 1 が保持するミューテックスを待機している間、依然として実行手段を実行しています。スレッド 2 は、ロックされた同じミューテックスも必要とする状態になります。スレッド 1 によって。

私の知る限り、スケジューリングアルゴリズムに従って、ミューテックス、セマフォなどをスリープまたは待機しているスレッドは削除され、他のスレッドは優先度が低くても実行が許可されます。これは正しいです?もしそうなら、上記の例では、最終的に優先度の高いスレッドが優先度の低いスレッドの完了を待ちますが、これは意味がありません。上記のようにすべてのスレッドが設計されている場合、これがシステムの仕組みですか?

または、優先度の高いスレッドが優先度の低いミューテックスに依存しないように、スレッドの優先度を設定する必要がありますか?

また、スケジューリングがプロセスレベルでどのように機能するかを誰かに説明してもらえますか? プロセスの優先度を設定するにはどうすればよいですか?

4

3 に答える 3

5

通常、スケジューリングとロックは、「待機中のスレッドは待機が完了するまでスケジュールされません」以外の点では無関係です。「他のスレッドが自分のデータにアクセスするのを止める」 MUTEX を持つのはかなり馬鹿げていますが、他のスレッドの優先度が現在のスレッドと同じかそれより低い場合にのみ機能します。

「優先度の低いスレッドが、優先度の高いスレッドが「必要とする」ロックを保持する」という現象は、優先度の逆転と呼ばれ、コンピューター理論ではよく知られたシナリオです。

「待機中のスレッドの最高優先度にロックを解放するまで、ロックを保持しているスレッドの優先度を一時的に上げる」(または、現在のスレッドよりも高い場合は最初の待機中のスレッドの優先度、またはその他のバリエーション) いくつかのスキームがあります。そのテーマで)。これは優先度の逆転に対処するために行われますが、他の欠点もあるため、すべての OS/スケジューラーに実装されているわけではありません (結局のところ、待機しているスレッド以外のスレッドにも影響します)。

編集:

ミューテックス (または他の同様のロック) のポイントは、2 つのスレッドが同じリソースに同時にアクセスするのを防ぐことです。たとえば、かなり時間のかかる処理 (複雑な計算、シリアル ポートまたはネットワーク ドライブからのデータのフェッチなど) で 5 つの異なる変数を更新したいが、変数のうち 2 つだけを実行すると、これらは無効な結果になり、明らかにロックを「手放す」ことはできません。

優先度の高いスレッドは、5 つの変数すべてが更新され、優先度の低いロックがロックされるのを待つだけです。

この問題を「修正」するためにアプリケーションが実行できる簡単な回避策はありません。もちろん、必要以上にロックを保持しないでください [そして、時間のかかる処理を外部で実行することにより、上記の問題を実際に修正できる可能性があります。ロックし、ロックをオンにして最後の「5つの変数に保存する」だけを行います。これにより、優先順位の高いスレッドが待機する潜在的な時間が短縮されますが、システムが非常にビジーな場合、問題は実際には解決されません。

このテーマについて書かれた博士論文はすべてありますが、私は「スケジューラーの書き方」の専門家ではありません。自分の車のエンジンがどのように機能するかを知っているのと同じように、スケジューラーがどのように機能するかについてかなりの考えを持っています。スチールとアルミニウムの適切な基本形状と、必要なツール/ワークスペースを提供し、エンジンを構築するように指示されました。うまく機能するとは思えません...スケジューラと同じです-パーツの名前は知っていますが、構築方法ではありません。

于 2013-07-19T13:53:11.470 に答える