単一レベル記憶

単一レベル記憶（たんいつレベルきおく、英: Single-level store, Single-level storage, SLS）は、コンピュータが使っている記憶装置について、アプリケーションソフトウェアに対して主記憶装置と補助記憶装置の区別を意識させずに、ただ一つの巨大なアドレス空間で管理する仮想記憶のメモリ管理技術である。 入出力が非常に高速、プログラム実行の際に磁気ディスク装置から主記憶装置へのロードが不要、ユーザー (やオペレータ) から見て、磁気ディスク装置の管理が単純になる（たとえば、通常の管理業務では必須となるファイルシステムによるフォーマット等を必要とせず、単に新しいディスクを接続すればシステムの使える資源が増える、といったように）、などの特長がある。 単一レベル記憶は、Multics、IBMの System/38 、AS/400 （およびその後継システムの eServer iSeries 、System i 、Power Systems i Edition）などで採用されている。 仮想記憶方式のコンピュータであることは前提とする。 そういったコンピュータにおけるメモリ管理の方式として、セグメント方式やページ方式、そしてそれらの組み合わせなどがあって、単一レベル記憶方式とそれらとの組み合わせは任意ではあるが、単一レベルではページ方式を採用してディスク等のブロックサイズに合わせないと管理が面倒になることなどが、主記憶のみを対象とするメモリ管理とは異なってくる。 以下ではページ方式で管理されているものとする。AS/400 ではページサイズは4KBであった。 あるページは、主記憶装置上にあるかもしれないし、補助記憶装置上にあるかもしれない。あるページ (データ) が主記憶装置 (メインメモリ) と補助記憶装置 (磁気ディスク装置など) のどちらに存在するかについては、アプリケーションソフトウェアは意識することが無い (知る必要は無く、また知ることはできない) 。ページ (データ) の現在の場所が主記憶装置と補助記憶装置のどちらであるかは、アプリケーションソフトウェアにとっては重要なことではないのである。 あるページが主記憶装置と補助記憶装置のどちらに存在するかについては、単一レベル記憶を担うシステムコンポーネントが管理している。このシステムコンポーネントが、ページの割り当てを主記憶装置および補助記憶装置上で管理して、アプリケーションソフトウェアを含めたプロセスに対して利用できるようにする責任を担っている。 ページへのアクセスが発生した際、そのページが 主記憶装置上に存在する場合は即座にそのページは利用することができる。 補助記憶装置上に存在する場合はページフォールトが発生して、システムコンポーネントが補助記憶装置上のページを主記憶装置上に展開して利用できるようにする。 補助記憶のアドレッシングに必要な空間は、一般に、主記憶より比較的大きい。レジスタなどのワードサイズが32ビットのコンピュータの時代において、32ビットでアドレス可能な4Gバイトは、補助記憶のためには小さく、特に AS/400 のような、単一レベル記憶を採用するようなミッドレンジのシステムでは32ビットでは狭いと判断され、単一レベル記憶のためのアドレスのビット数は増やされた。 System/38 と初期の AS/400 では48ビットアドレスを使用していたため充分に大きいアドレス空間を使うことができた。 AS/400 はその後アドレス空間が拡張され、2006年現在では64ビットアドレスを使用している。 IBM System/38 と AS/400 （およびその後継システムの、eServer iSeries 、System i 、Power Systems i Edition）など単一レベル記憶 (SLS) の仮想記憶を採用しているシステムは、実行性能が高いという特長がある。 例えば System/38 の実装では、全てのオブジェクトを全ての補助記憶装置に分散して配置し、オブジェクトの格納および検索を極めて高速に行っている。その結果 System/38 では、補助記憶装置の領域が不足することはめったにない。 単一レベル記憶を採用しているシステムはまた実行時に、CPU、主記憶装置、補助記憶装置の間で資源を互いに自由に置き換え合うことができ、性能上のボトルネックを解決する。 System/38（およびその後継システム）では、そのオペレーティングシステム（OS）であるCPF（および後継のOS/400、i5/OS、IBM i）より低水準の、ソフトウェア層 (TIMI; Technology Independent Machine Interface「技術に依存しないマシンインタフェース」の下の層) である SLIC (System License Internal Code) と呼ばれるソフトウェアが単一レベル記憶を実現している。単一レベル記憶を提供しているのは SLIC であり、OS ではない。つまり SLIC はあるデータが主記憶装置上に存在するかどうかを知っているが、OS は単一レベル記憶に関与していないため知らない。 System/38 と AS/400 （およびその後継システム）での単一レベル記憶の実装では、マルチプロセスにおけるプロセス切り換え時の命令数がとても少なく、そのためプロセス切り換えは非常に高速である。この特長のため System/38 と AS/400 （およびその後継システム）は、多数のユーザを同時にサポートする場合や、多くのトランザクションを処理する場合 (トランザクション処理) において、高い性能を実現する。 ファイル操作においては、従来のシステムはファイルのオープンやクローズを多数行うため、余分なディスク操作が発生し、システム全体のパフォーマンスを低下させていたが、System/38 と AS/400 （およびその後継システム）ではその場でファイルを処理するため余分なオーバーヘッドが発生しない。 System/38 と AS/400 （およびその後継システム）での単一レベル記憶では、ページフォールトは2種類ある。データベースフォールトと非データベースフォールトである。 データベースフォールトは、関係データベースオブジェクトに関連するページが現在主記憶装置上に存在しない際に発生する。System/38 と AS/400 ではシステムの中核部分に関係データベース管理システム (RDBMS) を統合しており、関係データベースオブジェクトとして表 (テーブル) 、ビュー、索引 (インデクス) などがある。 非データベースフォールトは、関係データベース以外のオブジェクトに関連するページが現在主記憶装置上に存在しない際に発生する。 Unixのプログラミングモデルは、単一レベル記憶とは異なり、主記憶はアクセス保護以外にはOSの関与無しに自由に読み書きでき、補助記憶に対してはシステムコールで主記憶との転送しかできない。特にごく初期のUnixでは、以上のようなプログラミングモデルそのままの実装だけが存在していた。このようなモデルは、それが実装されていたような資源の少ないコンピュータでは、少々のプログラミングの際の手間と引き換えに効率的であったであろうし、垂直統合が前提のIBMのアーキテクチャとは異なり、異なるアーキテクチャのコンピュータへのOSの移植も簡単である。 しかしそのUnix系のシステムでも、補助記憶の読み書きの内容をOSが一時的に保持する（ユーザからは直接見えない）バッファがあり、主記憶中から非実行中のプロセスの領域を補助記憶に追い出すスワップもすぐに実装された。やがてデマンドページングも実装され、元々は unix とするのが慣習だったカーネルのファイル名が、BSDにおいて vmunixとなったのは仮想記憶の意味の「VM」を付けたものである。従来はそういった成行きからバッファとスワップは別になっていたが、近年では（たとえばNetBSDの場合、1.6の頃からのUnified Buffer Cache（UBC）により）カーネル内では統合的に管理されている。また mmap システムコールに代表されるが、単一レベル記憶のような機能が必要とされていることも確かで、ある程度は満たされている。同様に Microsoft Windows には CreateFileMapping や MapViewOfFile といったAPIがある。 また補助記憶の管理についても、論理ボリュームマネージャにより、ディスク単位ではなくストレージプールなどと呼ばれるような抽象化された単位で、ユーザーファイルとは完全に分離して外部記憶を管理できるようにもなった。 一方でアプリケーションプログラム、特にいわゆる「業務アプリ」等の要求を以上のようなモデルに実装するのは面倒があることは、そういったシステムにおいては大抵の場合に関連データベースないしそれ以外の何らかのデータベースシステム、あるいはオブジェクト指向データベースが併用されていることからもあきらかであり、この分野はOSと連繋する余地がある（オープンソースソフトウェアの実装では、一般ファイル上にデータベースを構築するものが多いので誤解されがちだが、（RDBに限らずNoSQL等も含めデータベース全般の一般論として）本格的なDBMSは、OSによるディスク管理を介さないか、ディスクドライバを直接使って（ /dev/hda1 のような。en:Raw deviceを参照）性能を追求するものである）。 また、フラッシュメモリの読み書きを、従来のディスクを前提としたAPIやSCSIなどのインタフェースを通して行うのはインピーダンスミスマッチであり、PCIeでストレージを直結するNVMeでは、論理的にも従来のAPIを介さずに直接制御することが考慮されている。既に、それに対応した en:Open-channel SSD を実装・製造した報告もある。また個別の（プロプライエタリな）ソリューションでは ioMemory（en:Fusion-ioを参照）などがある。さらに21世紀に入った後、研究開発が以前に比べ盛んになってきている、フラッシュメモリ以外の不揮発性メモリが主記憶用として代替になる可能性もあり、そうなった場合にはシステム全体が以前とは大きく変わると見込んで「ノーマリーオフコンピューティング」として検討が始まっている。実用面では、従来のDRAMモジュールに不揮発性メモリも混載するハイブリッドモジュールのための、「NVDIMM」（Non Volatile DIMM）と呼ばれているものの仕様が標準化（DDR4の追加規格）されるなどしている。 ノーマリーオフコンピューティングは、ムーアの法則自体の限界はまだ先でも、あきらかにつき当たっている消費電力の壁への対処という点もある。また単一レベル記憶は、ゼロコピー（en:Zero-copy）の観点でも効率と関係する。 以上のように、ゆっくりだが全体的な傾向としても、単一レベル記憶的な方向性はいくつか存在している。 IBM による System/38 と AS/400 （およびその後継システムの eServer iSeries 、System i 、Power Systems i Edition）の単一レベル記憶 (SLS) の仮想記憶の設計は、もともとは新しいコンピュータ・アーキテクチャの過渡期の実装を、全て固体素子の記憶装置を使って開発するために1960年代に考案された。これは、磁気ディスク装置は、そう遠くないうちに時代遅れになり、何らかの固体素子の記憶装置にとって代わられるであろうという予想にもとづいたものである（この予想は、わずかに半世紀ほどの誤差で、SSDにより徐々に現実のものとなりつつある）。System/38 と AS/400 （およびその後継システム）の単一レベル記憶の設計は、システムに現在利用している記憶装置の種類を意識させないものであった。 IBM が1980年代後半に AS/400 のシステムを販売する際、IBM の人々は「AS/400 は自分に磁気ディスク装置が付属していることを知らない」と述べた。