「オペレーティングシステムとは何か」の版間の差分

提供: UnixClassWiki
移動先: 案内検索
(何をさしてオペレーティングシステムと呼ぶのか)
(コンピュータを仮想化させる)
363行目: 363行目:
  
 
==  コンピュータを仮想化させる ==  
 
==  コンピュータを仮想化させる ==  
 +
[[File:Virtualization.png|thumb|right|450px|Virtualization]]
 +
我々が、アプリケーションプログラムを使う時、プログラムがコンピュータを占有しているように見えます。ユーザが他にどれだけのプログラムが実行されているかなど気にすることなく使うことができます。
  
我々が、アプリケーションプログラムを使う時、プログラムがコンピュータ
+
実際は、オペレーティングシステムが、リソースを抽象化し、プログラムに使えるリソースを割り当てることをします。つまり、プログラムは、「仮想化されたコンピュータ」を割り当てられることになります。ユーザに使用許可(パーミッション)が与えられている限り利用することが可能です。
を占有しているように見えます。
+
  
実際は、オペレーティングシステムが、リソースを抽象化し、プログラムに
+
UNIXでは、どのような仮想化の例があるのでしょうか? 典型的な例をいくつかあげて見ましょう。
使えるリソースを割り当てることをします。つまり、プログラムは、「仮想化
+
されたコンピュータ」を割り当てられることになります。
+
 
+
UNIXでは、どのような仮想化の例があるのでしょうか? 典型的な例をいくつ
+
かあげて見ましょう。
+
  
 
* CPUのリソースは、プログラムに対し、プロセスという単位で割り当てられます。
 
* CPUのリソースは、プログラムに対し、プロセスという単位で割り当てられます。
382行目: 378行目:
 
* 入出力装置のリソースのために、デバイスファイルという入出力装置を抽象化した入出力リソースを提供しています。
 
* 入出力装置のリソースのために、デバイスファイルという入出力装置を抽象化した入出力リソースを提供しています。
  
<PRE>
 
プログラムA --- 仮想的なコンピュータ
 
[プロセス(CPUの抽象化),
 
仮想記憶(主記憶装置の抽象化),
 
ファイル(補助記憶装置の抽象化),
 
デバイスファイル(入出力装置の抽象化)
 
                        etc.]
 
プログラムB --- 仮想的なコンピュータ
 
[プロセス(CPUの抽象化),
 
仮想記憶(主記憶装置の抽象化),
 
ファイル(補助記憶装置の抽象化),
 
デバイスファイル(入出力装置の抽象化)
 
                        etc.]
 
プログラムC ....
 
プログラムD ....
 
プログラムE ....
 
</PRE>
 
 
   
 
   
 
:'''捕捉''' さらに
 
:'''捕捉''' さらに

2011年10月6日 (木) 13:51時点における版

オペレーティングシステムとは何か

オペレーティングシステムの再確認

オペレーティングシステムとは何かを基本に戻って再確認してみましょう。 オペレーティングシステム( Operating System )を短く説明すれば、文字通りコンピュータを操作してゆく (Operating/オペレーティング) 体系 (System/システム) です。


オペレーティングシステムの役目は次の3つの目標を達成するためにリソース (Resources : 資源 ) と、 アプリケーション ( Applications : ユーザが使うソフトウェア ) の間に存在し両者を結び付けるための糊の役目をするソフトウェア群であるといえます。


  • リソースを効率的に利用する
  • アプリケーションが直接リソースを制御する必要をなくする
  • アプリケーションにとってリソースをさらに抽象化する



リソースとは

リソースとは、コンピュータ上にある、処理を行なう際に必要となる資源を意味する概念的なものです。 リソースとしてハードウェアリソースとソフトウェアリソースの2つはすぐに思い浮かぶでしょう。 さらに一歩踏み込んでオペレーティングシステムはコストをより少なくするための道具と考えるならば、 利用者や運用者などを指してヒューマンリソースとしリソースの中に含める必要が出てきます。


つまりハードウェアリソース、ソフトウェアリソース、ヒューマンリソースを有効に使うための役割がオペレーティングシステムには求められます。


