スレッドとロックに関する質問


7

私は現在、Fuss、Futexes、Furwocks:LinuxのFast Userland Lockingを読んでいてこの引用に出くわしました:

公平なロック方式では、ロックは要求された順序で許可されます。これは、コンテキストスイッチの数が増えるため、スループットに悪影響を与える可能性があります。同時に、それはいわゆるコンボイ問題を引き起こす可能性があります。ロックは到着順に付与されるため、すべてが最も遅いプロセスの速度で進行し、待機中のすべてのプロセスの速度が低下します。コンボイの問題に対する一般的な解決策は、解放時にロックを使用可能としてマークし、すべての待機中のプロセスをウェイクさせて、ロックを再競合させることです。これはランダムフェアネスと呼ばれます。しかし、これは雷鳴の群れの問題にもつながります。これにもかかわらず、ウェイクする最初のタスクがプリエンプトまたはスケジュールされる前にロックを解放し、2番目の群れのメンバーがロックを取得できるようにすれば、ユニプロセッサーシステムでうまく機能します。

この引用についていくつか質問があります。

第1に、さまざまなタスクが異なるタイミングでプロセスを待機キューに入れるため、公平なロックスキームはコンテキストスイッチの数を増やしますか。

次に、到着順にロックを許可すると、プロセスは最も遅いプロセスの速度でどのように進行しますか?これは、最も遅いプロセスが他のプロセスの前にロックを許可されている場合にのみ該当しませんか?同様に、ロックに対してランダムに競合するプロセスがあると、どのようにしてコンボイ問題が解決されますか?

最後に、マルチプロセッサシステムと比較して、ユニプロセッサシステムではランダムな公平性がどのように優れているか理解できません。たとえば、どちらの場合でも、待機中のプロセッサはすべて起こされ、1つはロックを取得し、他のプロセッサは再びスリープ状態にする必要があります。では、これはどのようにユニプロセッサシステムでうまく機能するのでしょうか。


1
できれば1つの質問に集中してください。複数の質問はそれぞれ独自の投稿に含める必要があります。回答の1つが次のフレーズに役立つ場合は、時間の遅れが生じる可能性があります。
ラファエル

回答:


4

最初に最後の質問に答えましょう。この論文は、マルチコアプロセッサの方がはるかに高価だった2002年に書かれたと指摘しています。著者は、シングルコアの場合の最適化に主に関心を持っていたと思います。

...ランダムな公平性...は、マルチプロセッサシステムと比較して、ユニプロセッサシステムの方が優れています。

ユニプロセッサでは、一度に1つのプロセスしかスケジュールできません。つまり、誰もが「目覚め」ますが、それは単に待機状態から準備完了状態に移行することを意味します。次に、スケジューラーが呼び出され、実行する準備ができているプロセスの1つを選択し、そのプロセスを一定期間実行させます。

新しく実行中のプロセスが最初に行うことは、ロックを取得することです。次に、いくつかの処理を行い、(運が悪ければ)ロックを解放します。この場合、次にカーネルスケジューラが制御を取得したときに、別の「準備完了」プロセスが選択され、実行が開始されます。最初のプロセスがロックを解放した場合、2番目のプロセスがロックを取得し、以下同様に続きます。

一方、マルチプロセッサでは、すべてのプロセスが「起こされる」可能性があり、スケジューラはそれらのいくつか/多く/すべてを異なるプロセッサで同時に実行し始めます。プロセスの1つはロックを取得しますが、他のすべてのプロセスはロックを取得しようとし、すぐに失敗して、待機キューでスリープ状態に戻ります。つまり、1つを除くすべてのプロセッサで、いくつかのカーネルコールといくつかのコンテキストスイッチを無駄にしただけで、何もする必要がないことを一連のプロセスに伝えることができました。

さまざまなタスクがプロセスをさまざまなタイミングで待機キューに入れるため、公平なロックスキームはコンテキストスイッチの数を増加させますか?

彼らが念頭に置いているのは、複数のプロセス(1つのプロセッサ上)があり、各プロセスが同じロックを短時間繰り返し取得する場合だと思います。不公平な場合、最初のプロセスはしばらく実行され、コンテキストの切り替えを行わずに何度もロックを取得および解放できます。次に、2番目のプロセスがしばらく実行され、何度もロックを取得して解放します。

「公正」な場合、最初のプロセスがロック/解放し、次に2回目にロックしようとするとスリープ状態になり、カーネルはコンテキストスイッチを実行して他のプロセスを起動する必要があります。プロセスは、「ウェイクアップ、ロック、ロック解除、少しの間の作業、ロックの試行、スリープへの移行」を行ったり来たりします。

到着順にロックを許可すると、プロセスは最も遅いプロセスの速度でどのように進行しますか?これは、最も遅いプロセスが他のプロセスの前にロックを許可されている場合にのみ該当しませんか?同様に、ロックに対してランダムに競合するプロセスがあると、どのようにしてコンボイ問題が解決されますか?

ユニプロセッサーでは、最短ジョブ優先(不公平)の方が平均待機時間がラウンドロビン(公平)よりも短いと彼らは観察していると思います。しかし、ラウンドロビンと比較してランダムが平均待機時間をどのように減少させるかは理解できません。


詳しい回答ありがとうございます。これにより、状況がより明確になります。
パブリックディスプレイ名
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.