ablog

不器用で落着きのない技術者のメモ

OSのメモリ管理と仮想記憶の歴史

今や空気のような存在で普段意識することはないが、メモリ管理や仮想記憶はOSの主要機能だ。wikipedia:MVSwikipedia:VMS のような名前の OS があるのもうなづける。OS、プロセッサ、メモリの歴史と深い関係がプロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)にわかりやすく書かれていたのでまとめてみた。

wikipedia:プログラム内蔵方式コンピュータ(1940年代)

wikipedia:ENIAC(1946年)のような初期のコンピュータではプログラムはメモリに格納されておらず、スイッチや配線ボードの差し替えでプロクラミングが行われていた。別のプログラムに切り替えて実行するのに手間がかかるので、データと同様にメモリにプログラムを書き込んでおき、命令もメモリから読み出せるようにするプログラム内蔵方式コンピュータが考案された。この方式の論文を書いた天才wikipedia:ジョン・フォン・ノイマンにちなんでwikipedia:ノイマン型コンピュータと呼ばれる。現代のコンピュータの基礎となる設計はノイマン型コンピュータに基づいている。

wikipedia:仮想記憶(1960年代)

メモリにプログラムを格納できるようになったが、大きなプログラムや複数のプログラムをメモリに格納できなかった。そこで、プログラムで使おうとしている命令や データだけを高速のメモリに置き、その他の部分はディスクに置く解決方法が考案された。実際より大きなメモリがあるように見えるので仮想記憶と呼ばれた。UNIXLinuxWindows をはじめ多くのOSで仮想記憶がサポートされている。

wikipedia:マルチタスク(1960年代)

コンピュータが高速になるにつれてキーボードからの入力やプリンタ出力のほうが時間がかかり、プロセッサが遊んでしまうようになり、1台のコンピュータを複数の人で利用しようという考え方が出てきた。wikipedia:MITwikipedia:ベル研究所wikipedia:ゼネラル・エレクトリックが共同でwikipedia:Multicsと呼ばれるメインフレームOSを開発し、wikipedia:タイムシェアリングシステムという仕組みでマルチタスクを実現した。そうなると、複数のプログラムがメモリ上に存在することになり、これらの管理を行う機構としてメモリ管理機構や特権状態などがプロセッサの命令アーキテクチャに加えられていくことになる。また、タイムシェアリングシステムはマルチタスクの現在のOSへと発展していく。Multicsの開発に関わっていたwikipedia:ベル研究所wikipedia:ケン・トンプソンwikipedia:デニス・リッチーがその後、Unics(wikipedia:UNIX)を開発し、後世に多大な影響を与えた。ベル研究所UNIXの開発に携わっていたケン・トンプソンやwikipedia:ロブ・パイクは今は Googlewikipedia:Go (プログラミング言語)の設計などに関わっている。
少し脱線すると、Microsoft も過去にwikipedia:XENIXという商用UNIXを開発していた。MS-DOSWindows 95/98/MeのカーネルにはXENIX互換のシステムコールが残されているらしい。ちなみにwikipedia:Windows NTを開発したwikipedia:デヴィッド・カトラーは元々はwikipedia:デュポンメインフレームを使っていて、OSを開発したくなってwikipedia:ディジタル・イクイップメント・コーポレーションに移ってwikipedia:VMSを開発していた経歴を持ち、現在はwikipedia:Microsoft Windows Azureの開発に携わっているらしい。

メモリ管理方式はwikipedia:セグメント方式からwikipedia:ページング方式へ (その後)

当初は命令やデータ領域を先頭アドレスと長さを指定して可変長で管理するセグメント方式のメモリ管理機構が使われていたが、サイズがバラバラのため断片化して有効活用できない問題が発生した。セグメント方式で起こる断片化の問題を避けるため、最近のプロセッサではページング方式のメモリ管理が使われている。ページング方式はページという固定長の単位でメモリを管理する。wikipedia:x86プロセッサではページのサイズは4KB。OSが管理するメインメモリ領域の中にwikipedia:ページテーブルと呼ばれる論理アドレス物理アドレスの対応表で管理される。メモリアクセスのたびにページテーブルを読むとメモリアクセス回数が2倍になるため、wikipedia:トランスレーション・ルックアサイド・バッファ(TLB)と呼ばれるページテーブル用のキャッシュが存在する。

4〜8KBのページからMB級のラージページへ (さらにその後)

TLBのエントリ数は多くても1024程度なので、大容量メモリにアクセスするデータベースのようなプログラムではTLBミスが高い頻度で発生する。断片化を抑えてメモリを効率的に使うためには1024ページ程度に分割できれば良いので、メインメモリのサイズがGB級になっている現在ではページサイズはもっと大きくして良いが、過去に作られたバイナリプログラムはいろいろな点でページサイズを意識してしまっていて、互換性の観点からページサイズを変えることができなくなっている。このためx86では4KBのページサイズを踏襲している。x86より後にアーキテクチャを規定したwikipedia:SPARCなどのwikipedia:RISC系のプロセッサでは8KBのページを使うものが多いが、4KBも8KB も五十歩百歩。現在のプロセッサでは4KBや8KBのページに加えてMB級の大きなページを使えるようになっている。このような大きなページをラージページと言い、Linux の HugePages はプ ロセッサのラージページを使ったOSの機能の呼び名である。

参考

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

Systems Performance: Enterprise and the Cloud

Systems Performance: Enterprise and the Cloud


追記(2014/03/22):

id:wmo6hash さんが tweet されてた URL を見て、自分も同じような発想で考えるなと思った。歴史に関して一言言っておくと、自分はコンピュータの歴史には興味があるが単に何年に何が発明されたとかという雑学としての歴史だけではなく、歴史を知っていると新しい技術と言われているものが実は新しくなかったり、時代が繰り返して次にどうなるかが予測しやすくなったりと結構役に立つからなのだ。