捕捉 
一口にコストといってもいろいろな場面でのコストがあります。また数値に現れるコストだけではなく、数値に現れにくく把握するのが難しいコストもあります。


以下に色々なリソースについて考えてみましょう。


ハードウェアリソース

  • CPU
  • 主記憶装置
  • 補助記憶装置
  • 入出力装置
  • etc.


CPU

CPU( Central Processing Unit : 中央演算処理装置 ) : 命令を実行し、演算を行なうユニット部分です。少し前までは、CPUの説明といえば、プロセッサチップを示せば終だったのですが、最近の高性能のプロセッサチップは、少々複雑になっています。現在のプロセッサチップは、キャッシュ記憶ユニットという高速に記憶を取り込むための、短期間だけ記憶を保持しているような記憶装置も内蔵しています。それ以外にも多くの機能を詰め込んでいます。そこまで分割していくと話が混乱しますので、ここでのCPU はプロセッサチップという具体的な製品ではなく、命令を実行し演算を行なうユニットという抽象的な役割部分だと理解してください。以降、他のCPU説明でも同じです。


主記憶装置

主記憶装置 ( Main Memory Unit ) : いわゆるメモリのことです。 CPUと直接やりとりする記憶装置を指します。 演算のための値を記憶しておく、結果を記憶しておく、命令を記憶しておくなどといったために使われます。 以前は、単純にCPU ←→主メモリという構造で説明が十分だったのですが、現在での具体的な物理メモリの構成は、いくつかの階層にわかれていて、CPUと記憶をやりとりしています。 わりきって一言でいうなら電気を切ったら消えてしまう一時的な記憶装置です。


補助記憶装置

補助記憶装置 ( Auxiliary Memory Unit ) : ハードディスクや磁気テープのような装置のことです。 現在ではコンパクトフラッシュメモリやUSBメモリなどもこのような区分けに入ってきます。 主記憶装置との違いは、CPUと直接記憶のやりとりを行なわないこと、記憶の容量が大きいこと、長期間記憶 (割り切って言えば電気を切っても消えない記憶) を保持するユニットです。


入出力装置

入出力装置 ( Input/Output Unit ) : キーボード、マウス、ディスプレイといったものや、シリアルポートやパラレルポート、またあるいはネットワークボードといったものなどのがあげられます。


調べてみよう 
ハードウェアリソースを構成するものとしてこの他に、どんなものがあるだろうか。


ソフトウェアリソース

ソフトウェアは、そのコンピュータ上で動くソフトウェアで共有し利用するようなデータ、ライブラリ、プログラムを意味します。


たとえばオペレーティングシステムの心臓部であるカーネル部分、アプリケーションが使うライブラリ、あるいはシステムを運用する上で必要なコマンド群などなどがあげられます。どのソフトウェアどんな役割を担うのかの議論は後程しましょう。


ヒューマンリソース

人的なリソースです。コンピュータが非常に高価だった頃は、その利用のために人を雇うコストの方が小さいファクタだったため、あまり大きな関心は寄せられていませんでした。 昔の汎用機時代においては、人的コストよりもハードウェアのコストの方がはるかに高く、そのため人間が便利に使えるよりも、まずハードウェアを最も効率よく使うにはどうするべきかを優先していたのです。 高性能のコンピュータがコモディティ(日用品)化してしまっている現在では、人的なリソースの方が高価です。人的リソースの効率的利用できるようにすることもオペレーティングシステムには求められています。このように時代の流れでハードウェアのコストが下がるにつれ、人的コストの比率が相対的にあがってきます。このような状況では、今度は人的コストを如何に下げるかが今日の課題となっています。


調べてみよう 
人的なコストを低減するためにどのような工夫がなされているのだろうか。


オペレーティングシステムの潮流

最近は、どんどんハードウェアが高性能になっていきます。 例えば、デスクトップコンピュータ、いわゆるパソコンと呼ばれる機械の上位機種の計算スピードは、私がこの業界に入った1980 年半ばのスーパーコンピュータ並、あるいはそれ以上の性能をたたき出しています。


