SSブログ

OS/2第4回仮想記憶(その1)(月刊ASCII 1988年5月号6) [月刊アスキー廃棄(スクラップ)]

連載「OS/2がやってきた」の第4回は「仮想記憶」だった。MS-DOSの知識程度しかない私はこの仮想記憶をワクワクして読んだ。80286という中途半端なCPUでもこんな高度なことができるのかと感心した。だが、「できる=可能である」ということと使い物になるということの間には大きな差があった。
記事をスクラップする。
ASCII1988(05)c01OS/2_W520.jpg
第4回「仮想記憶」
日進ソフトウェア(株)
矢部和博

 今回はMS-DOSとOS/2の決定的な違いの1つである「仮想記憶」について解説する。この仮想記憶によりOS/2は複数のアプリケーションを動かしても、お互いに干渉しあわず,かつ効率的な資源の共有が可能になっているのである。さらにOS自体をも保護し,プログラミング上のミスにより、全体が決定的なダメージを受けることのないようにしているのである.

 すでに,OS/2が,仮想記憶方式を採用したシングルユーザー・マルチタスクのO.S.(本連載では、OS/2と,一般的なオペレーティングシステムとの混同を避けるため,O.S.と表記する)であることは周知の事実となっている.
 このため、OS/2のプロテクトモードで動作するアプリケーションプログラムは,MS-DOS上では考慮する必要のなかった様々なプログラミングマナーを守る必要性が生まれる.その違いは,8086と80286マイクロプロセッサのアーキテクチャの違いに依存する部分が大きい.
 今回は,80286のメモリ管理機構のアーキテクチャと,そのメモリ管理機構を利用して実現されるOS/2の仮想記憶機能,および動的リンク機構を中心に解説し,プロテクトモードにおけるプログラミングマナーについて探ってみる.
 前回予告したにもかかわらず,今回の話題からは見送ることになった国別機能やかな漢字変換機能についてのレポートは、日本語OS/2の発表を機会に行いたいと思っている.
MS-DOSで動くプログラムを作っていたが、シングルタスクでさえ大きなデータを扱うプログラムではリアルモードのプログラムでもセグメントレジスタの扱いでバグを出しまくりでただただ苦労ばかりしていた。そんな段階で80286のプロテクトモードのプログラミングなんて一体自分はできるのだろうかと思っていた。もちろん、結局できなかった。
仮想記憶とは
 さて,今回はOS/2の中心的な機能のひとつである仮想記憶機能に関する解説を行うことになった.しかし,仮想記憶に関するすべての事柄を限られた誌面の中で網羅するのは不可能なため、より詳細な解説は専門書に譲ることにして,ここではOS/2に関するその基本的な事柄についてだけ述べることにした.
 まず,本題の最初として,それだけでは謎めいた「仮想記憶」なる熟語を定義しておく必要がある.
 仮想記憶とは,大規模な複数のプログラムを並列に,そして安全に実行するコンピュータシステムを構築するという要求に応えるために考案された「概念」を表す言葉であり,実際の記憶装置を指す言葉ではない.主記憶装置を効率よく管理するための「方式」を表す意味合いを持った言葉であるということになる.
 すなわち,マルチタスクシステムでは,同時に実行されるすべてのプログラムに対して適切な量の主記憶を平等に割り当てなければならないため,主記憶もディスク装置やコンソールと同様に,有限なシステムの資源として管理する必要がある.そのために考案されたのが,「仮想記憶方式」と呼ばれるメモリ管理技術なのである。
 この仮想記憶方式は,技術的には,プログラムが必要とするメモリ空間を次の3つの記憶装置上に配置することで実現される.

 ・仮想記憶装置
 ・実記憶装置(主記憶装置)
 ・二次記憶装置(ディスク装置)

 3つの記憶装置の関係を図1に示した.仮想記憶装置は,仮想記憶方式を実現するために,主記憶装置と二次記憶装置の2つの装置上に混在するプログラムやそのデータが,あたかも連続した空間上に存在するかのように見せかけるために考案された仮想的なメモリ空間のモデルである.このモデルそのものを仮想記憶と呼ぶ。
 それぞれの記憶装置について,もう少し明確に定義しておく.
