はじめに
OSのメモリ管理について、自分自身の復習も兼ねて、誰でもわかるような解説に挑戦してみます。「仮想メモリって何?」「キャッシュって何?」といった方向けです。
メモリはOS(Windows、Linux、macOS etc...)が管理しています。そのため、OSが何をやっているのかをご理解いただければ、この投稿の目的は達成です。
ちょっと本業が多忙のため、何回かに分けてのんびり進む予定です。あらかじめご了承ください。
(追記)LT動画のお知らせ
この記事は3本に分かれていますが、それらをひとまとめにして(少しだけ割愛して)、Easy Easyというエンジニアリング コミュニティのLTイベントでお話させていただきましたので、その時の動画とスライド資料をリンクしておきます。
この記事のLTは15分ちょっとです。1.5倍で再生してもだいたい聞き取れたので10分くらいでいけます。Qiitaの記事を3本も読むのは面倒という方はこちらをぜひ!スライド資料もリンクしておきます。
以下、本題です。
メモリの管理
前述のように、メモリはOSが管理しています。そのため、みなさんが書いているプログラムの中でメモリが必要になっても、勝手に使うことはできません。OSから借りる必要があります。OSは貸し出し依頼を受けたら、空いているメモリを探してプログラムに貸し出してくれます。
OS、メモリ、プログラムの関係を賃貸のアパートに例えてみました。
「あれ?いちいちOSから借りたりしてないよ、new hoge[123]
とかmalloc(456)
とかfugo = [7, 8, 9]
とかやれば普通にメモリ使えるし」
そう思われる方もいるかも知れませんが、お使いの開発言語が内部でOSとの貸し借りの手続きをやってくれているのです。
ファイルの管理
メモリ管理入門なのですが、ファイルについても少し解説します。
ファイルもメモリと同じで、OSが管理しています。そのためプログラムは勝手には使えません。読み込む時も書き込む時も、OSに依頼してやってもらいます。
「OSに頼まずにfread()
とかhoge.read()
とかfugo.readlines()
とかで直接読み込めてるけど」
そうです、お使いの開発言語が内部でOSへの依頼をやってくれています。
また、ファイルの特性上、プログラムはファイルの中身に直接アクセスすることができません。読み込む時は一度メモリに読み込む必要があります。書き込む時も書き込みたい内容をメモリに用意して、そこからファイルへ書き込む必要があります。ファイルはメモリと比べて、この点がちょっと面倒です。
先ほどメモリをアパートの部屋に例えましたが、ファイルは読み書きに時間がかかるので、遠くの倉庫に例えてみました。
ファイルへ書き込む時はこの逆です。大家さん(OS)に頼むと、部屋(メモリ)の荷物(データ)を倉庫(ファイル)まで持って行って(書き込んで)くれます。
例えの整理
わかりやすくしようと例えてみましたが、逆にわかりにくくなってきました^^;
一度、整理しておきます。
実際 | 例え |
---|---|
OS | 賃貸アパートの大家さん |
メモリ | アパートの部屋 |
ファイル | 倉庫 |
プログラム | 部屋を借りる人 |
プログラムが使うデータ | 荷物 |
プログラムの処理 | 部屋の中での生活 |
整理しても変わらないですね。とりあえず先に進みます……
大家さんの苦悩
大家さんは大変な割に、あまり儲かりません。部屋が6部屋しかないので、6人に貸したらもうそれ以上は家賃収入が増えないのです。
もちろん部屋を増やせば収入は増えます。でもアパートを増やしたりビルに建て替えたりすると、とんでもないお金がかかってしまいます。
ちなみに、住人の生活スタイルは実に様々です。昼間は外に出かけていて部屋を空けている人もいますし、夜に部屋を空けている人もいます。1日中部屋にいて何かやっている人もいますし、夜中に一生懸命勉強している人もいます。
ここで大家さんは、お金をかけずに部屋を増やす、とんでもない方法を思いついてしまいました!
大家さんのアイデアについては、次回の誰でもわかるメモリ管理入門:02でご紹介します。