2009-11-12 3 views
17

私はあなたがプロセッサの速度に基づくことができる私は...OSレベルでスリープはどのように実装されていますか?

  1. を推測しています...

    sleep(time in ms)は、Cライブラリにまたは基本的にOSレベルで実装されているかだけで興味を持っています(スリープ時間が正確かどうか分かりません)

  2. プロセッサに特別なレジスタがあり、値を書き、プロセッサが指定された時間だけ停止します(これは非常に効率的ですプロセッサは他のプログラムでも実行できません)。

手がかりはありますか?おそらくCライブラリのソースコードは説明できますか?私は "C"がそれをどのように実装しているかについてあまり気にしていません...私は、単に "sleep()"関数がどのように実装されているのか全般に疑問を抱いています。

答えて

14

Sleep()は、OSレベルで実装されています。プロセッサは、タスク/スレッド/プロセスがスリープしているときには回転しません。その特定のスレッドは、スレッドが実行準備が整ったキューに置かれる時点で期限が切れるまで、保留中のキューに置かれます(スレッドは実行準備ができていません)。

その間、実行準備が整っている他のスレッドが実行されます。ハードウェア割り込みが発生するまで

だけ何のスレッドの実行準備ができていない場合OSは、一般的にシャットダウンするように指示を出す(またはとにかく低電力状態に置か)アイドルスレッド、プロセッサに入ります。

非常に単純なシステム(最も単純な組み込みシステムのような)の場合にのみ、Sleep()は実際にはビジーな待機ループとして実装される可能性があります。

"Modern Operating Systems" by Tanenbaumなどのオペレーティングシステムの教科書は、これを非常に詳細にカバーしています。かなり古いもの(古いものでも安価なものでも)です。

+0

ahhh ..タイムアウト後に起きることは保証されていません。そのスケジューラまで、または基本的にシステムの他のタスク...? – FatDaemon

+3

タイムアウト後どれくらい時間が経過すると、タスクは再びスケジューラに依存して実行されます。システムは、タイムアウトが切れるとすぐに実行されることを保証するかもしれませんが、ほとんどの場合、実行準備ができているキューの適切な場所に配置されます(スレッドの優先度がそれ以外の場合)、次回のスケジュール時に実行されます。 –

+0

多くのエンベデッド・プロセッサーは専用のスリープ命令を持っています – mocj

2

あなたの質問に対する答えは、完全にオペレーティングシステムと実装に依存します。

簡単な考え方:sleep()に電話すると、OSはウェイクアップ時間を計算し、プロセスを優先キューのどこかに置く。それはちょうど十分なの時間がそれがキューからポップするために渡されるまで実行時間を得るためにプロセスをスケジュールしません。ループが、そうでない場合は、システムが何かをすることはできませんが

1

あなたはいずれかの操作を実行していない - ないマウス、キーボード、ネットワークへの対応など、

通常ほとんどのオペレーティングシステムは何をすべきかあなたが追加され遅延を要求したタスクが再開されたときのタイムスタンプを取得するための現在のタイムスタンプへの遅延(優先度の高いタスクがその時点で実行されていないと仮定して)、[wakeupTimestamp、task pointer]を昇順でソートされたリストに追加しますタイムスタンプでその後、OSはコンテキストスイッチを実行し、次に利用可能なタスクを実行する。定期的に、システムは眠いリストの最も早いタイムスタンプを現在のタイムスタンプと比較し、締め切り日が過ぎたらスリープタスクを「準備完了」タスクキューに移動させる。一般的なオペレーティングシステムでは

+0

第2部ではインテリジェントなことを言うが、最初の部分ではどうしてそんなに愚かなのだろうか? whileループはプリエンプト可能であり、マウスイベントを何ら妨げません。 –

2

、睡眠は、指定された時間が経過するまで待つプロセスを設定し、実行するためのいくつかの他のプロセスを行くと見つけカーネル、に呼び出します。より良いことがなければ、それは「アイドルプロセス」を実行します。時間が経過すると、スケジューラはスリーププロセスが正常に実行されていることに気づき、再度スケジュールを設定します。

+0

IdleプロセスはHLT命令を実行するプロセスであることに注意してください。最新のCPUでは非常に複雑になり、スリープ時間に応じてCNモードに移行します。 (C0目覚め、C1短時間睡眠、C7長時間睡眠) –

1

スリープは、渡された時間値に対してタスク/スレッドをブロックします。あなたの仕事は、その期間、または面白い何かが起こるまで(信号のように)、どちらか早いほうになるまで、実行不能になります。

sleep()はselect()を呼び出し、待機するディスクリプタとスリープ期間と等しいタイムアウト値を渡すことは珍しいことではありません。

システムは、時間が経過した後にタイマーを設定し、そのタイマーの有効期限が切れたときに通知されるセマフォを待つように設定することで、これを実装できます。したがって、そのセマフォでブロックされます。

関連する問題