【仮想記憶装置】
 仮想記憶装置とは,O.S.によって実現される仮想的(疑似的)な記憶装置のことで,アプリケーションプログラムはこきの記憶装置上に配置されて実行される.
 この仮想記憶装置は,主記憶装置の容量に左右されないアドレス空間を持ち,その容量は、CPUのアドレッシング可能範囲の最大値に等しいアプリケーションプログラムからは,あたかもこの仮想記憶装置上にデータやコードが連続して記憶されているように見えるが,そのとおりにデータが記録されているわけではなく,実際のデータは主記憶装置上と二次記憶装置上に置かれる.
 この仮想記憶装置の実体を説明することが,今回のメインテーマのひとつでもある。
【実記憶装置】
 従来の主記憶装置のことを仮想記憶装置と区別する場合には「実記憶装置」と呼ぶ.仮想記憶装置上に記憶されたデータを実際に記録し,アクセスするために用いられる。
 しかし,主記憶よりもはるかに大きな仮想記憶装置上のデータをすべて記録できるわけではなく,仮想記憶装置上で実行されているプログラムの,その時点で最も必要なデータのみが置かれることになる。
【二次記憶装置】
 主記憶に格納できなかった仮想記憶装置上のデータを記録するための記憶装置が二次記憶装置である.二次記憶装置には,高速なディスク装置が使用されることが多い.
 具体的には、実行形式ファイル(OS/2では,".EXE"ファイル)のコードセグメント部分とスワップファイルと呼ばれる主記憶上のデータを退避するための単なるファイルである.
 すなわち,仮想記憶方式とは,プログラムを実行するためのメモリ空間(仮想記憶装置)と実際の主記憶装置を分離して考え,プログラムがメモリを必要としたときに,適当なサイズの主記憶をその仮想記憶装置上のアドレス空間に割り当てることを可能にする主記憶の管理方式のことである。
 言い替えれば、仮想記憶方式では、プログラムのすべてが主記憶上に存在する必要はなく,現在実行されているごく一部のプログラムコード領域(テキスト領域,コードセグメント)と,そのプログラムコードが参照しているごく一部のデータ領域(データセグメント)が,主記憶に常駐していればよいことになる.なぜなら、プログラムとは数ワード(バイト)の命令の集合として構成されており,ある一瞬に必要となるのはこのたかだか数ワードさえアクセスできればいいのであり、実用的な面から言えば、たかだか1つのルーチンあるいは関数があればよいからである(プログラムの局所性).
 そこで,その瞬間には必要のない部分は,再び必要になるまでディスクなどの外部記憶装置(二次記憶装置)に保存しておく。こうすることによって,主記憶よりもはるかに大きなプログラムを実行することが可能になる.仮想記憶方式の最大の特徴は,実行するプログラムのサイズが主記憶容量の制限を受けない点に ある。
 そして,マルチタスクシステムにおいては,仮想記憶装置が並列に実行されるプログラム(タスク:OS/2では,プロセス)の数だけ存在することになる.実行するプログラムの実行環境を仮想記憶装置ごとに独立させることにより,実行中のプログラムが不注意で巻き起こすメモリ破壊などの予期せぬ悪影響から,別のプログラムを保護して,並列に動作する個々のプログラムの安全性が確保されるわけである.
このように,仮想記憶装置により,各プログラムに与えられるメモリ空間のことを「仮想空間」と言うそして,仮想記憶装置を実現するシステムのことを「仮想記憶システム」と呼ぶ.また,仮想記憶装置を実現するためのO.S.の機能を「仮想記憶機能」という(注1).
 OS/2の仮想記憶機能は,最大主記憶容量16Mbytes(最低1.5Mbytes)を使用して,同時に実行されるアプリケーションプログラムごとに,最大1Gbytes(1ギガバイト=1億バイト)の広大な仮想空間を提供する.
 また,80286が実現する保護機能により,アプリケーションプログラムは,同時に実行される他のプログラムの存在を知る必要もなく、他のプログラムの干渉を一切受けずに,自分の処理に専念できる環境が与えられる.
 必要なら定められた方法によって,複数の仮想記憶装置間でデータを共用することもできる(共用メモリ).また,別々の仮想記憶装置上で実行されている他のプログラムと会話することもできる(プロセス間通信)

