CPU が現在アプリのコードを実際に実行している場合、アプリはその瞬間の正確な場所で中断されます。アプリはタスク スケジューラによって常に実行時間を取得します。タスク スケジューラは、どのアプリが CPU 時間を取得するか、どのコアで、どのくらいの時間を取得するかを決定します。システムが本当にスリープ状態になると、スケジューラは単にアプリに時間を与えなくなるため、その時点でどこにいても実行を停止します。これは、ほぼすべての場所で発生する可能性があります。ただし、カーネルはクリーンな状態である必要があります。つまり、カーネルへの呼び出しを行ったばかりで (多くの libC 関数がそうします)、この呼び出しが安全なポイント (たとえば、スリープ、条件が真になるのを待っているなど) ではない場合、または重要なカーネル ロックを保持している可能性がある場合 (たとえば、 funnels)、カーネルは、この呼び出しがユーザー空間に戻るか、実行がそのような安全なポイントに達するまでスリープを一時停止してから、タスク スケジューラからアプリを最終的にキャンセルする場合があります。
カーネル ポートを開き、スリープ/ウェイクアップ イベントに登録できます。その場合、システムがスリープ状態になりたいときに、アプリはイベントを受け取ります。いくつかの可能性があります。1つは、システムが進歩するように、それに応答することです。もう 1 つは、睡眠を中断することです。ただし、Apple によると、特定のイベントは最大 30 秒間中断することができ、その後は、アプリが好むと好まざるとにかかわらず、システムはそのまま続行されます。最後に、キャンセルできます。ただし、すべてのイベントをキャンセルできるわけではありません。システムがスリープ状態になるとすでに決定している場合、これを最大 30 秒間中断するか、一度に許可することしかできません。キャンセルすることはできません。ただし、システムがアプリに尋ねるイベントを聞くこともできます。今すぐスリープしても問題ないかどうかを尋ね、そこで「いいえ」と答えると、スリープがキャンセルされます。
「スリープしても大丈夫ですか」と「スリープに入る予定です」の違いは次のとおりです。最初のメッセージは、省電力設定が適用されている場合、つまり、ユーザーがマウスを動かしたり何も入力したりしていない場合に送信されます。そこで設定された時間。その場合、システムは、スリープが問題ないかどうかを尋ねるだけです。Apple の DVD プレーヤーのようなアプリは「いいえ」と答えます。ユーザーはおそらく DVD を視聴しているため、コンピューターと対話せず、それでもスリープ状態になる理由はないからです。OTOH、ユーザーが Mac Book を閉じると、アプリは要求されず、システムは確実にスリープ状態になり、アプリに通知するだけで、最大 30 秒で応答します。
ウェイクアップ イベントもキャッチするのが非常に興味深い場合があります。たとえば、システムが起動した場合、開いているファイルにアクセスできなくなったり (外部ドライブが取り外された)、ネットワーク ソケットが機能しなくなったり (ネットワークが変更された) する可能性があります。そのため、特定のアプリ パーツを使用して多かれ少なかれ予想されるエラーが発生する前に、それらを再初期化することができます。
これらのイベントのキャッチに関する Apple のページ。