name: overview class: title, smokescreen, shelf, no-footer # 第04回 仮想記憶<br><small>(Virtual Memory)</small> <div class=footnote> <small> </small> </div> --- class: compact,img-right # コンピュータの仕組み(復習) <div class=footnote> <small> <small> (脚注) 「コンピュータアーキテクチャ」の復習 </small> </small> </div> ![](../../images/computer-concept.png) <small> 1. プログラムをメモリ上にコピーする 1. CPUはメモリ上のプログラムを読みながら処理を進める - ふだんコピー元のプログラムはストレージに保存されていて、それを読み出している - ストレージとはSSDやHDDのこと <br> (手元つまりローカルにあるので、これらをローカルストレージと呼ぶ) <br> (第8回に、もう少し詳しくやります) </small> --- class: compact,img-right # メモリ(いわゆる物理メモリ、実物) <div class=footnote> <small> <small> </small> </small> </div> ![実写](../../images/physical-memory-actual.jpg) <small> - 右図は実物 - 比較のためマッキーとCD-ROMを置いてある - 中央(上)が普通のPC用 - 中央(下)の小さい方はノートPC用 - いまどきのメモリは大容量で - スマートフォンでも8GBくらい積んでる? - PCなら8〜32GBくらいかな? - 業務用のサーバ(例:仮想基盤)なら512GB〜1TBくらい積んでたりします </small> --- class: compact,img-right # OSの上では数十、数百のプロセスが同時に実行中 <div class=footnote> <small> <small> </small> </small> </div> ![height480px](../../images/physical-memory-maps.png) <small> - psやtopで確かめたとおり、OSの上では同時にたくさんのプロセスが実行されています - 各プロセスせいぜい数十MBだし、ブラウザが大きいとはいえ300-400MBくらいなので、 物理メモリが8〜32GBもあれば、全プロセスが同時にメモリを使えます - 同時にプロセスを実行できるのは、せいぜいコア数個までです。 では、お休みの(プロセスがSLEEPさせられている)時、 やりかけの仕事は、どうなっているの? <br> -> 答え:<B>メモリ上に置きっぱなし</B> </small> --- class: compact,img-right # 仮想記憶で各プロセスにはマイメモリに見えている <div class=footnote> <small> <small> (脚注) ごく一部のカーネルの仕事をする人は物理アドレスが関係する場合もありますが、 ほとんどのアプリケーション開発では物理アドレスなど忘れていてかまいません </small> </small> </div> ![height320px](../../images/physical-memory-maps.png) ![height320px](/slides/os/internal/memory/images/memory_virtual.png) <small> - 図(左)は前頁の再掲 - メモリ上には各プロセスの利用しているメモリが同時に置かれています - 図(右)はプロセスAとBの例 - 各プロセスの上側(virtual)がプログラムに見えているメモリアドレス ... <br> これを<B>仮想アドレス</B>と呼んでいます - 下側(physical)が実際の<B>物理アドレス</B> - <B>プログラムを書く際に物理アドレスは書きません(気にする必要もありません)</B> ... My Memory:-) - CPUに搭載された特殊な装置が、 メモリアクセス時に、 自動的に図(右)のようなマッピングを行うから </small> --- class: compact,img-right # 仮想記憶で各プロセスにはマイメモリに見えている <div class=footnote> <small> <small> (脚注) C言語で書いたメモリの使い方のイメージです(あくまでもイメージね) </small> </small> </div> ![height320px](../../images/physical-memory-maps.png) ![height320px](/slides/os/internal/memory/images/memory_virtual.png) <small> ``` [process-A.c] int main (){ int *xp; // (仮想)アドレスは1 *xp = 1; // 実際に書きこむ物理アドレスは9 } [process-B.c] int main () { int *xp; // (仮想)アドレスは1 *xp = 1; // 実際に書きこむ物理アドレスは5 } ``` </small>