3

スレッドのスリープ解決がどのように機能するか、および単純に sleep() の解決を超えてそれが何に結び付けられているかについて詳しく知りたいです。

オペレーティングシステムによって定義されており、Windowsでは通常15msであることを知っています。最近見回してこれを確認することはできませんでしたが、この15ミリ秒がOSによってループされ、すべてのスレッドに対して「グローバル」であることを漠然と思い出しました。つまり、スレッドがスリープできる最小時間は15ミリ秒ではなく、 sleep(1) の最大値。そうですか?すべてのオペレーティング システムで同じですか (期間を超えて)?

これが問題になる状況は考えられませんが、このスリープ サイクルのアクション ポイントでスレッドの偽のウェイクアップが常に発生するのでしょうか、それともいつでも発生する可能性がありますか?

同期されたブロックで、待機中のスレッドは効果的にスリープ (1) し、各サイクルでロックをチェックしていますか? または、ブロックを終了するスレッドが待機中のスレッドを即座にウェイクアップしますか? これはすべてのオペレーティング システムで同じですか?

スレッドがwait()の後にnotify()された場合、ロックを待っている間、上記と同じ方法で処理されますか?それとも別の方法で処理されますか?

パフォーマンスの観点から、15 ミリ秒のループが関連する他の時間はありますか?

4

2 に答える 2

5

マルチスレッド カーネルについて少し調べる必要があります。

「スレッドのスプリアス ウェイクアップは、このスリープ サイクルのアクション ポイントで常に発生しますか?それとも、いつでも発生する可能性がありますか?」

sleep() による偽のウェイクアップや、Windows でのカーネル同期オブジェクトの待機はありません。まったくありません。このような傾向はカーネル内で設計されており、ユーザー スレッドには伝播しません。

スレッドがミューテックスやセマフォ ロックなどの同期オブジェクトでスリープまたは待機している場合、スレッドはまったく実行されません。これは、カーネル内のキューにあるデッド 'スレッド記述子オブジェクト' であり、したがってすべてのスレッド関連のもの、データスタックなどのスペース。スリープの場合、TDO はすべてのタイムアウト スレッドの「デルタ キュー」にあり、ウェイクアップ時間順に並べられ、OS はこのキューの先頭にある項目を 15 ミリ秒ごとにチェックします。時限ロック待機の場合、TDO は 2 つのキュー (タイムアウト キューとロックが所有するキュー) にあります。TDO がタイマー キューの先頭に到達し、間隔が満了したときに準備完了になるか、別のスレッドがロックを解放してスレッドを準備完了にします。先に到達した方が勝ち、TDO は他のキューから削除されます。次に、新しく準備ができたスレッドが一連の準備ができたスレッドに参加し、

したがって、Windows の「15ms」はすべてのスレッドで「共有」されます。Windows はデスクトップ OS であり、15 ミリ秒は直接的な人間の感覚を超えているため、すべての家庭用スレッドの 99.9% は気にしません。大きなタイムアウトが必要なだけで、I/O を待機しており、スレッド間通信ロックまたはいくつかの組み合わせを待機しているためです。その。

「パフォーマンスの観点から、15 ミリ秒のループが関連する場合は他にありますか?」

あまりない。タイマーの再スケジュールには副作用があります。最高優先度の実行可能なスレッドのセットが、それらを実行するために使用できるコアの数よりも多い場合、それらのスレッドのリストがぐるぐる回されます。これは、定期的に過負荷になるマシンにのみ関連し、ほとんどのスレッドはタイマー間隔を使用して、他のブロッキング システム コールをタイムアウトにするだけです。

于 2012-06-19T06:52:32.500 に答える
3

Thread.sleep()実装はOSに依存します。

スリープの粒度は、通常、スレッド スケジューラの割り込み期間によって制限されます。Linux では、最近のカーネル (2.6.8 以降) では、この割り込み期間は通常 1 ミリ秒です。Windows では、スケジューラーの割り込み周期は通常約 10 ミリ秒または 15 ミリ秒 (プロセッサーによって決定されると思われます) ですが、ソフトウェアでより長い周期を要求することができ、Hotspot JVM は必要と判断したときに要求します。

于 2012-06-19T05:36:29.997 に答える