質問

興味があるだけ。どのように実際に機能スリープ()仕事(WINDOWS.Hで宣言された)のでしょうか?たぶんだけではなく、その実装が、誰もが。そのことを私は意味 - それはどのように実装されていますか?それはどのようにコードが特定の時間のために「停止」することができますか?どのようにCIN >>およびそれらについても好奇心は、実際に作業 を。彼らは正確に何をしますか?

私が知っている唯一の方法はどのように「ブロック」何かからwhileループである実行を継続し、それはあなたが標準入力から読み込むためのメソッドを呼び出すしているときに何が起こっているかと比較して処理能力の膨大な量を取ることを考慮すると、 (単に標準入力からの読み取りにしばらく(true)を比較する)、私は、彼らが何をすべきかではありません推測してます。

役に立ちましたか?

解決

OSは、すべてのスレッドを維持するために、スケジューラを呼び出したり、それが一緒にうまく動作し、管理のプロセスのメカニズムを使用しています。

毎秒数回、コンピュータのハードウェアクロックは、OSのスケジューラが活性化する原因となるCPUを、中断します。次に、スケジューラは、実行しようとしているすべてのプロセスを見て、もう1つは次のタイムスライスのために実行するようになっていることを決定します。

それが決定するために使用するさまざまな事柄は、各プロセスの状態に依存し、どのくらいの時間、それは前に持っていました。現在のプロセスが進行してから、他のプロセスを防止すること、重くCPUを使用していた場合、それはいくつかの作業を行うことができるようにだから、それは別のプロセスでは、現在のプロセス待ちとスワップを行います。

多くの場合、しかし、ほとんどのプロセスが待機状態にあることを行っています。プロセスは、コンソールからの入力を待機している場合たとえば、OSはプロセスの情報を見て、そのが待っているポートをioのかを確認することができます。それは、彼らが作業するプロセスの任意のデータを持っているかどうかを確認するためにこれらのポートを確認することができます。彼らが行う場合には、再度処理を起動することができますが、データがない場合、そのプロセスは、現在のタイムスライスのためにスキップされます。

sleep()用として、任意のプロセスは、それがしばらく待つしたいOSに通知することができます。スケジューラは、その後も、(プロセスが読み込み可能な状態にデータを持たないストリームから読み込まブロッキングを行うにしようとしたときに何が起こるかもある)、ハードウェア割り込みの前に起動されると、OSはプロセスが何であるかをメモします待っています。睡眠のために、プロセスが消灯するアラームを待っている、またはタイマーが起動されるまで、それだけで、再びそれを再起動たびに生じることがあります。

何かがこのような降伏のプロセスや、私が言及したハードウェアタイマ割り込みとして、実行中のプロセスを先取りするためにそれを引き起こした後、OSが唯一のプロセスを再開しますので、

は、sleep()はOSやハードウェアに依存してどのように正確ではなく、非常に正確であるが、それは通常です一つ以上のミリ秒のオーダーです。

より高い精度が必要な場合、または非常に短い待機し、唯一のオプションは、あなたが言及した多忙なループ構文を使用することです。

他のヒント

を実行どのように処理するか、オペレーティングシステムのスケジュール(プロセスがどのような順序で、実行する資格があり、...)。 Sleep()は、おそらく「私はのX のミリ秒のためのプロセッサを使用させてはいけない」カーネルを伝えるシステムコールを発行します。

要するに、スリープ()は、しばらくの間、プロセス/スレッドを無視するようにOSに指示します。

「CINは」オーバーロードされた演算子のトンを使用しています。 「>>」、通常は右ビットシフトしているが、C ++の右オペランドのほとんどすべてのタイプのために過負荷になっています。別の関数は、コンソールから読み取り、あなたが与えられたいずれの可変型に入力を変換するそれぞれのために設けられています。たとえばます:

std::cin::operator>> (int &rhs);
私はストリームと協力し、しばらくのオーバーロードされていないので、私は戻り値の型や引数の正確な順序を覚えていない -

これは本当のC ++はありません。あなたはCIN >>整数変数を実行したときにそれにもかかわらず、この関数が呼び出されます。

正確な根本的な実装は、オペレーティング・システムによって異なります。

答えは、オペレーティング・システムによって異なりますが、一般的に言って、オペレーティングシステムのいずれかのスケジュール別のスレッド内の他の場所で実行するためのいくつかの他のコード、またはそれは文字通り何の関係も持っていない場合、それはハードウェアイベントが発生するまで待つようにCPUを取得します、これはその後、実行するためにどのようなコードを決めることができ、割り込みハンドラと呼ばれるいくつかのコードにジャンプするCPUを引き起こします。

あなたはマルチスレッドのプログラムでは、スレッド/プロセスをブロックする、より制御された方法を探している場合は、セマフォ、ミューテックス、CriticalSectionsとイベントを見ています。これらは、(一方の構築物を介してCPUをロードせず)プロセスまたはスレッドをブロックするために使用される全ての技術です。

彼らは基本的にブロックされたスレッドが待機している待ち/シグナル・イディオムのオフ動作し、それはそれを伝えるために、別のプロセス信号を再び開始します。これらは、(少なくとも、Windowsの場合)にも)ので、(スリープ状態に類似した機能を提供し、タイムアウトを持つことができます。

低レベルでは、システムが実際にそれらを実行するCPU(複数可)に、すべての実行中のプログラムから命令をディスパッチする「スケジューラ」と呼ばれるルーチンを、持っています。システムは、一定時間のためにそのスレッドまたはプロセスを無視するように、スケジューラを伝える指示を「スリープ」と「はusleep」試合のように呼び出します。

それは読み書きに根本的な呼び出しを隠すために

C ++のストリームについては、「CINは」実際のファイルハンドル(stdinとstdoutが、実際に、このようなハンドルです)あなたがアクセスしている、と「>>」演算子を隠します。そのインターフェース以来実装はOS固有することができますが、概念的にはまだフードの下のprintfおよびscanfのようなものをやっている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top