メモリーとディスクとの関係について

<!-- wp:heading -->
<h2>あなたは以下の問いに答えることができますか？</h2>
<ol><li>ストアド・プログラム方式とは</li><li>メモリーを使ってディスクへのアクセス速度を向上させる仕組みのことをなんという</li></ol>
<p>言葉自体知らない人もいるかもしれません。私自身も少し前まで頭の中に？しか浮かびませんでした。</p>
<p>答えは</p>
<!-- wp:list {"ordered":true} -->
<ol><li>記憶装置にプログラムを格納して、そのプログラムを逐次実行する方式</li><li>ディスク・キャッシュ</li></ol>
<p>です。</p>
<p>これでも？と思う人も多いと思います。</p>
<p>少しずつ一緒に理解していきましょう！</p>
<h2>プログラムはメモリーに読み出す必要がある</h2>
<p>皆さんはプログラムを書き、それが実行されるまでにどのような流れを辿っているか知っていますか。</p>
<p>プログラムは記憶装置に格納されています。そしてそのプログラムは順次読み出され実行されます。（ストアド・プログラム方式）</p>
<p>そしてこの記憶装置は最初にお聞きした質問の <code>2.</code>で出てきた「メモリー」と「ディスク」です。</p>
<blockquote class="wp-block-quote"><p>プログラムは記憶装置に格納されています。</p></blockquote>
<p>この記憶装置は「ディスク」のことを指します。我々エンジニアがコーディングしたプログラムはディスクへと保存されていて、それをメモリー上へとロードし、CPUがそのプログラムを解釈することで実行されるのです。</p>
<!-- wp:image {"id":229,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://onemuri.space/wp-content/uploads/2020/01/disc_memory_cpu.png" alt="disc_memory_cpu" class="wp-image-229"/></figure>
<p>ちなみに、CPUはメモリーのアドレスを自身がもつプログラムカウンタによって指定し読み出すようになっています。</p>
<h2>ディスク・キャッシュとは</h2>
<p>先ほどのプログラムがメモリーに読み出される一連の流れを理解した上で、次に進みます。</p>
<p>プログラムはディスクに格納されていて、CPUがプログラムを読み出す際に毎回ディスクからメモリーに読み出し、メモリーに読み出されたプログラムを参照していると遅くなります。</p>
<p>それは、ディスクの読み出す速度はメモリーから読み出す速度に比べると遅いからです。</p>
<p>そのため、ディスクからメモリーに一度読み出された際にデータの一部をメモリーに保存しておいて、再度CPUがプログラムを読み出す際にメモリーが返すようにすることで高速化を計ることができます。</p>
<p>これを<strong>ディスク・キャッシュ</strong>と呼びます</p>
<figure class="wp-block-image size-large"><img src="https://onemuri.space/wp-content/uploads/2020/01/memory_cpu.png" alt="memory_cpu" class="wp-image-230"/></figure>
<h3>最初から全部メモリーに展開していれば良いのでは？</h3>
<p>CPUがメモリーに保存されたプログラムを読み出すことで高速化を計ることができるのであれば、最初から最初から全てのプログラムをメモリー上に展開できれば高速に展開できるのではないでしょうか。</p>
<p>それならば、毎回遅いディスクからのプログラムの読み出しをせずに済みますから。</p>
<p>しかし、ディスクとメモリーはメリット・デメリットが存在します。</p>
<p>ディスク</p>
<ul><li>低速</li><li>大容量</li><li>安価</li></ul>
<p>メモリー</p>
<ul><li>高速</li><li>小容量</li><li>高価</li></ul>
<p>まさに、トレードオフですね。そのため「ディスク→メモリー→CPU」という構成を取ることも納得ですね。</p>
<h2>メモリーを節約する方法</h2>
<p>プログラムの量が大きくなればなるほど、読み出しに時間がかかってしまいますし、メモリーの量よりもプログラムで処理している容量が大きくなると処理しきれずに途中で処理を止めてしまいます。</p>

<p>なので、メモリーを節約する方法が存在します。</p>

<ol><li>DLLファイルで関数を共有</li><li>ファイルを開く際には一度に全て開くのではなく、一部ずつ読み込む</li><li>ポインターを使う</li></ol>
<h3>DLL ファイルで関数を共有する</h3>
<p>DLL (Dynamic Link Library) はプログラムの実行時に関数とかデータを動的に結合し、複数のアプリにて同じDLLファイルを共有することができます。</p>

<p>つまり、同じ機能を持った異なるアプリケーションが存在する場合に、一つ分の関数のメモリ領域で複数のアプリ上にて関数を呼び出すことが可能であるということです。</p>

<h3>ファイルを開く際には一度に全て開くのではなく、一部ずつ読み込む</h3>
<p>何かしらのファイル（例えばテキストファイル）を読み込んで、内部で処理をする。というようなプログラム書くことは日常的に発生しますが、その際、そのファイルを一度に全部読み込むとメモリ圧迫の原因になります。</p>
<p>例えば、1MBのファイルを一度に読み込むのと、10分割で読み込むのとでは全くメモリ使用量が変わりますよね。</p>
<p>これについては、各言語で実装方法が異なるのですが、調べてみたら無限のように解説記事が出てくると思います。</p>
<h3>ポインターを使う</h3>

<p>多くの情報系の学生が大学在籍時にC言語を学ぶことが多いと思いますが、その中でも躓きやすいポイントである「ポインター」はメモリ節約に一役買ってくれます。</p>

<p>こちらも解説記事たくさんあります。が、いくつかわかりやすい記事をピックアップしておきますね。つまづきやすいので。</p>


https://daeudaeu.com/programming/c-language/pointer/
http://pg-kura.hatenablog.com/entry/20120616/1339856279

<p>ポインターはメモリの節約化だけでなく高速化にも役立ちます。</p>
<p>いずれ勉強することになると思いますので、プログラムのことを嫌いにならないぐらいのタイミングで思い出して学習してみると良いのではないでしょうか。</p>
<h2>まとめ</h2>
<p>長々と書いてきましたが、メモリーとディスクの関係について理解が進んだでしょうか。</p>
<p>大事なことは</p>
<ul><li>CPUがプログラムを読み出す際に、ディスクからメモリーへとプログラムがコピーされ、コピーされたメモリー上にあるプログラムをCPUが解釈する</li><li>ディスクから読み出されたプログラムを一部メモリーに保存することで読み出しを高速化する（ディスク・キャッシュ）</li><li>メモリーを節約するために、お金でメモリーの容量を大きくしたり、DLLや、プログラムの記述方法を工夫する</li></ul>
<p>といったところではないでしょうか。</p>
<h3>参考</h3>
[プログラムはなぜ動くのか](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E7%9F%A2%E6%B2%A2%E4%B9%85%E9%9B%84/dp/4822283151/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=31ZWKMQS79060&keywords=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B&qid=1579409356&sprefix=%E3%81%AA%E3%81%9C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%2Caps%2C105&sr=8-1)

### シリーズ
[プログラムはなぜ動くのか](https://qiita.com/mergit/items/2e594e2da8456a64f3da)