1990年当時から比較しても、エンジニアリングワークステーションと呼ばれていた数百万から一千万円くらいの価格だったコンピュータシステムよりも遥かに高速です。


当然、そうなってくると、高性能なハードウェアを効率よく動かす、かつハードウェアの能力を引き出すために、かつて高価なコンピュータで使われたいたオペレーティングシステムのテクノロジーが必要になってきます。かくして、身近に高性能なオペレーティングシステム が使われるようになります。


現在のオペレーティングシステムへ向かう2つの流れ

現在のハードウェアとオペレーティングシステムの関係をハードウェアの歴史の変遷を踏まえて考えてみます。みなさんが使っているデスクトップのコンピュータに至る流れには2つの流れがあります。

下から上への流れ

小さいものから、大きなものへ変化した様子を見てみましょう。 1971年に世界初のマイクロプロセッサIntel 4004 が出来てから、パーソナルコンピュータが作られ、どんどん性能が良くなってきた流れです。パーソナルコンピュータ、いわゆるパソコンは初めは玩具のようなものでした。


1975年に発売された世界初のパソコンMITS Altair 8080はIntel 8080 250Khz を搭載しメモリは256byteでした。キーボードもモニターも当然ながらハードディスクなどありません。プログラムはフロントパネルからスイッチを操作し、バイナリーのマシン語を入力します。


1976年ぐらいになると、Apple、Sol、Altairといった最も初期の頃のパソコンが作られてきます。この頃、Bill GatesとPaul AllenはAltair 8080 (メモリ4KByte版)用に大型汎用機上で動いていたBASIC言語を移植しMITSへライセンスします。翌、1977年にはSteve WozniakとSteve JobsがApple Corporationを設立し、また同じくしてBill Gates とPaul Allenは正式にMicrosoft companyを設立します。


Apple や Sol や Altairのような初期のパソコンが作られます。下がスミソニアン博物館にある世界初のパソコンの写真です(著者撮影)。

Homebrew computer club
Apple
Sol
Altair


1984年にIBMがIBM PCを販売開始した時が、今日のパーソナルコンピュータ隆盛の時代の本格的な幕開けだったといえるでしょう。


初期の頃のパソコンにはオペレーティングシステムがありませんでした。次にCP/MやMS-DOSといった 低レベルな機能しか持たない原始的なオペレーティングシステムが現われます。


補足
機能が不十分なため厳密にはオペレーティングシステムとは呼べずモニターと呼ぶべきものだと筆者は考えます。


調べてみよう
オペレーティングシステムの前段階ともいえるモニターとはなんだろうか。


これはハードウェアの能力が極めて限られているので、大型汎用機のような機能を望むべくもなく、低レベルな機能しか持たざる得ないという限界があります。1990年代ともなると、高速なCPU、大容量のメモリー、大容量のハードディスクなどハードウェアの能力は格段に上がります。


しかし、一方で、そのハードウェア上で動かしているソフトウェアのシステム構造は古い頃から手直し、手直ししてアップグレードしてきたものです。さらにパーソナルな環境ではなく、ネットワークに繋がれ、さらにはインターネットに繋がれるまでになると、玩具の箱から個人のツールとして発展してきた単純なパーソナルコンピュータのモデルではいずれ限界が来てしまいます。


このように下から上へ向かうトレンドが、まず1つあります。


上から下への流れ

コンピュータが作られた時から、今日のパーソナルコンピュータが隆盛を究めるまでに至まで常にコンピュータのハードウェアは高価なものでした。 1960年当時初期までは、コンピュータはプログラムを走らせるために特別なセットアップが必要で、色々なプログラムを走らせることが困難でした。 高価なハードウェア上でもっと汎用的にプログラムを動かすために作られたシステムが1964年に作られたIBM S/360です。ここで始めて今日的なオペレーティングシステムが作られます。 汎用機という言葉は、この「汎用的にプログラムを動かすことができるシステム」という所から来ています。