注1
「仮想記憶機能」

 仮想記憶システムでは,この仮想空間とプログラムの実行単位であるタスク(プロセス)を1対1に対応付けて考えることができる.
 すなわち,タスクとは実行されるアプリケーションプログラムそのもののことではなく,あくまでも,そのプログラムを実行するために与えられる仮想空間を含むシステムの環境のことを指している.
 したがって,実行中のタスク数とアプリケーションプログラムの数は等しくならない、仮想記憶システムでは,複数のタスクが主記憶装置上の同じプログラムコピーを,異なる仮想記憶装置上で共用することが可能になるためである。
 このタスク(仮想記憶装置)とアプリケーョンプログラムの関係は,マルチユーザー・マルチタスクの機能を実現するシステムを考えると理解しやすい。その代表的なものに,大規模なパソコンネットのセンターに設置されるホストシステムがある
 パソコンネットのホストシステムは,同時にログインしている多くのメンバーに同一のサービスを提供する.このとき個々のメンバーは、そのサービスを実現するプログラムと会話していることになる.そして、各メンバーが会話しているプログラムは、当然同じプログラムである.
 しかし,そのプログラムが処理するデータ(例えば、アクセスしている電子掲示板)は,メンバーごとに異なったものである。
 このとき,同時に同じサービスを受けている個々のメンバーと1対1で対応するのがタスクであり,そのタスクに割り付けられた仮想記憶装置である。
 それぞれの仮想記憶装置は,同一のプログラムコードと異なるデータセグメントからなる仮想空間を持つ。、すなわち,メンバーは、システム内に存在する1つの仮想記憶装置を占有し,タスクとして実行されるアプリケーションプログラムが提供する特定のサービスを受けていることになる.

ASCII1988(05)c02OS/2_図1_W717.jpg
ここまで読んで80286でこれは速度的にきついだろうと思った。よくもまあMSとIBMは80286でこれを開発したものだ。ユーザはパソコンの前でどのくらい黙って待つと思っていたのか。10秒いや5秒反応しなければ暴走してると思いリセットボタンを押されるとは思っていなかったのだろうか。
「仮想記憶の代償
 アプリケーションプログラムは,それ」,ぞれ独立した仮想空間によって,これらの優れた環境が提供される代わりに,仮想空間上で動作するための様々なプログラミングマナーに従わなければならない.マナーに違反したプログラムは,OS/2の監視機能(保護機能)によってシステムから弾き出されてしまう.すなわち,異常終了させられることになる.
 それら数多くのマナーは,同時には1個のプログラムしか走行しないシングルタスクのシステムと,複数のプログラムが並列に走行するマルチタスクのシステムにおける考え方の違いがそのまま反映されている.
 たとえば,シングルタスクであるMS-DOSのもとで実行されるプログラムは,ひとつのアプリケーションプログラムがシステムのすべての資源を占有できるため,その自由度は大きい.高速化のためには,他のすべてのものを犠牲にすることも許される.その気になれば,O.S.であるMS-DOSを介することなく、すべてのシステム資源に直接アクセスすることも可能である.
 一方,複数のプログラムが同時に動作するマルチタスク環境では,システムの「安全性が最優先される.あるプログラムが他のプログラムに影響を与えることがあってはならないのである.そのため,システム資源へのアクセスは,すべてシステム管理者であるO.S.を介して行わなければならなくなる.こうして、OS/2においても,MS-DOSでは考慮する必要のなかった制約が生まれてくる.アプリケーションプログラムは、実記憶をすべて占有して処理することはできないし、ビデオRAMに直接アクセスすることや,割り込みベクトルを横取りすることもできない.また,入出力ポートなどのハードウェアを直接操作することもできない.OS/2のアプリケーションプログラムは,他のプログラムとの「共同生活」のために必要となるあらゆる「行儀の良さ」を身につけなければならないのである.
 そのかわり,MS-DOS上で行われていた「行儀の悪い行為」は,OS/2が提供する豊富なファンクションコール(API)を使用して,すべて実現できるようになっている。

注2
「仮想アドレス」

 8086で使用されるアドレスも,厳密な意味においては,セグメントレジスタとオフセットレ「ジスタを合成したものが物理アドレスになるため,実際のメモリアクセスにおいてそのまま使用することはできないことから仮想アドレスであると言える。
 しかし,仮想記憶装置の概念を持たないため,仮想記憶システムにおける仮想アドレスとは根本的に異なる.|強いて言えば,8086では仮想アドレスが物理アドレスと1対1になるアドレス変換を行っていることになる.
