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

提供:UnixClassWiki
ナビゲーションに移動 検索に移動
172行目: 172行目:




=== 上から下への流れ ===
==== 上から下への流れ ====





2015年3月26日 (木) 16:25時点における版

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

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

オペレーティングシステムとは何かを基本に戻って再確認してみましょう。 オペレーティングシステム( 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です。ここで始めて今日的なオペレーティングシステムが作られます。 汎用機という言葉は、この「汎用的にプログラムを動かすことができるシステム」という所から来ています。

1962年にNASAで使われていた IBM 7090 の写真[1]


時代は流れ大型汎用機もダウンサイジングの並に流されます。 まず最初のダウンサイジングで成功したのは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つのまとまりとして、システムソフトウェアと呼びます。「システムを動かすのに最低限必要なソフトウェアセット」という広い意味で捉えたオペレーティングシステムであれば、このシステムソフトウェアがオペレーティングシステムと同意語であると言えます。


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


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


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


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


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

 ディレクトリ名      コマンド数
 /bin              95
 /sbin             110 
 /usr/bin          452
 /usr/sbin         107


補足
2011年時点で最新のDebian GNU/Linux 6.0 を参考にしています。


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


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


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

揺らぐ定義

コンソールでTOPを実行

右図は仮想マシンにVirtualBoxを使い、Debian GNU/Linux 6.0 を最小限インストールし立ち上げてみた状態です。 もちろんGUIはインストールしていません。なぜならGUIが存在しなくともきちんとコンピュータは動くからです。 Debian GNU/Linux 6.0はデスクトップやラップトップ、あるいはサーバに使われるディストリビューションで、組み込み用のものではありません。 topコマンドを使い、メモリや実行中のプロセスが、どのような状態になっているか観察してみました。 用意しているメモリは128MBですが、この状態で使われている記憶領域は約26MBしか使っていません。 dfを使ってディスクの利用状況を見てみると、最小のインストールでは約645MBしか使っていません。 最小限のセットを考えた場合、このように小さいメモリでも動くことができます。 この程度の資源でも(英文であれば、ですが)十分にテキストを編集し、スペルをチェックし、フォーマットし、さらにプリンタに出力ができます。 十分に「パーソナルな」コンピュータだといえます。

このように使い方によって、あるいはユーザのニーズによって「最小限の」という言葉を使って表現している広義のオペレーティングシステムの意味は揺らぎます。

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

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,....は、オペレーティングシステムから割り当てられたリソースを使っているわけですから、オペレーティングシステムの知らない所で、割り当てられていないリソースに勝手なことをされては、一貫性が保てません。


90年代のパソコンのオペレーティングシステム(と呼ばれていたもの)は、このような不完全なリソース管理の能力しか持っていませんでした。これらはオペレーティングシステムと呼ぶに値するのか非常に疑問で、本来はまだオペレーティングシステムまで発展していない前段階の機能であるハードウェアを監視するモニタと呼ばれるものに分類するのが適切であるように思えます。

さらなる仮想化の例

mmapとファイル

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

VFSからデバイスドライバまで
File System Layer

ファイルシステムをさらに抽象化するLinuxのファイルシステムを紹介しましょう。 Linuxのファイルシステムは、上位にVFS (Virtual File System)が存在し、その下に、FAX、ext4、JFS、XFS、NFS、その他のファイルシステムをもち、さらにその下にバッファキャッシュがあり、さらに下にデバイスドライバがあるといった、何重もの層を重ねる形になっています。 プログラムは、Linuxのファイルを扱っているだけで、その下がFATのファイルシステムやJFSのファイルシステムであるか、あるいはネットワーク経由でファイルシステムを使うことができるNFSなのかを知らなくても利用することが可能です。

下層には、補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。 さらなる下層には、ハードディスクやフラッシュメモリ (例えばUSBメモリやSDカードなど)といった記憶するためのハードウェア、あるいはNFSのようにネットワークを経由して使うためのネットワークハードウェアをコントロールするためのデバイスドライバの層があります。

このように重層的な構造にすることによって、抽象化を図り、かつどの層が変化しようとも、上位の層がその違いを吸収するような形になっています。このような枠組みにより柔軟に機能・モジュールを追加、変更することが出来る仕組みになっています。

脚注

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

目次