時代は流れ大型汎用機もダウンサイジングの並に流されます。 まず最初のダウンサイジングで成功したのはDEC社の科学技術計算用コンピュータPDPシリーズやVAXシリーズです。 これらはミニコンと呼ばれました。これは1970年代後半から80年代後期まで成功を納めます。 さらに時代は進み、今度はワークステーションの出現です。 90年代に入るとDEC社のVAXが、SUN MicrosystemsのSUN ワークステーションに置き換わることになります。 そのダウンサイジングに大きな役目を果たしたのがUNIXです。 UNIXはワークステーションからスーパコンピュータまであらゆるサイズのコンピュータ上で使えるようになっていました。 別の言い方をすれば、ワークステーションからスーパーコンピュータでも十分に満足できる今日的オペレーティングシステムの機能をUNIXは兼ね備えているというわけです。 しかし、まだ業務や科学技術計算で使うコンピュータと、パーソナルで使うコンピュータには価格的にも性能的にも大きな隔たりがありました。


90年代後半になるとIA-32 (Intel Architecture --- 32bit)のハードウェアに席捲されます。2000年以降は、ダウンサイジングの到着点です。もう個人で使うパーソナルコンピュータも、業務や科学技術計算で使うものも、ハードウェア的には価格的にも、使われている技術にも、処理能力にも線引きが出来できません。


2005年では、64bit CPU、デュアルプロセッサ対応、デュアルコアCPUといった最先端のテクノロジーがコモディティ市場 (一般消費者向け市場) に売られている時代になりました。この傾向はこれから先も続きます。


考えてみよう 
ムーアの法則には限界があるのか、ないのか。あるとしたらなぜなのか。ないならばなぜなのか。尚、ムーアの法則の意味は、オリジナルの意味である集積度の向上と、派生的に多く使われている性能の向上のどちらの意味で取ってもよい。


2007年現在の状況

下から上がって来た流れと、上から下がってきた流れがぶつかり、しかもそれがうまく融合していない状態が続いていたという状況で、やっと今は、下からの流れを捨てつつ、上からの流れに追いついたといえるでしょう。


下からの流れがいちばん判りやすいのがMicrosoft社のセキュリティの問題です。 その主力製品であるWindowsは1つはWindows 95/98/Meという流れがあり、もう1つはWindows NT/2000/XPという流れがあります。 前者は、パーソナルコンピュータの流れ、後者は大型汎用機の流れです。ちなみにWindows NTを設計したのはDEC でVMSの開発をしていて、Microsoft社にヘッドハンティングされたデビット・カトラーです。


上から下がっていたオペレーティングシステムの体系に、下から上がってきたアプリケーション体系を合わせようとしても、なかなかうまくいきません。


パーソナルコンピュータでは、使っているのは一人なわけですから、なんでもオールマイティーにアクセスしても一見問題はないように見えます。一方で大きなコンピュータは一人で使っていては、あまりにも高価なので、多人数で使えるなければなりませんし、そうなれば勝手に他人のファイルや、ましてや勝手にシステムの運用に関わる設定など変えてはいけません。


なんでもアクセスできてしまうパーソナルコンピュータのソフトウェアの方がシンプルかつ簡便な操作を提供できる...と考えても不思議ではありません。 しかし、便利であったはずの「なんでもアクセスできる」というのがセキュリティの面、特にコンピュータウィルスや脆弱性をついてのシステムへの侵入などクリティカルな問題へ結びつき、それが時代とともに表面化してきました。


上からと下からの矛盾が現在のWindowsの根本的な問題となっていました。 Windows Vista以降では完全にユーザ権限を分離した管理体系による高いセキュリティを持つという能力を提供しています。 ですが、Windows XP まで動いていたアプリケーションやドライバー類が動かずデベロッパーやユーザが不満を漏らしていたという状況も一方ではありました。


このように必要な安全性を達成するには、下から上へ上がってきたようなレガシーなソフトウェアを切り捨てなければ困難こです。しかし、一方で膨大なソフトウェア資産があるわけです。この矛盾に終止符を打つのは大変長い時間がかかります。


調べてみよう 
1980年代のスーパーコンピュータやパソコンと呼ばれていたコンピュータの処理能力は、どの程度のものだったのだろうか。その能力の向上はどうだったのだろうか。

何をさしてオペレーティングシステムと呼ぶのか

System Layer

