読者です 読者をやめる 読者になる 読者になる

Out Of Memory Killerに似てるけど、もう少しやさしいiPhoneOSの空きメモリー制御

iPhone技術情報 iOS4 雑感

みなさんは、Linuxカーネルに備わっているOOM Killer(Out of Memory Killer)というものをご存知でしょうか?

OOM Killer(Out of Memory Killer)は,システムが実メモリーと仮想メモリー空間(スワップ領域)を使い切り,必要なメモリー領域を新たに確保できない場合に,プロセスを強制終了させて空きメモリーを確保する,Linuxカーネルの仕組みです。OOM Killerは,空きメモリーが確保できないことによりシステム自体が停止するという最悪の事態を避けるために用意されています。

Linuxキーワード - OOM Killer:ITpro

iOS4で、本格的なマルチタスク環境がサポートされるようになりましたが、3.x以前でも、Safariやメール、iPodなどの、標準アプリケーションは、バックグラウンド化されていたのは周知の通りです。
その頃から、iPhoneOSは、空きメモリが枯渇して来ると、バックグラウンドプロセスの中で、そのときに差し支えなさそうなものを選んで終了させるようなことが起きていたと思います。そのあたりの制御は、OOM Killerに似ていますね。

ただ、iPhoneOSは、有無を言わせずにいきなり強制終了するのではなく、いくつか段階を踏むことで、そのプロセスが必要な処理を行うためのチャンスをくれます。その代表的なものが、Memory warningであり、例えば、Safariの場合は、確保しておくことが必須でないメモリ領域を解放します。iOS4からは、一般のアプリもバックグラウンド化することができるようになったので、このMemory warningへの対処は、以前よりも重要になってきますね。

あと、ちょっと試してみたところでは、ホームボタンダブルクリックで表示される、「最近使ったアプリケーション」からアイコンを削除される場合も、単なる強制終了ではなく、-[UIApplicationDelegate applicationWillTerminate:]メソッドが呼ばれるようなので、ここでも必要な処理を行うチャンスは与えられているようです。
[7/9 追記] すみません。この部分は、誤った記述でした。さらに試してみたところ、-[UIApplicationDelegate applicationWillTerminate:]メソッドは、アプリがバックグラウンドに移ってもタスクを続行している場合は呼ばれましたが、suspend中は、killされてしまうという結果になりました。このあたり、まだまだ調査が必要ですね。

ただし、急激にメモリを獲得しようとするアプリが動いているときなど、本当に緊急を要する状況になった場合は、iOS4もOOM Killerのように、強制終了をするようなので、バックグラウンド化される前に、できるだけ安全な状態にしておくことは重要だと思います。当然のことながら、強制終了の場合は、それをされる側のアプリは、何もすることはできないので。。

マルチタスクに対応するアプリは、こういったことを、いろいろ考慮しなければならないので、もしもバックグラウンド化されることが必要ないのなら、非対応にしておくのが無難かもしれませんね。

このあたりの話題は、以下のところでも参考になる話題がまとめられていますので、ぜひ、目を通してみてください。
iOS4でマルチタスキングを実現するときの注意点まとめ - Togetterまとめ

私もまだ、調べ始めたばかりなので、いろいろ勉強しながら、マルチタスク対応アプリというものを考えて行きたいと思います。