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

提供:UnixClassWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の61版が非表示)
19行目: 19行目:




* リソースを効率的に利用する
* リソースを効率的に利用し、また管理をする


* アプリケーションが直接リソースを制御する必要をなくする
* アプリケーションが直接リソースを制御する必要をなくする


* アプリケーションにとってリソースをさらに抽象化する
* アプリケーションにとってリソースをさらに抽象化する


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


48行目: 45行目:
==== ハードウェアリソース ====
==== ハードウェアリソース ====


 
ハードウェアリソースにはCPU、主記憶装置(メモリ)、補助記憶装置、入出力装置、ほかがあります。
* CPU
* 主記憶装置
* 補助記憶装置
* 入出力装置
* etc.
 


===== CPU =====
===== CPU =====
66行目: 57行目:
CPUと直接やりとりする記憶装置を指します。
CPUと直接やりとりする記憶装置を指します。
演算のための値を記憶しておく、結果を記憶しておく、命令を記憶しておくなどといったために使われます。
演算のための値を記憶しておく、結果を記憶しておく、命令を記憶しておくなどといったために使われます。
以前は、単純にCPU ←→主メモリという構造で説明が十分だったのですが、現在での具体的な物理メモリの構成は、いくつかの階層にわかれていて、CPUと記憶をやりとりしています。
以前は、単純にCPU ←→主メモリという構造で説明が十分だったのですが、現在での具体的な物理メモリの構成は、アクセスの効率を考え何段階かの動作速度や容量が異なるキャッシュメモリを用意しておき、CPUと記憶をやりとりしています。
わりきって一言でいうなら電気を切ったら消えてしまう一時的な記憶装置です。
わりきって一言でいうなら電気を切ったら消えてしまう一時的な記憶装置だといえます。
 
 


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


===== 入出力装置 =====
===== 入出力装置 =====
85行目: 73行目:




; 調べてみよう : ハードウェアリソースを構成するものとしてこの他に、どんなものがあるだろうか。
: '''調べてみよう''': ハードウェアリソースを構成<ref>
 
コンピュータの構成と設計 第5版 上 , ジョン・L. ヘネシー (著), デイビッド・A. パターソン (著), 成田 光彰 (翻訳), 2014/12/6, ISBN 4822298426
</ref><ref>
コンピュータの構成と設計 第5版 下, デイビッド・A・パターソン (著), ジョン・L・ヘネシー (著), 成田光彰 (翻訳), 2014/12/6, ISBN 4822298434
</ref>するものとしてこの他に、どんなものがあるだろうか。


====  ソフトウェアリソース ====
====  ソフトウェアリソース ====
93行目: 84行目:




たとえばオペレーティングシステムの心臓部であるカーネル部分、アプリケーションが使うライブラリ、あるいはシステムを運用する上で必要なコマンド群などなどがあげられます。どのソフトウェアどんな役割を担うのかの議論は後程しましょう。
たとえばオペレーティングシステムの心臓部である[[カーネルの構造と機能|カーネル部分]]、アプリケーションが使うライブラリ、あるいはシステムを運用する上で必要なコマンド群などがあげられます。データベースを考えるとアプリケーションとしてのデータベースプログラムとその中に格納されアプリケージョンに利用されるデータから成り立ちます。この両者があってソフトウェアリソースとして提供されるデータベースとして意味をなします。多種多様なソフトウェアリソースがどのような役割を担うのかの議論は後ほどしましょう。
 


==== ヒューマンリソース ====
==== ヒューマンリソース ====
103行目: 93行目:




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


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


最近は、どんどんハードウェアが高性能になっていきます。
時が立つにつれ、どんどんハードウェアが小型化し、また高性能になっていきます。
例えば、デスクトップコンピュータ、いわゆるパソコンと呼ばれる機械の上位機種の計算スピードは、私がこの業界に入った1980 年半ばのスーパーコンピュータ並、あるいはそれ以上の性能をたたき出しています。
例えば、2010 年のデスクトップコンピュータ、いわゆるパソコンと呼ばれる機械の上位機種の計算スピードは、私がこの業界に入った 1980 年半ばのスーパーコンピュータ並、あるいはそれ以上の性能を持っています。この文章を読んでいるこの瞬間では、2010年のデスクトップパソコンなど性能的に時代遅れになっているでしょう。