コンピュータ上で動いているソフトウェアのどの部分を指してオペレー ティングシステムと呼ぶべきないのか、ということの定義を確認しましょう。


ここでは、一番最下層をハードウェアとして、次にあるのがカーネルの層、そ の次が汎用に使われるシステムユーティリティの層、そして、特定目的のため にユーザが利用するアプリケーションの層と分けてみます。


オペレーティングシステムと、システムユーティリティの両方を1つのまとま りとして、システムソフトウェアと呼びます。「システムを動かすのに最低限 必要なソフトウェアセット」という広い意味で捉えたオペレーティングシステ ムであれば、このシステムソフトウェアがオペレーティングシステムと同意語 であると言えます。


しかし「最小限必要な」という定義は、かなり曖昧な表現です。なぜならば、 ここには「誰が、どのように使うか」ということが抜けているからです。この 部分を拡張していけば、たとえば「ワードブロセッシングを行いたい人が使う ためのコンピュータ」という場合は「バンドルされているワードプロセッサの プログラムも含めてオペレーティングシステムである」という奇妙な結論が導 かれてしまいます。


しかしながら、「パッケージを購入した時にバンドルされているものが最小限のセットであるので、これがオペレーティングシステムである」という誤解 [1] は一般には多いようです。 しかし、これではゲームのソリティアもオペレーティングシステムに含まれることになるので、やはり奇妙な結論と言えます。


では逆に、ここは確実にオペレーティングシステムだろうと言える部分を考えてみます。まずカーネルは当然入ります。ユーザが使うということであれば、 シェルなども必要です。なぜならシェルがないとコマンドを入力できません。当然ユーザを認証するためのログインに関連するソフトウェアが必要です。


補足 
カーネルとそれ以外のソフトウェアの切り分けは、実行されるプロセスの実行モードが、どの状態で動いているかで区別します。プロセスの実行モードが、カーネル・モード(UNIX以外のシステムによっては特権モード、スーパーバイザ・モード、あるいはマスタ・モードとも呼ばれる) で動作しているか、ユーザ・モード ( 非特権モード、プロブレム・モード、あるいはスレーブモードとも呼ばれる)で動作しているかどうかです。実行モードに関しては、実行とプロセスに関する話題の時に改めて説明します。


どれくらいのものが最初に用意されるのか、Debian GNU/Linux Woodyを例にして調べてみました。

 ディレクトリ名      コマンド数
 /bin              74
 /sbin             105 
 /usr/bin          275
 /usr/sbin         112
補足 
2007年ではDebian GNU/Linux Etchが最新です。

このコマンド数も先に述べたようにすべてが必要であるとは限りません。最小 限インストールの状態のDebian GNU/Linuxに入っているコマンド数を数えたに 過ぎません。しかしながら、いくつかのコマンドとそのコマンドで利用される ライブラリ群はオペレーティングシステムには必要になるといえます。


では、グラフィカルインタフェース(GUI)を提供するためのウィンドウシステ ムはオペレーティングシステムに入るのでしょうか?


一般的なUNIXシステムでは、GUIがなくても当然動きますし、サーバシステム ではGUIなどは必須ではありません。もちろん先程のDebian GNU/Linux最小限 セットの中にはX Window Systemは入っていません。逆にパーソナルコンピュー タ用のオペレーティングシステムと呼ばれるものではウィンドウシステムは 切り離すことができないコンポーネントとなっています。


ここまででわかったことは、まず、カーネルは確実にオペレーティングシステ ムであること、そして、システムを動かす時に必要なソフトウェアがいくつか あること、ただし、その必要なソフトウェアは何かの線引きは難しいというこ とです。


