コンピュータシステムのメモリ容量を大きくすると処理が速くなるのはなぜか?
コンピュータシステムにおいて、メモリ容量が足りない場合、メモリ容量を大きくするとパフォーマンスが改善する場合があります。
この記事では、コンピュータシステムのメモリとパフォーマンスの関係について説明します。
TL;DR
この記事では、コンピュータシステムのメモリ容量を大きくすると処理が速くなる理由として以下の2つを説明しています。
スワップが発生しづらくなる
スワップはストレージデバイスの一部を一時的にメモリの代わりとして使用する仕組み
スワップが発生するとストレージデバイスへのアクセスが発生して、処理が遅くなる
メモリ容量を大きくすると、スワップが発生しづらくなり、システム全体が高速化する場合がある
ページキャッシュの容量が大きくなる
ページキャッシュはストレージへのアクセスとメモリへのアクセスの速度差を埋めるための仕組み
ストレージデバイスのデータをメモリに保存する
メモリ容量を大きくすると、ページキャッシュから返却できるデータが増えて、システム全体が高速化する場合がある
参考
この記事は、[試して理解]Linuxのしくみ~実験と図解で学ぶOSとハードウェアの基礎知識を参考にして、コンピュータシステムとメモリの関係についてまとめています。
コンピュータシステムは何をしているのか?
まず、コンピュータシステムは何をしているのでしょうか?
コンピュータシステムは多くの場合、何らかの入力を受け付け、処理をして、結果を返却します。
入力から出力までは、おおよそ以下のような手順が繰り返されます。
入力デバイスやネットワークアダプタを介してコンピュータに何らかの処理を依頼する
メモリ上に存在する命令を読み出して、CPUで実行して、結果をメモリ上のデータを保持する領域に書き込む
メモリ上のデータをストレージデバイスに書き込む、ネットワークを介して別のコンピュータに転送する、出力デバイスを介して人間に見せる
処理はどのように実行されるのか?
では、処理はどのように実行されるのでしょうか?
処理は、プログラムを通して実行されます。
プログラムとはユーザにとって意味のある処理を1つにまとめたものです。
プログラムは、アプリケーションのプログラムやミドルウェアのプログラムなど、いくつかの種類があります。
それぞれのプログラムはお互いに連携して動作します。
プログラムはどのように実行されるのか?
では、プログラムはどのように実行されるのでしょうか?
プログラムは、OSによって実行されます。
OSは、プログラムをプロセスという単位で実行します。
プロセスがデバイスにアクセスするときには、デバイスドライバを介してアクセスします。
プロセスはユーザモード、デバイスドライバはカーネルモードで動作します。
モードが分かれているのは、複数のプロセスが同時にデバイス操作をする状況を避けるためです。
デバイス操作以外にも通常のプロセスから実行されると困る処理があります。
それは、プロセス管理システムやプロセススケジューラ、メモリ管理システムなどです。
システムに搭載されているCPUやメモリなどのリソースはカーネルが管理しています。
カーネルはリソースの一部を各プロセスに分配しています。
プロセスを実行するときにデータはどのように扱われるのか?
プロセスを実行するときには、データは様々な記憶装置を行き来します。
例えば、ストレージデバイスからデータを読み出し、計算した結果を書き込むときには、以下のような処理が実行されます。
ストレージデバイスからデータを読み出し、メモリに保存する
メモリに保存されたデータをCPUが読み出す
CPUがデータを計算する
CPUがメモリに結果を書き込む
メモリに書き込まれた結果をストレージデバイスに書き込む
ストレージデバイス、メモリ、CPUなど記憶装置の階層構造を記憶階層と呼びます。
メモリはどのように管理されるのか?
では、メモリはどのように管理されるのでしょうか?
メモリはカーネルのメモリ管理システムで管理されます。
カーネルのメモリ管理システムは、システムに搭載されるメモリの空きメモリをプロセスに割り当てます。
メモリが足りなくなったらどうなるのか?
では、空きメモリが足りなくなったらどうなるのでしょうか?
プロセスにメモリを割り当てていくと空きメモリが足りなくなります。
メモリが足りなくなると、メモリ管理システムは、カーネルの解放可能なメモリ領域を解放します。
使用しているメモリが増え続けると、システムは何をするにもメモリが足らず、身動きが取れない状態になります。
この状態を Out Of Memory と呼びます。
Out Of Memory になったらどうなるのか?
Out Of Memory になった場合、どうにかしてメモリ領域を解放する必要があります。
Linuxのメモリ管理システムには OOM killer という機能があります。
OOM killer は適当なプロセスを選んで強制終了する機能です。
プロセスを強制終了すると空きメモリが増えます。
しかし、適当なプロセスを強制終了するのは、普通は困ると思います。
スワップとはなにか?
Linuxにはスワップという仕組みがあり、Out Of Memory に対策することができます。
スワップは、ストレージデバイスの一部を一時的にメモリの代わりとして使用する仕組みです。
システムのメモリが枯渇したときに、使用中のメモリの一部をストレージデバイスに退避して、空きメモリを作り出します。
スワップアウトとはなにか?
あるプロセスが物理メモリを必要とするときに、物理メモリに空きがない場合はどうなるでしょうか?
その場合、カーネルが使用中の物理メモリの一部をストレージデバイスのスワップ領域に退避します。
これをスワップアウトと呼びます。
物理メモリの空きメモリが確保されると、カーネルがプロセスにメモリを割り当てることができます。
スワップインとはなにか?
また、時間が経って、システムに空きメモリができたとします。
そのときに、スワップアウトしたデータにプロセスがアクセスした場合はどうなるでしょうか?
そのときは、カーネルがスワップ領域に退避していたデータを物理メモリに戻します。
これをスワップインと呼びます。
スワップの何が問題なのか?
スワップの仕組みは、システムが使用できるメモリの容量が実際に搭載されているメモリ容量にストレージデバイスのスワップ領域が追加されて素晴らしいように思えます。
しかし、普通はストレージデバイスへのアクセス速度はメモリへのアクセス速度と比べると数桁遅く、スワップが発生するとストレージデバイスへのアクセスが発生するので、システム全体が遅くなります。
ストレージデバイスからどのようにデータを読み出すのか?
ここまでは、メモリからデータを読み出す場合について書きました。
次に、ストレージデバイスからデータを読み出す場合について書きます。
CPUがストレージデバイスに保存されているデータを計算するときは、ストレージデバイスから読み出したデータをメモリに保存して、CPUがメモリからデータを読み出し、計算をします。
このとき、ストレージからメモリにデータを読み出す速度は、メモリからCPUにデータを読み出す速度に比べると数桁遅いです。
この速度差を埋めるために、ページキャッシュという機能があります。
ページキャッシュはストレージデバイスのデータをメモリにキャッシュする仕組みです。
ページキャッシュとはなにか?
あるプロセスがファイルのデータを読み出すときは、どのような処理が実行されるのでしょうか?
まず、ファイルのデータをメモリ上にあるページキャッシュという領域にコピーします。
つぎに、ページキャッシュにあるデータをプロセスのメモリにコピーします。
これで、プロセスがデータを読み出せるようになります。
では、別のプロセスが同じデータを読み出すときにはどうでしょうか?
同じデータがページキャッシュ上に存在する場合は、カーネルがページキャッシュからデータを読み出して、新しいプロセスのメモリにコピーします。
この処理はファイルからデータを読み出す場合に比べてはるかに早く終わります。
ファイル上のすべてのデータがページキャッシュ上に存在する場合は、ファイルへのアクセス速度は実質的にメモリへのアクセス速度に近くなります。
ページキャッシュのサイズは、プロセスがページキャッシュにないデータにアクセスするごとに増えていきます。
メモリが足りなくなると、カーネルはページキャッシュを解放して空き領域を作ります。
システム全体のメモリ容量を増やすと、ページキャッシュから読み出せるデータが増えて、システム全体が高速化する場合があります。
まとめ
この記事では、コンピュータシステムのメモリ容量を大きくすると処理が速くなる理由として以下の2つについて書きました。
スワップが発生しづらくなる
スワップはストレージデバイスの一部を一時的にメモリの代わりとして使用する仕組み
スワップが発生するとストレージデバイスへのアクセスが発生して、処理が遅くなる
メモリ容量を大きくすると、スワップが発生しづらくなり、システム全体が高速化する場合がある
ページキャッシュの容量が大きくなる
ページキャッシュはストレージへのアクセスとメモリへのアクセスの速度差を埋めるための仕組み
ストレージデバイスのデータをメモリに保存する
メモリ容量を大きくすると、ページキャッシュから返却できるデータが増えて、システム全体が高速化する場合がある
参考
この記事は、[試して理解]Linuxのしくみ~実験と図解で学ぶOSとハードウェアの基礎知識を参考にしています。
さらに詳しく知りたい方はぜひ読んでみてください。
増補改訂版はこちら。
次に
RDBMSについても書いたので興味があれば読んでみてください。
この記事が気に入ったらサポートをしてみませんか?