17

ラップトップを閉じるか、Appleメニューから[スリープ]を選択したためにMac OS Xがスリープ状態になると、実行中のプロセスをどのように一時停止しますか?

ウィンドウ化されていないプロセスは、実行の任意のポイントで単に中断されていると思います。これはCocoaアプリにも当てはまりますか、それともOSは、制御が実行ループディスパッチャーに戻り、「既知の」場所でスリープ状態になるまで待機しますか?最近のOSはそれを実行しますか、それとも通常、アプリが何をしていてもアプリを一時停止するだけで十分安全ですか?

私は興味があります。なぜなら、いつでも睡眠をとることができるということは、アプリの観点からすると、システム時計が突然大幅に前進する可能性があるからです。これは、コーディング中に通常は考慮しない可能性です。

4

5 に答える 5

22

CPU が現在アプリのコードを実際に実行している場合、アプリはその瞬間の正確な場所で中断されます。アプリはタスク スケジューラによって常に実行時間を取得します。タスク スケジューラは、どのアプリが CPU 時間を取得するか、どのコアで、どのくらいの時間を取得するかを決定します。システムが本当にスリープ状態になると、スケジューラは単にアプリに時間を与えなくなるため、その時点でどこにいても実行を停止します。これは、ほぼすべての場所で発生する可能性があります。ただし、カーネルはクリーンな状態である必要があります。つまり、カーネルへの呼び出しを行ったばかりで (多くの libC 関数がそうします)、この呼び出しが安全なポイント (たとえば、スリープ、条件が真になるのを待っているなど) ではない場合、または重要なカーネル ロックを保持している可能性がある場合 (たとえば、 funnels)、カーネルは、この呼び出しがユーザー空間に戻るか、実行がそのような安全なポイントに達するまでスリープを一時停止してから、タスク スケジューラからアプリを最終的にキャンセルする場合があります。

カーネル ポートを開き、スリープ/ウェイクアップ イベントに登録できます。その場合、システムがスリープ状態になりたいときに、アプリはイベントを受け取ります。いくつかの可能性があります。1つは、システムが進歩するように、それに応答することです。もう 1 つは、睡眠を中断することです。ただし、Apple によると、特定のイベントは最大 30 秒間中断することができ、その後は、アプリが好むと好まざるとにかかわらず、システムはそのまま続行されます。最後に、キャンセルできます。ただし、すべてのイベントをキャンセルできるわけではありません。システムがスリープ状態になるとすでに決定している場合、これを最大 30 秒間中断するか、一度に許可することしかできません。キャンセルすることはできません。ただし、システムがアプリに尋ねるイベントを聞くこともできます。今すぐスリープしても問題ないかどうかを尋ね、そこで「いいえ」と答えると、スリープがキャンセルされます。

「スリープしても大丈夫ですか」と「スリープに入る予定です」の違いは次のとおりです。最初のメッセージは、省電力設定が適用されている場合、つまり、ユーザーがマウスを動かしたり何も入力したりしていない場合に送信されます。そこで設定された時間。その場合、システムは、スリープが問題ないかどうかを尋ねるだけです。Apple の DVD プレーヤーのようなアプリは「いいえ」と答えます。ユーザーはおそらく DVD を視聴しているため、コンピューターと対話せず、それでもスリープ状態になる理由はないからです。OTOH、ユーザーが Mac Book を閉じると、アプリは要求されず、システムは確実にスリープ状態になり、アプリに通知するだけで、最大 30 秒で応答します。

ウェイクアップ イベントもキャッチするのが非常に興味深い場合があります。たとえば、システムが起動した場合、開いているファイルにアクセスできなくなったり (外部ドライブが取り外された)、ネットワーク ソケットが機能しなくなったり (ネットワークが変更された) する可能性があります。そのため、特定のアプリ パーツを使用して多かれ少なかれ予想されるエラーが発生する前に、それらを再初期化することができます。

これらのイベントのキャッチに関する Apple のページ。

于 2008-09-23T18:24:36.677 に答える
3

それはあなたのアプリに依存します。
外部システムと対話している場合(ネットワーキングやusb / firewireを介した何かの実行など)、影響を受ける可能性があります。OSXで実行されているアプリケーションは、限られた時間(最大10ms)で実行され、その後、CPUで実行されるようにプロセスキューから新しいプロセスをスケジュールするカーネルによって中断されます。これは、CPU上で常に実行されていると「考える」アプリケーションにとっては透過的です。したがって、スリープへの移行は、先にジャンプする時間を除いて、違いはありません。
スリープモードへの移行があったことを認識する必要がある場合は、状態の変化に関する通知を受信する方法について詳しく説明しているこのテクニカルノートを参照してください:スリープおよびウェイク通知の登録と登録解除

于 2008-09-23T11:25:48.930 に答える
1

どこにいてもすべてのアプリを一時停止するだけだと思います。

とにかく、これは常に発生することを忘れないでください。コンテキストの切り替えにより、アプリケーションは常に一時停止および再開されます。したがって、実際には、時計はアプリ内の2つの命令の間をジャンプする可能性がありますが、通常は目立った/重要な方法ではありません。

OSがアプリがメインループに戻るのを待っていると、アプリケーションによってスリープがハングする状況が発生する可能性があります。彼らが多くの仕事をしていて、実行ループディスパッチャーに戻らない場合、彼らはマシンがスリープ状態になるのを防ぎます。それはあまり良くないでしょう。:)

于 2008-09-22T19:30:21.193 に答える
0

また、時間を設定すると、実行中のプログラムに飛躍するように見えます。特別なこともありません。

于 2008-09-22T19:34:28.780 に答える
0

このウィキペディアの記事をご覧ください。ネットワーク接続などがタイムアウトする可能性があり、その結果、これらのサービスが中断される可能性があるという Cavver の記述は正しいです。

于 2008-09-23T13:37:16.510 に答える