コンピュータにおけるメモリとはなにか（プログラムとメモリの関係性）


コンピューターサイエンスなどをすっ飛ばしていきなり実務に入ってしまった駆け出しエンジニアです。
その弊害で、とりあえずソースコードは書けるものの、プログラムがどういう仕組で動いているのかがよくわかっていません。

そんな状況を打破するため、最近勉強をした内容をアウトプットをしようと思います。
私と同じような状況の方の一助になれば幸いです。

また諸先輩方に置かれましては、気に成る点があれば遠慮なく指摘いただきたいです。


# この記事が目指すところ

**そもそもメモリって何？** という疑問を解消するための記事です。

発端としては、とある案件でAWSサービスを使用していた際に「メモリの使用率が80%を超えました」というアラートを受け取ったことです。

とりあえず良くない状況であることはわかるものの、「どういう状況であればメモリ使用率が上がってしまうのか」「プログラムとメモリはどんな関係なのか」「そもそもメモリって何」という疑問が次々に湧きました。

そこで、プログラミングとメモリの関係性を明らかにすることを最終的な目的として勉強をした結果を書き残すことにしました。
一気に書くと大変なので、まずは「そもそもメモリとは」という点にフォーカスしています。

# メモリとは主記憶装置のこと
一般的に、コンピュータは以下の5大要素で構成されており、メモリはそのうちの一つです。

<dl>
  <dt>制御装置</dt>
  <dd>コンピュータに関する各装置を制御する装置<br>CPUなど</dd>
  <dt>演算装置</dt>
  <dd>足し算や引き算などの演算を行う<br>CPU・GPUなど</dd>
  <dt>記憶装置</dt>
  <dd>プログラムやデータを記憶する<br>メモリ・HDD（ストレージ）など</dd>
  <dt>入力装置</dt>
  <dd>処理するためのデータを入力するための装置<br>キーボード・マウスなど</dd>
  <dt>出力装置</dt>
  <dd>コンピュータの処理結果を出力する<br>ディスプレイなど</dd>
</dl>


メモリは主記憶装置とも呼ばれ、記憶装置のメインを担うことからも「メインメモリ」と呼ばれることもあります。

その名前から想像がつくように、処理に必要なデータを記憶しておくための装置になります。


