2017-03-21 12 views
1

私の質問は一般的なスレッドに関するものです(例:Javaの場合)。スレッドに与えられた最小時間

問題は、スレッドが(実行可能状態)にあるとき、つまり実行中であり、命令(たとえば、メソッドaddOneToX(int x)を呼び出すことによって)を実行しているときに、スレッドが終了または停止できるかどうかです。その命令を実行する前にその命令を実行した後である。言い換えれば、高水準言語の命令の大部分は、機械固有の言語にデコードされ、CPU内のいくつかのマシンサイクル(クロックサイクル)に分解されます。だから私はそれに応じて、それは明らかです:

1>スレッドがRunnable状態になるために与えられる最小時間は?

2>スレッドはどのようにして状態を保存しますか? (つまり、Runnable状態を終了し、後で戻って停止した場所から継続する場合)

+0

1)最小値はありません。 2)ここでカバーするには複雑すぎる方法。お使いの言語(Java)が機械命令から非常に遠く離れている場合、OSがどのようにしてCPUのレジスタを保存し復元するかは重要ですか? – Andreas

+3

オペレーティングシステム、スケジューリング、タイムスライス、コンテキスト切り替えなどについては、良い本を読む必要があります。 StackOverflowの場合、これは広すぎます。 – RealSkeptic

+0

関連:http://stackoverflow.com/questions/16401294/how-to-know-linux-scheduler-time-slice –

答えて

2

最低保証時間はありません。

スケジューラは、タイムスライスを決定します。通常、何百分の1ミリ秒から約100ミリ秒まで何かを期待することができます。しかし、しばしばこの値は動的になります。また、スレッドはI/Oとなる1つの命令だけを実行するような極端な状態に遭遇することさえあり、スレッドがブロックしてCPUから押し出される。

高水準言語命令は、最終的に(おそらく)複数のCPU命令に変換されます。 CPU命令は、高レベルの言語コマンドの途中であっても、2つの命令の間のどこかでプログラムが中断されることがあることを除いて、中断することなく実行される原子部分です。スレッドの同期に使用できる特定のCPU命令(アトミックget-and-setやget-and-increaseなど)があることに注意してください。

スレッドの状態を格納するという基本的な考え方は次のとおりです。レジスタをRAMに格納し、ポインタを現在の命令に格納します。

+0

Thx、非常に良い答え。 –

1

スレッドがRunnable状態になるのに最低限必要な時間は?

最も実用的なJavaの実装はネイティブスレッドを使用します。つまり、彼らは、オペレーティング・システムがスケジューリングスレッドの詳細の世話をすることができます。最新のオペレーティングシステムでは、さまざまなスレッドスケジューリングアルゴリズムを選択できます。ほとんどのアルゴリズムでは、多くの設定可能なパラメータが用意されています。あなたの質問に対する答えは一つもありません。

ほぼ確実に、1秒未満です。おそらく100ミリ秒未満です。それ以外は言いにくいです。

スレッドはどのようにして後でその状態になるのですか?

スレッドの状態は、(ほとんどのプログラミング言語で、Javaが含まれている)そのコールスタックで構成され、それがCPUレジスタです。 CPUレジスタには、コールスタックの先頭を指すもの、現在の命令を指すもの、通常はその他のものが含まれます。

スレッドを切り替えようとすると、OSはプロセッサを中断し(割り込みは基本的に即時呼び出しを強制します)、割り込みハンドラルーチンは現在のスレッド用に予約されているメモリ位置にすべてのCPUレジスタを保存します。次に、他のスレッドのレジスタを復元し、基本的に他のスレッドが中断された場所に "戻る"。

関連する問題