下はDebian GNU/Linux (Woody) を最小限のインストールして立ち上げてみた 状態です。topコマンドを使い、メモリや実行中のプロセスが、どのような状 態になっているか観察したものです。用意しているメモリは32MBですが、この 状態で使われている記憶領域は約7.8MBしか使っていません。dfを使ってディ スクの利用状況を見てみると、約536MBのハードディスクを用意していますが (フォーマット後の要領約500MB) 、最小のインストールでは約80MBしか使って いません。最小限のセットを考えた場合、かなり小さくて済みます。一方、ど んどんその適用範囲を広げていった場合、どこまでがオペレーティングシステ ムと呼んでいいのか、どこからがそれ以外のアプリケーションと呼ぶかのはグ ラデーションのように曖昧になることでしょう。


 # top
 04:09:46 up 0 min,  1 user,  load average: 0.00, 0.00, 0.00
 18 processes: 17 sleeping, 1 running, 0 zombie, 0 stopped
 CPU states:   0.0% user,   0.0% system,   0.0% nice,  100.0% idle
 Mem:     32244K total,     7844K used,    24400K free,      644K buffers
 Swap:        0K total,        0K used,        0K free,     4028K cached
  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
    1 root       8   0   484  484   424 S     0.0  1.5   0:00 init
    2 root      -2   0     0    0     0 SW    0.0  0.0   0:00 keventd
    3 root      18  19     0    0     0 SWN   0.0  0.0   0:00 ksoftirqd_CPU0
    4 root      -2   0     0    0     0 SW    0.0  0.0   0:00 kswapd
    5 root      -2   0     0    0     0 SW    0.0  0.0   0:00 bdflush
    6 root      -2   0     0    0     0 SW    0.0  0.0   0:00 kupdated
  129 root       0   0   656  656   540 S     0.0  2.0   0:00 syslogd
  132 root       0   0   500  500   380 S     0.0  1.5   0:00 klogd
  140 root       2   0   508  508   444 S     0.0  1.5   0:00 inetd
  161 daemon     2   0   580  580   504 S     0.0  1.7   0:00 atd
  164 root       2   0   684  684   564 S     0.0  2.1   0:00 cron
  167 root       0   0   468  468   408 S     0.0  1.4   0:00 getty
  168 root       2   0   468  468   408 S     0.0  1.4   0:00 getty
  169 root       2   0   468  468   408 S     0.0  1.4   0:00 getty
  170 root       2   0   468  468   408 S     0.0  1.4   0:00 getty
  171 root       6   0   468  468   408 S     0.0  1.4   0:00 getty
  172 root       8   0  1208 1208   992 S     0.0  3.7   0:00 bash
  174 root      14   0   924  924   748 R     0.0  2.8   0:00 top
 # df
 Filesystem           1k-blocks      Used Available Use% Mounted on
 /dev/ubd0               507748     80252    401282  17% /

コンピュータを仮想化させる

Virtualization

我々が、アプリケーションプログラムを使う時、プログラムがコンピュータを占有しているように見えます。ユーザが他にどれだけのプログラムが実行されているかなど気にすることなく使うことができます。

実際は、オペレーティングシステムが、リソースを抽象化し、プログラムに使えるリソースを割り当てることをします。つまり、プログラムは、「仮想化されたコンピュータ」を割り当てられることになります。ユーザに使用許可(パーミッション)が与えられている限り利用することが可能です。

UNIXでは、どのような仮想化の例があるのでしょうか? 典型的な例をいくつかあげて見ましょう。

  • CPUのリソースは、プログラムに対し、プロセスという単位で割り当てられます。
  • プログラムの使う記憶空間のリソースは、仮想記憶によりコントロールされます。仮想記憶の機構により、主記憶だけではなく、補助記憶装置も使って、主記憶よりも大きい記憶空間を作ることが可能です。その中から、プログラムが必要な大きさの記憶空間リソースを割り当ています。
  • 永続的な記憶を保管しておくために、ファイルという抽象的なデータの保管メカニズムを使います。そのファイルを効率的かつ統一的に扱うために、ファイルシステムを作ります。ファイルシステムは、主記憶と補助記憶装置を使って、ファイルのリソースを提供します。
  • 入出力装置のリソースのために、デバイスファイルという入出力装置を抽象化した入出力リソースを提供しています。


捕捉 さらに
[Xen]や[VMware]のようにハードウェア側を抽象化し、1つのハードウェア上に複数のオペレーティングシステムを動かすバーチャルマシンのシステムもあります。


抽象化の例

