#はじめに
Apple Documentの「メモリ効率の向上に 関するガイドライン」を少しづつまとめて見ようと思いこの記事を書きました。
認識間違いなどありましたら、教えていただけると嬉しいです。
#序章 仮想メモリについて
仮想メモリはOSXとiOSとも、4GBあります。
仮想メモリは、物理的なRAMの容量に制限されることなく、オペレーティングシステムが稼働するための仕組みで、仮想アドレス空間を各プロセスに割り当てて、割り当てられた空間を一定の大きさ(4KB)に分割して管理します。この分割された空間をページと言います。
プロセッサ(CPU?)とメモリ管理ユニット(システム? 以降MMU)はページ表を管理し、プログラムの仮想アドレス空間上のページをメインメモリのアドレスに対応づけます。
そして、僕たちが買いたコードがメモリ上にあるアドレスにアクセスしようとすると、MMUはページ表を参照して、仮想アドレスを物理アドレスに変換します。
#iOSのメモリ管理について
iOSはメモリが枯渇しそうになると、ディスク上に存在し書き換えることのないデータ(コードページなど)は、単純にメモリから消去し、必要になった時点で再び読み込むようになっています。
それでもメモリ領域が足りない場合は、システムがアプリケーションにその旨を通知し、メモリを解放して空きを確保するよう要求します。applicationDidReceiveMemoryWarning
とかね
この要求に応じられなかった場合、アプリ自体を停止してしまいます。
おまけ
OSXの場合はメモリが枯渇しそうになると、ハードディスクに使用しないデータを保持させます。そのためのハードディスク上の領域をバッキングストアと呼びます。OSXにしかこの機能は備わっていません。
#アドレスがメインメモリになかった場合
アクセスしようとしたアドレスがメインメモリに無く、ハードディスクに存在する場合は、ページフォールトという割り込み処理が発生し、ページングと呼ばれる処理が行われます。
ページングは仮想メモリシステムは専用のハンドラを起動し、実行中のコードを停止して、メインメモリの空きページを見つけた後に、必要なデータを含むページをハードディスクから読み込み、ページ表を更新してから処理を再開します。
注意
頻繁にページフォールトが発生すると、ページの読み書きも頻繁に起きるので、実行中のコードよりも時間がかかります。これをディスクラッシングと呼びます。
#メモリ領域が無い場合のiOSの挙動
もしメインメモリ上に空きページがない場合は他の使用しないページを解放して、新しいページ用の空間を確保しないといけません。
iOSにはバッキングストアの機能がないので、メインメモリから使わないメモリを退避する(これをページアウトと呼びます。)ことができません。
しかし読み込み専用のページは、必要に応じてハードディスクから物理メモリにページを移動する(これをページインと呼びます)ことはできます。