はじめに
最近 OS について勉強していて、今回はメモリについてまとめました。
以前はプロセスについてまとめて、今回の話とも関係あることなので良かったら併せてどうぞ。
勉強のまとめとして書いている記事となります。
間違ったことを書いている可能性があるため、是非別のドキュメントにもあたってご確認いただければと思います。
メモリとは
そもそもメモリとは何なのかといえば、実行中のプログラムやデータなどを一時的に保持する場所のことです。
一時的に保存するだけなので、電源が停止するとデータは全て消えてしまいます。
そのためメモリは「短期記憶領域」とも言われます。
メモリは 0 か 1(ビット)の列を記憶できるデバイスとして存在しています。
普通は 8 ビットを 1 バイトとしてまとめるため、メモリは「バイトの列を記憶している」とも言うことができます。
メモリ内で記憶しているバイト列を 1 つ 1 つ格納している箱にはそれぞれに番号が振られています。
この番号のことを「アドレス」と呼びます。
物理メモリ空間と仮想メモリ空間
バイト列を記憶するデバイスとして物理的に存在しているメモリ空間を「物理メモリ空間」といい、物理的には存在していない仮想的なメモリ空間を「仮想メモリ空間」といいます。
物理メモリ空間のアドレスと仮想メモリ空間のアドレスは「ページ」という単位で対応付けされます。
ページとは、メモリ領域の分割単位で、一般的な OS では 4KB の単位で標準設定されています。
プロセスが OS にメモリ割り当てを要求すると、OS から割り当てられたメモリ内の領域のアドレスが返されます。
このアドレスは実際のメモリに存在しているアドレス(物理アドレス)ではなく、仮想メモリ空間内のアドレス(論理アドレス)となっています。
プロセスから見えるこのアドレスは、実際にメモリにアクセスする時点で実際に存在するアドレスに変換されるような仕組みになっています。
このような仕組みを使うことで、OS は実際に存在するよりさも多くメモリが存在するかのように振る舞うことができます。
ページング
上述した仮想メモリ機構を応用して、以下のようにハードディスクを用いてメモリを増やすこともできます。
物理メモリが足りなくなってきたとき、OS のカーネルはあまり使われていないページを探して、そのメモリ上のデータをハードディスクに移動して論理アドレスとの対応を解除します。
これを「ページアウト」といいます。
またプロセスがそのページにアクセスしたら、その瞬間にカーネルがプロセスを停止してハードディスクからページを読み込み、メモリ上にデータを戻して再び論理アドレスに対応付けます。
これを「ページイン」といいます。
これら一連を動作を「ページング」といい、ハードディスクを用いて実質的にメモリを増やすことができます。
賢い仕組みですが、頻繁にページインが発生している場合は、連続的にディスクデバイスから物理メモリに読み出されている状況なのでパフォーマンスが落ちることに注意が必要です。
また、先程は「物理メモリが足りなくなってきたとき」にこのようなことをすると書きましたが、十分な空き物理メモリがあっても、それが断片化されすぎていると OS によってはページアウトを発生させてでもまとまった空き容量を確保しようとすることもあります。
因みに、上述したページングの操作をページごとではなくプロセスごとに行う場合は、これらの操作を「スワッピング」と呼び、ページアウトは「スワップアウト」、ページインは「スワップイン」と呼びます。
ページキャッシュ
OS がメモリ処理を早く行うために、「ページキャッシュ」という仕組みがあります。
これは、ディスクから読み込んだデータを捨てずにメモリにキャッシュする仕組みです。
OS はメモリをページ単位でキャッシュするため、この仕組みを「ページキャッシュ」と呼びます。
ページキャッシュされればされるほど、一般的にはディスク I/O 負担が減って、サーバーのパフォーマンスが改善します。
メモリ管理
エンジニアとしてメモリの管理をしていくために、主に以下の 3 つに気を付けることが重要です。
- ページイン・スワップインの発生を抑える
- 空き物理メモリに関する誤解をしない
- バックアップの取り方に注意する
ページイン・スワップインの発生を抑える
上述の通り、ページイン・スワップインが頻繁に起こるとパフォーマンスが落ちてしまいます。
これらが起こる原因は以下の 2 つです。
- 物理メモリが足りない
- 物理メモリの断片化が進んでしまってまとまったメモリを確保できない
物理メモリが足りない場合は、物理メモリを増設するだけで解決します。
物理メモリの断片化に対してはは、大量のメモリを確保しているプロセスを終了させて、仮想メモリ空間を解放してあげる必要があります。
空き物理メモリに関する誤解をしない
空き物理メモリ量を確認すると、必要量に対して全く足りていないように見えることがよくあります。
しかし実際には、ほとんどがキャッシュとして使われているだけで、実際には空き物理メモリと見なすことができる場合が多いです。
特にページキャッシュはページキャッシュはファイルにアクセスすればするほどどんどん肥大化していきます。
バックアップの取り方に注意する
バックアップを取る際に、一時的に巨大なファイルの操作をするとページキャッシュに乗っていたデータが追い出されて、一時的にしか使われないデータに取って代わられることがあります。
負荷が高いサーバーの場合、ページキャッシュに乗っていたデータが追い出されて、サーバー負荷が急増してパフォーマンスが悪化することがあります。
この回避策としてブロック単位でバックアップを取る方法などがあります。
終わりに
メモリについてまとめました。
勉強中の身なので、間違っている点があれば是非コメントいただけると嬉しいです。