コンピュータの動作にCPUと並んで不可欠なのがメモリーです。プログラムを実行するには、プログラムがメモリー上にロードされている必要があります。また、計算対象のデータ、入出力するデータもメモリーに置かれます。
メモリー上のどの領域に、いつ、どのデータを載せるのかによって、プログラムの処理の効率が変わります。これを制御するのが、OSが持つメモリー管理の機能です。メモリー管理は、タスク起動時のプログラムのロード、実行中のプログラムによる動的なメモリー確保だけでなく、ファイルやネットワークなどのキャッシュ、バッファの管理でも使用されます。
コンピュータのメモリーには、位置を特定するアドレスがついています。このアドレスをそのまま使うと、複数のプログラムが同じアドレスを使ってしまわないように、どのプログラムがどのアドレスを使うか事前に決めなければならなくなります。しかしカーネルのメモリー管理機能があるので、その必要はありません。カーネルは物理的なアドレスと仮想的なアドレスの対応付けを管理することで、すべてのプログラムが他のプログラムを意識しないでメモリーを使えるようにします。
カーネルは、メモリーの用途別にアクセス保護を設定することで、バグや悪意による不正なメモリーアクセスからプログラムやシステム全体を保護します。不正なメモリーアクセスがあると、カーネルはそのことを示すメッセージやイベントを発生させ、プログラムを強制的に終了させます。
ライブラリや命令が格納されたメモリーは読み取り専用で、書き込みを試みると例外になります。また、カーネルのメモリーは、カーネルのコードを実行しているとき以外は、プログラムから読み書きできないように設定します。
ストレージI/Oは、メモリーアクセスに比べると非常に遅い操作です。そこでカーネルは、メモリーをストレージのキャッシュとして使用します。一度読み込んだストレージの内容をメモリーに保持することにより、再度同じ箇所を読み込む場合、メモリーの内容をプログラムに返す、あるいは書き込み内容をメモリー中に保持します。そして適切なタイミング、あるいはプログラムから指示されたタイミングで書き込むことにより、全体的なI/O性能を向上させます。
キャッシュは、プログラムが読み書きするファイルだけでなく、ライブラリを含むプログラムの命令部分にも使われます。