UNIXの上で次のコマンドを実行すると端末にHelloと表示されます。これは文 字列"Hello"を出力し、その出力先を ファイル/dev/tty への入力するという 働きをします。ファイル(デバイスファイルと呼びます)/dev/ttyというのは、 端末を抽象化したものです。

 % echo "Hello" > /dev/tty
 Hello

上の図で、プログラムA、B,....E、は、オペレーティングシステムから利用可 能なリソースを割り当てられ、その中で実行しています。しかし、アプリケー ションA、B,....は、割り当てられたリソースのコントロールを意識しません。 例えば、プログラムがデータを補助記憶装置にファイルの形でデータを残そう とした時、プログラムが、補助記憶装置に使われているハードウェアを直接的 にコントロールする必要はありません。

つまり、1つのプログラムは、1つの仮想化されたコンピュータで動いているよ うに見えるわけです。

不完全なリソース管理

もし、直接的にコントロールするはずのないリソースをユーザのアプリケーショ ンプログラムがオペレーティングシステムを飛び越して直接的にコントロール できるようなことがあればどうなるのでしょうか?


例えば、ユーザのアプリケーションプログラムにバグがあり、割り当てられた リソース以外のリソースを不用意に利用してしまうようなことを許すような不 完全なリソース管理のオペレーティングシステムだとどうなるでしょうか?


上の図で、プログラムA、B,....は、オペレーティングシステムから割り当て られたリソースを使っているわけですから、オペレーティングシステムの知ら ない所で、割り当てられていないリソースに勝手なことをされては、一貫性が 保てません。


つい最近までパソコンのオペレーティングシステムは、このような不完全なリ ソース管理の能力しか持っていませんでした(そもそも、オペレーティングシ ステムと呼ぶに値するのか、本来はモニタと分類すべきものではないのか、という疑問がありますが)。

さらなる仮想化の例

mmapとファイル

例えば、UNIXのMMAPと呼ぶ機能です。最近のUNIXは、mmapという機能を使ってプログラムは、 ファイルを記憶空間に張り付ける (マップする) ことができます。 主記憶、補助記憶装置のリソース区別が更に抽象化されプログラムの中で使える記憶空間としてのリソースとなります。 もちろん通常のプログラムに割り当てられた記憶領域として、読み込み、書き込みすると、その内容がファイルに反映されます。 さらに、ファイルという形で、複数のプロセスから、共有することができます。


VFSからデバイスドライバまで

ファイルシステムをさらに抽象化するLinuxのファイルシステムを紹介しましょう。 Linuxのファイルシステムは、上位にVFS (Virtual File System)が存在し、その下に、またMinix、MS-DOS、その他の ファイルシステムをもち、さらにその下にバッファキャッシュをおき、さらに下にデバイスドライバをおくという、何重もの層を 持っている形になっています。 プログラムは、Linuxのファイルを扱っているだけで、その下がMS-DOSのファイルシステムや Minix のファイルシステムであるかを知る必要はありません。 しかも、その下には、ハードディスクやフラッシュメモリ (例えばUSBメモリやSDカードなど)といった 補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。 その下に、装置をコントロールするためのデバイスドライバが用意されている形になります。 このように重層的な構造にすることによって、抽象化を図っています。


		プログラム
                 ^^^^^^^^
	========[ファイル]=======
	バーチャルファイルシステム (VFS)   <----(+)  ↑ 高       
        --^^----^^-----^^----------^^----            抽象度
	[ext2][msdos][minix].....[proc]              ↓ 低
	---^^^^^^^^^^^^^^-------
           バッファキャッシュ
        -------^^^^^-----------
	   デバイスドライバ------------->(+)
        ------^^^^^^^^^--------
          ___+____+____+_
             v    v    V
	    HDD  HDD HDD
 ext2 --- Linuxのファイルシステム
 msdos --- MSDオペレーティングシステムのファイルシステム
 minix --- MINIXのファイルシステム
 proc  --- プログラムファイルシステム (Linux独自)


脚注

  1. 日本語版wikipediaではウェブブラウザや時計などのアクセサリーも広義のオペレーティングシステムだということを書いていますが、そんなことをテストに書いて点数をくれる先生は極めて少数派でしょう。

目次