1990年当時から比較しても、エンジニアリングワークステーションと呼ばれていた数百万から一千万円くらいの価格だったコンピュータシステムよりも遥かに高速です。
1990 年当時から比較しても、エンジニアリングワークステーションと呼ばれていた数百万から一千万円くらいの価格だったコンピュータシステムよりも遥かに高速です。<ref>RASPBERRY PI 2 MODEL B http://www.raspberrypi.org/products/raspberry-pi-2-model-b/ </ref><ref>Iridis-pi: a low-cost, compact demonstration cluster https://www.southampton.ac.uk/~sjc/raspberrypi/raspberry_pi_iridis_lego_supercomputer_paper_cox_Jun2013.pdf</ref>




122行目: 110行目:


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


==== 下から上への流れ ====
==== 下から上への流れ ====
132行目: 121行目:




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を設立します。
1976年ぐらいになると、Apple、Sol、Altairといった最も初期の頃のパソコンが作られてきます。この頃、Bill GatesとPaul AllenはAltair 8080 (メモリ4KByte版)用に大型汎用機上で動いていたBASIC言語を移植しMITSへライセンスします。翌、1977年には [[Steve Wozniak]] とSteve Jobs <ref> スティーブ・ジョブズ 1 (講談社+α文庫)  ISBN 4062816148 </ref>がApple Corporationを設立し、また同じくしてBill Gates とPaul Allenは正式にMicrosoft companyを設立します。
 


Apple や Sol や Altairのような初期のパソコンが作られます。スミソニアン博物館にある初期のパソコンたちの写真です。


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


[[image:IMG_2551.JPG|thumb|Homebrew computer club ]]
[[image:IMG_2551.JPG|thumb|220px|Homebrew computer club ]]


[[image:IMG_2548.JPG|thumb|Apple]]
[[image:IMG_2548.JPG|thumb|220px|Apple]]


[[image:IMG_2549.JPG|thumb|Sol]]
[[image:IMG_2549.JPG|thumb|220px|Sol]]


[[image:IMG_2547.JPG|thumb|Altair]]
[[image:IMG_2547.JPG|thumb|220px|Altair]]




154行目: 144行目:




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






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




172行目: 160行目:




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