余談ですが、PCの設定を見ると使用しているメモリの情報を見ることが出来ます。
(Macの場合、「このMacについて」というタブから確認できます）

![このMacについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766636/7b96dca2-83b3-8d24-0675-a5e34e321b50.png)
メモリはデータを記憶するための装置ですので、容量を示す単位としてGBが使用されることが一般的です。
上記の写真から、私のPCでは16GBの容量のデータやプログラムを記憶することが出来るメモリが搭載されていることがわかります。


# メモリはbit(0or1）を記憶する装置の集合体
メモリが記憶装置だということは先述のとおりですが、保存する情報はbit単位で保存されます。
多くの場合、記憶領域は8bit毎に区切られていて、アクセスするためのアドレスがそれぞれに割り振られています。

ビルに例えるなら、8人収容可能な部屋があり、それぞれの部屋には部屋番号が割り振られています。その部屋の集合体であるビルこそがメモリである、といったイメージでしょうか？

メモリの中の情報を取り出したいときは、各アドレスを指定してその中に格納されている情報へアクセスするといった流れになります。

# メモリにはプログラムや処理に必要なデータを置く
ではメモリには何を記憶させておくの？という話ですが、実行に必要なプログラムやデータが置かれています。

コンピューターは5つの要素から成るというのは先述のとおりですが、それぞれの装置は「何かを実行するための装置」であり、「何を実行するか」という情報は保持していません。

（もし仮に「何を実行するか」までその装置で限定してしまうと、使い回すことが出来ない不便な装置になってしまいます。）

そこで、「何を実行するか」「処理に必要なデータ」などをメモリに置いておき、各装置が処理をするタイミングで、メモリに於いてある情報を取りに行って（あるいは渡してもらって）処理をする、という流れになります。


# コンピューターにおけるメモリの立ち位置
メモリの役割をわかりやすくするために、前準備として各装置の関係性を明らかにしておきましょう。


![コンピューターの5大構成要素.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766636/8f47aa9a-c7a9-4de3-4834-4532aa6c6aa6.jpeg)

画像の青い矢印がデータやプログラムの流れ、ピンクの矢印が制御の流れを表しています。

例えば、「入力した数字を計算して画面に出力する」といった処理があった際の一連の流れを見ていきましょう。

* 入力装置から入力された値がメモリに記憶されます
* 制御装置の方でメモリからプログラムを取り出し、計算の命令を演算装置に対して出します。
* 演算装置は、計算に必要な数字をメモリに取りに行き計算をします。終わったら計算結果をメモリに返します。
* 制御装置が出力装置に働きかけ、メモリに格納されている計算結果を出力装置で表示させます


おおよそ以上の流れです。

ご覧のようにメモリはプログラムの内容（命令）や必要なデータなどを格納しているため、コンピュータの中核を担っていると言っても過言ではありません。

何をするにしても一度メモリを経由し、情報の読み書きをしています。

# メモリの種類

今まで単に「メモリ」とだけ記述してきましたが、それは「主記憶装置（メインメモリ）を指していました。
実は記憶装置は、主記憶装置と補助記憶装置の２つに分かれるため、最後にそれを紹介します。

### 主記憶装置
いままでさんざん説明してきたメモリのことで、メインメモリと呼ばれることもあります。
プログラム自身や処理に必要なデータを格納しておくことができ、使いたい場合は都度メインメモリにアクセスをすることになります。

メインメモリですが、実は**揮発性**という特徴があります。
これは、電源を落とすと内容が消えてしまう、ということです。

### 補助記憶装置
記憶装置にはには補助記憶装置と呼ばれるものもあり、HDDなどが該当します。
メインメモリ同様、プログラム自身や処理に必要なデータを格納しておくことが出来ます。

メインメモリとの大きな差は**非揮発性**という点です。
電源を落としても内容が消えてしまうことはありません。

# 主記憶装置と補助記憶装置は使い所が違う

両者の関係を図式すると次のようなイメージになります。
![無題のプレゼンテーション (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/766636/85b2cc5d-d9dc-8858-1126-40bff45edb6a.jpeg)

CPUの視点からすると、メインメモリの先に補助記憶装置があります。
CPUから補助記憶装置から情報を取得する場合には、一度主記憶装置を経由して補助記憶装置にアクセスします。
そして情報をメインメモリに記憶させ、それを更にCPUへ渡す、といった流れになります。
この時、CPUから直接補助記憶装置にアクセスすることは出来ません。


# メモリの必要性はアクセスの速さにある
パソコンを利用している間、たくさんのデータの読み書きが行われます。

補助記憶装置であるHDDでは長期的にデータを保存できる反面、カセットテープやビデオテープのように磁気によって、
物理的にデータを読み書きするので処理にどうしても時間がかかります。

もし、それらすべてのデータをHDDに保存してしまえば、パソコンの動作が遅くなり不安定になってします。

そこで、高速で読み書きを行なってくれる装置が必要になるわけです。
その装置こそがメインメモリというわけです。


# まとめ
メモリとは、実行に必要なプログラムやデータを保管しておくための装置のことでした。

・主記憶装置（メインメモリ）は、CPUから直接アクセスできる代わりに電源を落とすと中身が消える
・補助記憶装置（HDD）は、メインメモリを通さないとやり取りできずアクセス速度も遅いが、電源を落としても中身が保持させる

という特徴もありました。


これらを踏まえた上で、次回以降「メモリがプログラムの実行にどのように関わってくるか」についても記事を書きたいです。