考え方は実に素晴らしいがハードウエアが足を引っ張っている。速度的に快適なプログラムを作るには80286にOS/2では無理だった。MS-DOSでガンガン絶対アドレスにデータを書き込む必要があった。とにかく「速度が遅く足を引っ張るしかないOSは引っ込んでろ。俺にすべての資源を渡せ!」という感じのコンピュータ環境だった。
動的アドレス変換のメカニズム
 仮想記憶方式における動的アドレス変換の位置づけ(働き)がわかったところで,80286が主記憶にアクセスするために,仮想アドレスから目的の物理アドレスを生成するアドレス変換の基本的なメカニズムを明らかにしよう.80286のアドレス変換のメカニズムは図2のようになっている.この図から,実際の主記憶にアクセスするために行うアドレス変換には,以下のような情報が必要であることがわかる.
 (1) 7セグメントセレクタ
 (2) オフセット値
 (3) セグメントディスクリプタ
 (1) のセグメントセレクタは,セグメントレジスタなどに保持される値である.同様に(2)は,オフセットレジスタに設定されている値のことである.(3)のセグメントディスクリプタは,プロテクトモードで初めて採用されたもので,このセグメントディスクリプタの中には,セグメントの属性や主記憶上におけるセグメントのアドレスが収められている(図3).
 これらの情報から目的の物理アドレスは,セグメントレジスタのポイントするセグメントディスクリプタ上のセグメント・ベース・アドレスにオフセット値を,単純に加算すれば得られる.
 すなわち,この動的アドレス変換の原理を利用すると,主記憶上のすべてのセグメントは、セグメントディスクリプタをセグメントの数だけ連続に配置することで管理できるようになる.そして,このセグメントディスクリプタの配列数を,主記憶のセグメント数より多くすれば,主記憶装置の容量を超えた数のセグメントを定義することが可能になる.
 このようにして作られるセグメントデニィスクリプタの配列のことを,「ディスクリプタテーブル」(注3)という(実は、このディスクリプタテーブルが仮想記憶装置の実体である).
 セグメントレジスタには,このディスクリプタテーブルの中に配置されたセグメントディスクリプタのエントリ番号が格納される.80286に正常なアドレス変換を行わせるためには,このセグメントディスクリプタの情報を,OS/2が設定しなければならないのである.
 OS/2の仮想記憶とは,80286の動的アドレス変換機構(ハードウェア)と,OS/2の処理(ソフトウェア)が密接に係わりあって実現されるものであると言えるだろう.
 また,図2はもうひとつの,プロテクトモードでのプログラミングマナーについての重要な事柄を示唆している.それは,セグメントレジスタの内容が,8086の場合と異なっていることである.

注3
「ディスクリプタテーブル」

 ひとつのディスクリプタテーブルで,8192個のセグメントを定義(ポイント)することができる.このディスクリプタテーブルを,同時に実行されるタスク(プロセス)ごとに用意すると,それぞれに独立した仮想空間を生成することが可能となる。
 このように,タスクごとにそのタスクの持つメモリセグメントを定義するために用意されるディスクリプタテーブルを、「ローカル・ディスクリプタ・テーブル(LDT)」と呼ぶ.
 また,複数のタスクから同時に参照(共用)することを可能にする共用メモリセグメントは、「グローバル・ディスクリプタ・テーブル(GDT)」によって作成される.タスクごとに複数個作成されるLDTに比べて,GDTはシステムに唯一個しかない。
 この2つのテーブルの位置は、それぞれ,LDTRとGDTRという各レジスタにアドレスが保持されている。すなわち,システム空間を管理するGDTと,タスクの持つアプリケーション固有のセグメントを管理するLDT,そして,それらの2つのテーブルをポイントする各レジスタ(GDTR,LDTR各セグメントレジスタ,そして、割り込みベクトルテーブルをポイントするIDTR)が,仮想記憶装置の実体である.
 仮想記憶装置のひとつであるLDTRとGDTRなどを操作する命令は,高い特権レベルを持ったプログラム(すなわち,OS/2)のみが実行可・能な命令(特権命令)であるため、アプリケーションブログラムからは仮想空間の切り替えなどの仮想記憶装置を制御することはできない.
 すなわち,各アプリケーションプログラムは,それぞれの仮想記憶装置(仮想空間)上で独立となる。

ASCII1988(05)c05OS/2_図3_W737.jpg
今回のスクラップはここまで。以下次回。

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。