180行目: 167行目:
高価なハードウェア上でもっと汎用的にプログラムを動かすために作られたシステムが1964年に作られたIBM S/360です。ここで始めて今日的なオペレーティングシステムが作られます。
高価なハードウェア上でもっと汎用的にプログラムを動かすために作られたシステムが1964年に作られたIBM S/360です。ここで始めて今日的なオペレーティングシステムが作られます。
汎用機という言葉は、この「汎用的にプログラムを動かすことができるシステム」という所から来ています。
汎用機という言葉は、この「汎用的にプログラムを動かすことができるシステム」という所から来ています。
[[image:NASAComputerRoom7090.NARA.jpg|left|thumb|300px| 1962年にNASAで使われていた IBM 7090 の写真(NASAサイトより)<ref>NASA の著作権ポリシー http://www.jsc.nasa.gov/policies.html#Guidelines</ref>]]




194行目: 184行目:




90年代後半になるとIA-32 (''Intel Architecture,32bit'')のハードウェアに席捲されます。2000年以降は、ダウンサイジングの到着点です。もう個人で使うパーソナルコンピュータも、業務や科学技術計算で使うものも、ハードウェア的には価格的にも、使われている技術にも、処理能力にも線引きが出来できません。2005年では、64bit CPU、デュアルプロセッサ対応、デュアルコアCPUといった最先端のテクノロジーがコモディティ市場 (一般消費者向け市場) に売られている時代になりました。この傾向はこれから先も続きます。


90年代後半になるとIA-32 (Intel Architecture --- 32bit)のハードウェアに席捲されます。2000年以降は、ダウンサイジングの到着点です。もう個人で使うパーソナルコンピュータも、業務や科学技術計算で使うものも、ハードウェア的には価格的にも、使われている技術にも、処理能力にも線引きが出来できません。
2005年では、64bit CPU、デュアルプロセッサ対応、デュアルコアCPUといった最先端のテクノロジーがコモディティ市場 (一般消費者向け市場) に売られている時代になりました。この傾向はこれから先も続きます。
; 考えてみよう : ムーアの法則には限界があるのか、ないのか。あるとしたらなぜなのか。ないならばなぜなのか。尚、ムーアの法則の意味は、オリジナルの意味である集積度の向上と、派生的に多く使われている性能の向上のどちらの意味で取ってもよい。




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


===  2007年現在の状況 ===
===  2007年現在の状況 ===
237行目: 220行目:




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




244行目: 227行目:


== 何をさしてオペレーティングシステムと呼ぶのか ==
== 何をさしてオペレーティングシステムと呼ぶのか ==
=== 広義と狭義の議論 ===


[[File:Layer-of-System-2.png|thumb|right|400px|System Layer]]
[[File:Layer-of-System-2.png|thumb|right|400px|System Layer]]


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




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




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




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




しかしながら、「パッケージを購入した時にバンドルされているものが最小限のセットであるので、これがオペレーティングシステムである」という誤解
この「パッケージを購入した時にバンドルされているアプリケーション群が最小限のセットなので、これがオペレーティングシステムである」という誤解
<ref>
<ref>
[http://ja.wikipedia.org/w/index.php?title=%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0&oldid=29875236 日本語版wikipedia]ではウェブブラウザや時計などのアクセサリーも広義のオペレーティングシステムだということを書いていますが、そんなことをテストに書いて点数をくれる先生は極めて少数派でしょう。
[http://ja.wikipedia.org/w/index.php?title=%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0&oldid=29875236 日本語版wikipedia]ではウェブブラウザや時計などのアクセサリーも広義のオペレーティングシステムだということを書いていますが、そんなことをテストに書いて点数をくれる先生は極めて少数派でしょう。
</ref>
</ref>
は一般には多いようです。
は一般には多いようです。
しかし、これではゲームのソリティアもオペレーティングシステムに含まれることになるので、やはり奇妙な結論と言えます。
もしこれが正しいとするならば、これではゲームのソリティアもオペレーティングシステムに含まれることになるので、やはり奇妙な結論と言えます。
このような表現での「最小パッケージ」とはGNU/Linuxのディストリビューションのデフォルトイントール環境にあたるもので、このオペレーティングシステムの定義を採用するとなると、世の中にはおびただしい数のオペレーティングシステムの種類<ref> オープンソース系オペレーティングシステムののディストリビューションを紹介する https://distrowatch.com  には実に様々なディストリビューションが紹介されています。</ref>が存在することになります。このような定義を用いると、このような奇妙な結果が導き出されてしまうことになります。




286行目: 260行目:




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


   ディレクトリ名      コマンド数
   ディレクトリ名      コマンド数
   /bin              74
   /bin              95
   /sbin            105
   /sbin            110
   /usr/bin          275
   /usr/bin          452
   /usr/sbin        112
   /usr/sbin        107
 
 
; 補足 :  2011年時点で最新のDebian GNU/Linux 6.0 を参考にしています。


; 補足 :  2007年ではDebian GNU/Linux Etchが最新です。


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




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




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


=== 揺らぐ定義 ===


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


[[File:Screenshot-Oracle VM VirtualBox.png|thumb|right|450px|コンソールでTOPを実行]]


下はDebian GNU/Linux (Woody) を最小限のインストールして立ち上げてみた
右図は仮想マシンに
状態です。topコマンドを使い、メモリや実行中のプロセスが、どのような状
[https://www.virtualbox.org/ VirtualBox]
態になっているか観察したものです。用意しているメモリは32MBですが、この
を使い、
状態で使われている記憶領域は約7.8MBしか使っていません。dfを使ってディ
[https://www.debian.org/ Debian GNU/Linux] 6.0
スクの利用状況を見てみると、約536MBのハードディスクを用意していますが
を最小限インストールし立ち上げてみた状態です。
(フォーマット後の要領約500MB) 、最小のインストールでは約80MBしか使って
もちろんGUIはインストールしていません。なぜならGUIが存在しなくともきちんとコンピュータは動くからです。
いません。最小限のセットを考えた場合、かなり小さくて済みます。一方、ど
Debian GNU/Linux 6.0 はデスクトップやラップトップ、あるいはサーバに使われるディストリビューションで、組み込み用のものではありません。
んどんその適用範囲を広げていった場合、どこまでがオペレーティングシステ
top コマンドを使い、メモリや実行中のプロセスが、どのような状態になっているか観察してみました。
ムと呼んでいいのか、どこからがそれ以外のアプリケーションと呼ぶかのはグ
用意しているメモリは 128MB ですが、この状態で使われている記憶領域は約 26MB しか使っていません。
ラデーションのように曖昧になることでしょう。
df を使ってディスクの利用状況を見てみると、最小のインストールでは約 645MB しか使っていません。
最小限のセットを考えた場合、このように小さいメモリでも動くことができます。
この程度の資源でも(英文であれば、ですが)十分にテキストを編集し、スペルをチェックし、フォーマットし、さらにプリンタに出力ができます。
十分に「パーソナルな」コンピュータだといえます。




<PRE>
このように使い方によって、あるいはユーザのニーズによって「最小限の」という言葉を使って表現している広義のオペレーティングシステムの意味は揺らぐのがわかるかと思います。
# 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% /
</PRE>


==  コンピュータを仮想化させる ==  
==  コンピュータを仮想化させる ==  
380行目: 323行目:
   
   
:'''捕捉''' さらに
:'''捕捉''' さらに
:[[http://www.cl.cam.ac.uk/Research/SRG/netos/xen/ Xen]]や[[http://www.vmware.com/  VMware]]のようにハードウェア側を抽象化し、1つのハードウェア上に複数のオペレーティングシステムを動かすバーチャルマシンのシステムもあります。
:[http://www.cl.cam.ac.uk/Research/SRG/netos/xen/ Xen][http://www.vmware.com/  VMware]、[https://www.virtualbox.org/ VirtualBox]のようにハードウェア側を抽象化し、1つのハードウェア上に複数のオペレーティングシステムを動かすバーチャルマシンのシステムもあります。




==== 抽象化の例 ====
==== 抽象化の例 ====


UNIXの上で次のコマンドを実行すると端末にHelloと表示されます。これは文
UNIXの上で次のコマンドを実行すると端末にHelloと表示されます。これは文字列"Hello"を出力し、その出力先をファイル
字列"Hello"を出力し、その出力先を ファイル/dev/tty への入力するという
/dev/tty
働きをします。ファイル(デバイスファイルと呼びます)/dev/ttyというのは、
への入力するという働きをします。ファイル(デバイスファイルと呼びます)
端末を抽象化したものです。
/dev/tty
というのは、自端末を抽象化したものです。
いくつも端末のウインドウを開いて別々のシェルで行っても、ほかの端末には表示せず、自分の端末のみに出力します。
 


<PRE>
<pre class="bash">
  % echo "Hello" > /dev/tty
  % echo "Hello" > /dev/tty
  Hello
  Hello
</PRE>
</pre>


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


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


==== 不完全なリソース管理 ====
==== 不完全なリソース管理 ====


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




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




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




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


==== さらなる仮想化の例 ====
==== さらなる仮想化の例 ====
431行目: 362行目:


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


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


===== VFSからデバイスドライバまで =====
===== VFSからデバイスドライバまで =====
[[File:Filesystem-layer-1.png|thumb|right|400px|File System Layer]]
[[File:Filesystem-layer-1.png|thumb|right|400px|File System Layer]]
ファイルシステムをさらに抽象化するLinuxのファイルシステムを紹介しましょう。
[[ファイルシステム]] をさらに抽象化するLinuxのファイルシステムを紹介しましょう。
Linuxのファイルシステムは、上位にVFS (Virtual  File System)が存在し、その下に、FAX、ext4、JFS、XFS、NFS、その他のファイルシステムをもち、さらにその下にバッファキャッシュがあり、さらに下にデバイスドライバがあるといった、何重もの層を重ねる形になっています。
ファイルを書き込む説明で「ハードディスクに書き込む」という表現をみたことはないでしょうか。
目の前にあるパソコン本体のみを考えるならば、このモノに書き出すというので説明は十分なのかも知れませんが、ファイルを書き込む・読み込むというのはもっと抽象的な動作をします。
 
Linuxのファイルシステムは、上位にVFS (Virtual  File System)が存在し、その下に、FAT、ext4、JFS、XFS、NFS、その他のファイルシステムをもち、さらにその下にバッファキャッシュがあり、さらに下にデバイスドライバがあるといった、何重もの層を重ねる形になっています。
プログラムは、Linuxのファイルを扱っているだけで、その下がFATのファイルシステムやJFSのファイルシステムであるか、あるいはネットワーク経由でファイルシステムを使うことができるNFSなのかを知らなくても利用することが可能です。
プログラムは、Linuxのファイルを扱っているだけで、その下がFATのファイルシステムやJFSのファイルシステムであるか、あるいはネットワーク経由でファイルシステムを使うことができるNFSなのかを知らなくても利用することが可能です。


下層には、補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。
下層には、補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。
さらなる下層には、ハードディスクやフラッシュメモリ (例えばUSBメモリやSDカードなど)といった記憶するためのハードウェア、あるいはNFSのようにネットワークを経由して使うためのネットワークハードウェアをコントロールするためのデバイスドライバの層があります。
さらなる下層には、ハードディスクやフラッシュメモリ (例えばUSBメモリやSDカードなど)といった記憶するためのハードウェア、あるいはNFSのようにネットワークを経由して使うためのネットワークハードウェアをコントロールするためのデバイスドライバの層があります。
ファイルの情報が最終的にハードディスクに書かれるとしても、ファイルを書き込む動作を行った時点で、まだハードディスクにかかれているわけではありません。
このようなことにより、たぶん一度や二度は経験したことがあるかも知れませんが、突然、機材の電源を停止すると永続的な情報を保持するためのエリア(ハードディスクやUSBメモリなど)にかかれていなかったファイルの情報は消えてしまうことになります。
<blockquote>
<pre class="bash">
% sync;sync;sync
</pre>
sync
<ref>
syncを三回するのは "In the name of the Father, and of the Son, and of the Holy Spirit.(父と子と精霊の御名において)"と唱えて強制的にハードウェアリセットをするためだとむかし誰かに教わった。
</ref>
はバッファキャッシュなどにある情報を含めてすべてデバイスに同期させるコマンド。
</blockquote>


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


== 脚注 ==
== 脚注 ==
456行目: 400行目:
----
----
[[目次]]へ
[[目次]]へ
[[Category:UNIXオペレーティングシステム|1]]

2022年2月17日 (木) 05:07時点における最新版

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

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

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


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


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

リソースとは

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


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


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


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


ハードウェアリソース

ハードウェアリソースにはCPU、主記憶装置(メモリ)、補助記憶装置、入出力装置、ほかがあります。

CPU

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


主記憶装置

主記憶装置 ( Main Memory Unit ) : いわゆるメモリのことです。 CPUと直接やりとりする記憶装置を指します。 演算のための値を記憶しておく、結果を記憶しておく、命令を記憶しておくなどといったために使われます。 以前は、単純にCPU ←→主メモリという構造で説明が十分だったのですが、現在での具体的な物理メモリの構成は、アクセスの効率を考え何段階かの動作速度や容量が異なるキャッシュメモリを用意しておき、CPUと記憶をやりとりしています。 わりきって一言でいうなら電気を切ったら消えてしまう一時的な記憶装置だといえます。

補助記憶装置

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

入出力装置

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


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

ソフトウェアリソース

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


たとえばオペレーティングシステムの心臓部であるカーネル部分、アプリケーションが使うライブラリ、あるいはシステムを運用する上で必要なコマンド群などがあげられます。データベースを考えるとアプリケーションとしてのデータベースプログラムとその中に格納されアプリケージョンに利用されるデータから成り立ちます。この両者があってソフトウェアリソースとして提供されるデータベースとして意味をなします。多種多様なソフトウェアリソースがどのような役割を担うのかの議論は後ほどしましょう。

ヒューマンリソース

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


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

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

時が立つにつれ、どんどんハードウェアが小型化し、また高性能になっていきます。 例えば、2010 年のデスクトップコンピュータ、いわゆるパソコンと呼ばれる機械の上位機種の計算スピードは、私がこの業界に入った 1980 年半ばのスーパーコンピュータ並、あるいはそれ以上の性能を持っています。この文章を読んでいるこの瞬間では、2010年のデスクトップパソコンなど性能的に時代遅れになっているでしょう。


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


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


現在のオペレーティングシステムへ向かう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 [5]が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 の写真(NASAサイトより)[6]


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


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


この「パッケージを購入した時にバンドルされているアプリケーション群が最小限のセットなので、これがオペレーティングシステムである」という誤解 [7] は一般には多いようです。 もしこれが正しいとするならば、これではゲームのソリティアもオペレーティングシステムに含まれることになるので、やはり奇妙な結論と言えます。 このような表現での「最小パッケージ」とはGNU/Linuxのディストリビューションのデフォルトイントール環境にあたるもので、このオペレーティングシステムの定義を採用するとなると、世の中にはおびただしい数のオペレーティングシステムの種類[8]が存在することになります。このような定義を用いると、このような奇妙な結果が導き出されてしまうことになります。


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


補足
カーネルとそれ以外のソフトウェアの切り分けは、実行されるプロセスの実行モードが、どの状態で動いているかで区別します。プロセスの実行モードが、カーネル・モード(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のリソースは、プログラムに対し、プロセスという単位で割り当てられます。
  • プログラムの使う記憶空間のリソースは、仮想記憶によりコントロールされます。仮想記憶の機構により、主記憶だけではなく、補助記憶装置も使って、主記憶よりも大きい記憶空間を作ることが可能です。その中から、プログラムが必要な大きさの記憶空間リソースを割り当ています。
  • 永続的な記憶を保管しておくために、ファイルという抽象的なデータの保管メカニズムを使います。そのファイルを効率的かつ統一的に扱うために、ファイルシステムを作ります。ファイルシステムは、主記憶と補助記憶装置を使って、ファイルのリソースを提供します。
  • 入出力装置のリソースのために、デバイスファイルという入出力装置を抽象化した入出力リソースを提供しています。


捕捉 さらに
XenVMwareVirtualBoxのようにハードウェア側を抽象化し、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)が存在し、その下に、FAT、ext4、JFS、XFS、NFS、その他のファイルシステムをもち、さらにその下にバッファキャッシュがあり、さらに下にデバイスドライバがあるといった、何重もの層を重ねる形になっています。 プログラムは、Linuxのファイルを扱っているだけで、その下がFATのファイルシステムやJFSのファイルシステムであるか、あるいはネットワーク経由でファイルシステムを使うことができるNFSなのかを知らなくても利用することが可能です。

下層には、補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。 さらなる下層には、ハードディスクやフラッシュメモリ (例えばUSBメモリやSDカードなど)といった記憶するためのハードウェア、あるいはNFSのようにネットワークを経由して使うためのネットワークハードウェアをコントロールするためのデバイスドライバの層があります。 ファイルの情報が最終的にハードディスクに書かれるとしても、ファイルを書き込む動作を行った時点で、まだハードディスクにかかれているわけではありません。 このようなことにより、たぶん一度や二度は経験したことがあるかも知れませんが、突然、機材の電源を停止すると永続的な情報を保持するためのエリア(ハードディスクやUSBメモリなど)にかかれていなかったファイルの情報は消えてしまうことになります。

 % sync;sync;sync

sync [9] はバッファキャッシュなどにある情報を含めてすべてデバイスに同期させるコマンド。

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

脚注

  1. コンピュータの構成と設計 第5版 上 , ジョン・L. ヘネシー (著), デイビッド・A. パターソン (著), 成田 光彰 (翻訳), 2014/12/6, ISBN 4822298426
  2. コンピュータの構成と設計 第5版 下, デイビッド・A・パターソン (著), ジョン・L・ヘネシー (著), 成田光彰 (翻訳), 2014/12/6, ISBN 4822298434
  3. RASPBERRY PI 2 MODEL B http://www.raspberrypi.org/products/raspberry-pi-2-model-b/
  4. Iridis-pi: a low-cost, compact demonstration cluster https://www.southampton.ac.uk/~sjc/raspberrypi/raspberry_pi_iridis_lego_supercomputer_paper_cox_Jun2013.pdf
  5. スティーブ・ジョブズ 1 (講談社+α文庫) ISBN 4062816148
  6. NASA の著作権ポリシー http://www.jsc.nasa.gov/policies.html#Guidelines
  7. 日本語版wikipediaではウェブブラウザや時計などのアクセサリーも広義のオペレーティングシステムだということを書いていますが、そんなことをテストに書いて点数をくれる先生は極めて少数派でしょう。
  8. オープンソース系オペレーティングシステムののディストリビューションを紹介する https://distrowatch.com には実に様々なディストリビューションが紹介されています。
  9. syncを三回するのは "In the name of the Father, and of the Son, and of the Holy Spirit.(父と子と精霊の御名において)"と唱えて強制的にハードウェアリセットをするためだとむかし誰かに教わった。

目次