第八回-02 メインメモリとは何か


メインメモリとは何か

第六回-01 配列の基礎 にて提示した、コンピュータの CPU とメモリとハードディスクの図を再び取り上げよう。



この図は「配列」について学んだ際に配列のイメージ図を描いたものである。
ハードディスクに格納されていた jpg 画像が、プログラムによって一旦メモリに格納され、それを自作プログラムで加工する、という話であった。

ここからは、プログラムが動いているときに CPU とメモリが どのような関係にあるか
を理解することを目標の一つとする。 これは、言い替えると コンピュータ上でプログラムが動作する仕組みを理解するということでもある。

さて、「メモリ」とは記憶装置のことを指すコンピュータ用語である。
しかし一言でメモリと言っても、「USB メモリ」もメモリだし、 「CD-ROM (ROM = Read Only Memory)」もメモリであり、混乱しやすい。

しかし、コンピュータの世界では単に「メモリ」というと「メインメモリ」のことを指すことが多い

では、そもそもメインメモリ (メモリ) とは一体なんであろうか?
イメージを掴むために、下に省スペース型デスクトップのケースを開けた様子を示した。

[質問]

まずは図を良く見て CPU 、メインメモリ、ハードディスクはどれか自分で選んで見て欲しい。

決めたら解答を見てみよう。解答は、上の画像をクリックすれば現われる

ちなみにノートPC の場合、CPU、メインメモリ、ハードディスクを見ることが出来ない場合がほとんどである。
ただし、メモリだけはユーザが自分で拡張できることが多い。その場合、ノートPCの裏に拡張メモリ用スロットを覆う蓋があり、
そこをドライバを使って開けることで、ノートPC用の小型のメモリを追加できる (下図)。




メインメモリの使われ方

メインメモリがどのようなものかのイメージが掴めたところで、 メインメモリがどのような使われ方をするかについて
概略を説明しよう。ここでは、Windows / Linux / Mac OS X のようなマルチタスク OS でのメモリの使われ方を解説する。
(なお、マルチタスク OS とは、複数のタスクを切替えながら実行できる OS である。
実際には切替えているだけなのだが、ユーザーからは、複数のアプリケーションを同時に実行しているように見える)

まず、実際のメモリそのものことを物理メモリとも呼ぶ。この物理メモリの末尾側 (高位アドレス側と呼ばれる) に、
実際に OS が使うメモリ領域があり、システム領域と呼ばれる。

そして、様々なアプリケーションが起動されるに伴い、OS は各アプリケーションに メモリを割り当てる。
割り当てられたメモリを「論理メモリ」と呼ぶ (下図)。



ここで言うアプリケーションには、Office や CAD ソフトなどの商用アプリケーションはもちろん、
皆さんがプログラミングにより作成したアプリケーションも含まれる。

論理メモリは物理メモリから割り当てられるが、アプリケーション側から見ると、
メモリを占有している (実際に占有しているのは割り当てられた論理メモリ) ように見え、
他のアプリケーションが使っているメモリ領域にはアクセスできないようになっている。

なお、論理メモリの割り当ての際、物理メモリが足りなくなることがある。
その場合は OS が、使用頻度の低いメモリの領域をハードディスクに一旦退避して領域を空け、
必要に応じてまたメモリに書き戻すという操作が行われる。

このようにハードディスク上でメモリの替わりとして使われる領域を「スワップファイル」と言い、
メモリの内容をハードディスクに退避する操作を「スワップ」と言う。

第六回-01 配列の基礎 で注意したように、
ハードディスクへのアクセスはメモリへのアクセスに比べ、二桁くらい遅い
そのため、スワップが何度も発生するような状況では、メモリを増設するとスワップの回数が減り、動作が快適になる場合がある
(PC を購入する際、「メモリが多い方が快適」と呼ばれるのはこのため)

次に、各アプリケーションに割り当てられた論理メモリがそのアプリケーションの中でどのように使われるかの模式図を書いておく。
多くのシステムでは、4つの領域に分けてメモリを利用する (ただしその配置は環境やコンパイラにより異なる)。



具体的には以下の様な役割となっている。 詳細はいずれ登場するたびごとにに触れるが、このページでは「コード領域 (プログラム領域)」について知って欲しい。
第二回-01 用語を正しく覚えよう」にて、記述したプログラムがビルドによって機械語に変換されると学んだ。
機械語に変換されたプログラム本体が格納されるのがこのコード領域 (プログラム領域)である。

CPU は、このプログラム領域上のプログラムを一命令ずつ読み込んで順に実行することで、
プログラムが動作する。

本ページに書かれた内容を更に詳しく学ぶには以下の書籍が参考になる。

[おまけ] メモリはどれだけ積むべきか?
PC を買う際、メモリやハードディスクはどれだけの量が良いか、ということを考える必要がある。
基本的には「多ければ多い程良い」というのが答えだが、 メモリに関しては多ければいいとも限らないので、その話を少し記しておく。

まず、Windows には 32bit CPU 用の Windows と 64bit CPU 用の Windows がある。
Windows XP の頃までは 32bit 用 Windowsが主流だったが、Windows 7 以降は 64bit 用 Windows が主流となっている。
初期のタブレット用 Windows 以外は現在はほぼ 64bit 用 Windows と思って良いのではないだろうか。

原理的に、32bit CPU を用いたシステムでは 4GB 以上のメインメモリを使うことはできない。
これを理解するのは比較的簡単である。32 bit CPU ではメモリの番地 (アドレス) は 32bit の2進数で指定するが、
ここで、232 = 4,294,967,296 ~ 4 ギガであり、番地をバイト (B: Byte) 単位で指定するなら 4GB までしかアドレスを表せないからである。

一般にメモリは多ければ良いと言われ、それはその通りであるが、その分 PC の値段が高くなるのでどこかで妥協が必要である。

どういう時にメモリが不足のため増設すべきかと言うと、PCを使っているときにスワップが何度も発生することが一つの目安になるだろうか。
複数のアプリケーションを起動していて、そのアプリケーションを切替える際に、
「カリカリカリ…」とハードディスクへのアクセスが起こる場合はスワップが発生していると言える。

ただし、ハードディスクではなく SSD を使っている場合、このスワップ時のアクセス音は発生しないので、
「複数のアプリケーションを起動してPCの動作が遅くなる場合」にメモリが不足していると考えれば良いだろう。

ちなみに、個人的にどれくらいのメモリ量が必要と思っていたかを以下で思い出してみる。

1996年頃 学生の頃初めてPCを購入。奮発してメモリが多いマシンを買ったが、確か 40MB だったと思う (Windows 95 搭載)
2000年頃 128MB くらいあれば悪くないと思っていた記憶がある (この年 Windows 2000 発売)
2001年頃 256MB くらい (この年 Windows XP 発売)
2005年頃 512MB くらいあれば
2007年頃 1GB (2006年にVistaが出ている)
2009年頃 2GB (32bit版Windows 7ならこれくらい必要)
2010年代前半 4GB (64bit版Windows 7ならこれくらい必要)
2010年代後半 8GB (4GB でも問題ないケースは多いだろうが、Windows 10 ならこれくらいあれば安心)

これを見ると、新しい OS が出るたびに必要なメモリ量が増えているような印象を受ける。
(新しい OS が出るに伴い、メモリ消費量の多いアプリケーションも増えるから納得はいく)



←第八回-01 見ためを気にしよう~タブによる字下げ第八回-03 メインメモリとアドレス→

非情報系学生のための C/C++ 入門に戻る