質問

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

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

私が興味を持ったのは、いつでもスリープ状態にできるようにするということは、アプリの観点からすると、システム クロックが突然大幅に早まる可能性があることを意味するからです。これは、コーディング中には通常考慮しない可能性です。

役に立ちましたか?

解決

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

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

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

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

これらのイベントの捕捉に関する Apple のページ。

他のヒント

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

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

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

OS がアプリがメイン ループに戻るのを待った場合、アプリケーションがスリープをハングさせる状況に遭遇する可能性があります。多くの作業を行っていて実行ループ ディスパッチャに戻らない場合、マシンがスリープ状態になるのを妨げることになります。それはあまり良くありません。:)

また、時間を設定すると、実行中のプログラムにジャンプして表示されるようになります。特に何もありません。

このウィキペディアをチェックしてください 記事. 。ネットワーク接続などがタイムアウトになり、サービスが中断される可能性があるという Cavver の指摘は正しいです。

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