差分

移動先: 案内検索

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

2,027 バイト追加, 2018年10月31日 (水) 09:49
/* 下から上への流れ */
* リソースを効率的に利用するリソースを効率的に利用し、また管理をする
* アプリケーションが直接リソースを制御する必要をなくする
* アプリケーションにとってリソースをさらに抽象化する
 
 
 
=== リソースとは ===
リソースとは、コンピュータ上にある、処理を行なう際に必要となる資源を意味する概念的なものです。
リソースとしてハードウェアリソースとソフトウェアリソースの2つはすぐに思い浮かぶでしょう。
さらに一歩踏み込んでオペレーティングシステムはコストをより少なくするための道具と考えるならば、さらに一歩踏み込んでオペレーティングシステムはコンピュータ・システムを利用するコストをより少なくするための道具と考えるならば、
利用者や運用者などを指してヒューマンリソースとしリソースの中に含める必要が出てきます。
CPUと直接やりとりする記憶装置を指します。
演算のための値を記憶しておく、結果を記憶しておく、命令を記憶しておくなどといったために使われます。
以前は、単純にCPU ←→主メモリという構造で説明が十分だったのですが、現在での具体的な物理メモリの構成は、いくつかの階層にわかれていて、CPUと記憶をやりとりしています。わりきって一言でいうなら電気を切ったら消えてしまう一時的な記憶装置です。←→主メモリという構造で説明が十分だったのですが、現在での具体的な物理メモリの構成は、アクセスの効率を考え何段階かの動作速度や容量が異なるキャッシュメモリを用意しておき、CPUと記憶をやりとりしています。わりきって一言でいうなら電気を切ったら消えてしまう一時的な記憶装置だといえます。
===== 補助記憶装置 =====
現在ではコンパクトフラッシュメモリやUSBメモリなどもこのような区分けに入ってきます。
主記憶装置との違いは、CPUと直接記憶のやりとりを行なわないこと、記憶の容量が大きいこと、長期間記憶
(割り切って言えば電気を切っても消えない記憶わり切って言えば電気を切っても消えない記憶)
を保持するユニットです。
 
===== 入出力装置 =====
; : '''調べてみよう ''': ハードウェアリソースを構成するものとしてこの他に、どんなものがあるだろうか。 ハードウェアリソースを構成<ref>コンピュータの構成と設計 第5版 上 , ジョン・L. ヘネシー (著), デイビッド・A. パターソン (著), 成田 光彰 (翻訳), 2014/12/6, ISBN 4822298426</ref><ref>コンピュータの構成と設計 第5版 下, デイビッド・A・パターソン (著), ジョン・L・ヘネシー (著), 成田光彰 (翻訳), 2014/12/6, ISBN 4822298434</ref>するものとしてこの他に、どんなものがあるだろうか。
==== ソフトウェアリソース ====
たとえばオペレーティングシステムの心臓部であるカーネル部分、アプリケーションが使うライブラリ、あるいはシステムを運用する上で必要なコマンド群などなどがあげられます。どのソフトウェアどんな役割を担うのかの議論は後程しましょう。たとえばオペレーティングシステムの心臓部である[[カーネルの構造と機能|カーネル部分]]、アプリケーションが使うライブラリ、あるいはシステムを運用する上で必要なコマンド群などなどがあげられます。どのソフトウェアどんな役割を担うのかの議論は後程しましょう。
==== ヒューマンリソース ====
; : '''調べてみよう ''' : 人的なコストを低減するためにどのような工夫がなされているのだろうか。  
== オペレーティングシステムの潮流 ==
最近は、どんどんハードウェアが高性能になっていきます。時が立つにつれ、どんどんハードウェアが小型化し、また高性能になっていきます。例えば、デスクトップコンピュータ、いわゆるパソコンと呼ばれる機械の上位機種の計算スピードは、私がこの業界に入った1980 例えば、2010 年のデスクトップコンピュータ、いわゆるパソコンと呼ばれる機械の上位機種の計算スピードは、私がこの業界に入った 1980 年半ばのスーパーコンピュータ並、あるいはそれ以上の性能をたたき出しています。
 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>
1976年ぐらいになると、Apple、Sol、Altairといった最も初期の頃のパソコンが作られてきます。この頃、Bill GatesとPaul AllenはAltair 8080 (メモリ4KByte版)用に大型汎用機上で動いていたBASIC言語を移植しMITSへライセンスします。翌、1977年にはSteve WozniakとSteve JobsがApple メモリ4KByte版)用に大型汎用機上で動いていたBASIC言語を移植しMITSへライセンスします。翌、1977年には [[Steve Wozniak]] とSteve Jobs <ref> スティーブ・ジョブズ 1 (講談社+α文庫) ISBN 4062816148 </ref>がApple Corporationを設立し、また同じくしてBill Gates とPaul Allenは正式にMicrosoft companyを設立します。
Apple や Sol や Altairのような初期のパソコンが作られます。下がスミソニアン博物館にある世界初のパソコンの写真です(著者撮影)。Altairのような初期のパソコンが作られます。スミソニアン博物館にある初期のパソコンたちの写真です。
[[image:IMG_2551.JPG|thumb|Homebrew computer club ]]
:''';補足''': 機能が不十分なため厳密にはオペレーティングシステムとは呼べずモニターと呼ぶべきものだと筆者は考えます。
:'''調べてみよう''':オペレーティングシステムの前段階ともいえるモニターとはなんだろうか。
このように下から上へ向かうトレンドが、まず1つあります。
  ==== 上から下への流れ ====
高価なハードウェア上でもっと汎用的にプログラムを動かすために作られたシステムが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>]]
90年代後半になるとIA-32 (''Intel Architecture,32bit'')のハードウェアに席捲されます。2000年以降は、ダウンサイジングの到着点です。もう個人で使うパーソナルコンピュータも、業務や科学技術計算で使うものも、ハードウェア的には価格的にも、使われている技術にも、処理能力にも線引きが出来できません。2005年では、64bit CPU、デュアルプロセッサ対応、デュアルコアCPUといった最先端のテクノロジーがコモディティ市場 (一般消費者向け市場) に売られている時代になりました。この傾向はこれから先も続きます。
90年代後半になるとIA-32 (Intel Architecture --- 32bit)のハードウェアに席捲されます。2000年以降は、ダウンサイジングの到着点です。もう個人で使うパーソナルコンピュータも、業務や科学技術計算で使うものも、ハードウェア的には価格的にも、使われている技術にも、処理能力にも線引きが出来できません。
 
 
 
2005年では、64bit CPU、デュアルプロセッサ対応、デュアルコアCPUといった最先端のテクノロジーがコモディティ市場 (一般消費者向け市場) に売られている時代になりました。この傾向はこれから先も続きます。
 
 
 
; 考えてみよう : ムーアの法則には限界があるのか、ないのか。あるとしたらなぜなのか。ないならばなぜなのか。尚、ムーアの法則の意味は、オリジナルの意味である集積度の向上と、派生的に多く使われている性能の向上のどちらの意味で取ってもよい。
; 考えてみよう : ムーアの法則とは限界を示しているのか、いないのか。限界を示しているとしたらなぜなのか。あるいは、ないならばなぜなのか。尚、ムーアの法則の意味は、オリジナルの意味である集積度の向上と、派生的に多く使われている性能の向上のどちらの意味で取ってもよい。
=== 2007年現在の状況 ===
このように必要な安全性を達成するには、下から上へ上がってきたようなレガシーなソフトウェアを切り捨てなければ困難こです。しかし、一方で膨大なソフトウェア資産があるわけです。この矛盾に終止符を打つのは大変長い時間がかかります。このように必要な安全性を達成するには、下から上へ上がってきたようなレガシーなソフトウェアを切り捨てなければ困難です。しかし、一方で膨大なソフトウェア資産があるわけです。この矛盾に終止符を打つのは大変長い時間がかかります。
== 何をさしてオペレーティングシステムと呼ぶのか ==
=== 広義と狭義の議論 ===
[[File:Layer-of-System-2.png|thumb|right|400px|System Layer]]
コンピュータ上で動いているソフトウェアのどの部分を指してオペレーティングシステムと呼ぶべきないのか、ということの定義を確認しましょう。コンピュータ上で動いているソフトウェアのどの部分を指してオペレーティングシステムと呼ぶべきないのか、ということの定義を確認しましょう。
ここでは、一番最下層をハードウェアとして、次にあるのがカーネルの層、その次が汎用に使われるシステムユーティリティの層、そして、特定目的のためにユーザが利用するアプリケーションの層と分けてみます。ここでは、一番最下層をハードウェアとして、次にあるのが[[カーネルの構造と機能|カーネルの層]]、その次が汎用に使われるシステムユーティリティの層、そして、特定目的のためにユーザが利用するアプリケーションの層というモデルを考えてみます。
オペレーティングシステムと、システムユーティリティの両方を1つのまとまりとして、システムソフトウェアと呼びます。「システムを動かすのに最低限必要なソフトウェアセット」という広い意味で捉えたオペレーティングシステムであれば、このシステムソフトウェアがオペレーティングシステムと同意語であると言えます。オペレーティングシステムと、システムユーティリティの両方を1つのまとまりとして、システムソフトウェアと呼びます。「システムを動かすのに最低限必要なソフトウェアセット」という広い意味で捉えたオペレーティングシステムであれば、このシステムソフトウェアがオペレーティングシステムと同意語であると言えます。
しかし「最小限必要な」という定義は、かなり曖昧な表現です。なぜならば、しかし「最小限必要な」という定義は、かなり曖昧な表現です。なぜならば、ここには「'''''誰が、どのように使うか'''''」ということが抜けているからです。ここには「誰が、どのように使うか」ということが抜けているからです。この部分を拡張していけば、たとえば「ワードブロセッシングを行いたい人が使うためのコンピュータ」という場合は「バンドルされているワードプロセッサのプログラムも含めてオペレーティングシステムである」という奇妙な結論が導かれてしまいます。この部分を拡張していけば、たとえば「ワードブロセッシングを行いたい人が使うためのコンピュータ」という場合は「バンドルされているワードプロセッサのプログラムも含めてオペレーティングシステムである」という奇妙な結論が導かれてしまいます。
しかしながら、「パッケージを購入した時にバンドルされているものが最小限のセットであるので、これがオペレーティングシステムである」という誤解しかしながら、「パッケージを購入した時にバンドルされているアプリケーション群が最小限のセットなので、これがオペレーティングシステムである」という誤解
<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]ではウェブブラウザや時計などのアクセサリーも広義のオペレーティングシステムだということを書いていますが、そんなことをテストに書いて点数をくれる先生は極めて少数派でしょう。
</ref>
は一般には多いようです。
しかし、これではゲームのソリティアもオペレーティングシステムに含まれることになるので、やはり奇妙な結論と言えます。もしこれが正しいとするならば、これではゲームのソリティアもオペレーティングシステムに含まれることになるので、やはり奇妙な結論と言えます。ちなみにこの「最小パッケージ」とはGNU/Linuxのディストリビューションにあたるもので、このオペレーティングシステムの定義を採用するとなると、世の中にはおびただしい数のオペレーティングシステムの種類<ref> オープンソース系オペレーティングシステムののディストリビューションを紹介する https://distrowatch.com には実に様々なディストリビューションが紹介されています。</ref>が存在することになります。
どれくらいのものが最初に用意されるのか、Debian GNU/Linux Woodyを例にして調べてみました。6.0を例にして調べてみました。
ディレクトリ名 コマンド数
/bin 7495 /sbin 105 110 /usr/bin 275452 /usr/sbin 112107
; 補足 : 2007年ではDebian GNU/Linux Etchが最新です。
このコマンド数も先に述べたようにすべてが必要であるとは限りません。最小限インストールの状態のDebian ; 補足 : 2011年時点で最新のDebian GNU/Linuxに入っているコマンド数を数えたに過ぎません。しかしながら、いくつかのコマンドとそのコマンドで利用されるライブラリ群はオペレーティングシステムには必要になるといえます。Linux 6.0 を参考にしています。
では、グラフィカルインタフェース(GUI)を提供するためのウィンドウシステこのコマンド数も先に述べたようにすべてが必要であるとは限りません。最小限インストールの状態のDebian GNU/Linuxに入っているコマンド数を数えたに過ぎません。ムはオペレーティングシステムに入るのでしょうか?しかしながら、いくつかのコマンドとそのコマンドで利用されるライブラリ群はオペレーティングシステムには必要になるといえます。
一般的なUNIXシステムでは、GUIがなくても当然動きますし、サーバシステムではGUIなどは必須ではありません。もちろん先程のDebian GNU/Linux最小限セットの中にはX Window Systemは入っていません。逆にパーソナルコンピュータ用のオペレーティングシステムと呼ばれるものではウィンドウシステムは切り離すことができないコンポーネントとなっています。では、グラフィカルインタフェース(GUI)を提供するためのウィンドウシステムはオペレーティングシステムに入るのでしょうか?
ここまででわかったことは、まず、カーネルは確実にオペレーティングシステムであること、そして、システムを動かす時に必要なソフトウェアがいくつかあること、ただし、その必要なソフトウェアは何かの線引きは難しいということです。一般的なUNIXシステムでは、GUIがなくても当然動きますし、サーバシステムではGUIなどは必須ではありません。もちろん先程のDebian GNU/Linux最小限セットの中にはX Window Systemは入っていません。逆にパーソナルコンピュータ用のオペレーティングシステムと呼び販売されているタイプのものではウィンドウシステムは切り離すことができないコンポーネントとなっています。
=== 揺らぐ定義 ===
下はDebian GNU/Linux (Woody) を最小限のインストールして立ち上げてみた
状態です。topコマンドを使い、メモリや実行中のプロセスが、どのような状
態になっているか観察したものです。用意しているメモリは32MBですが、この
状態で使われている記憶領域は約7.8MBしか使っていません。dfを使ってディ
スクの利用状況を見てみると、約536MBのハードディスクを用意していますが
(フォーマット後の要領約500MB) 、最小のインストールでは約80MBしか使って
いません。最小限のセットを考えた場合、かなり小さくて済みます。一方、ど
んどんその適用範囲を広げていった場合、どこまでがオペレーティングシステ
ムと呼んでいいのか、どこからがそれ以外のアプリケーションと呼ぶかのはグ
ラデーションのように曖昧になることでしょう。
[[File:Screenshot-Oracle VM VirtualBox.png|thumb|right|450px|コンソールでTOPを実行]]
<PRE>右図は仮想マシンに # top 04[https:09:46 up 0 min, 1 user, load average: 0//www.00, 0virtualbox.00, 0.00org/ VirtualBox] 18 processes: 17 sleeping, 1 running, 0 zombie, 0 stoppedを使い、 CPU states[https: 0//www.0% user, 0debian.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 org/ Debian GNU/Linux] 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もちろんGUIはインストールしていません。なぜならGUIが存在しなくともきちんとコンピュータは動くからです。 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 Debian GNU/Linux 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 bashtop コマンドを使い、メモリや実行中のプロセスが、どのような状態になっているか観察してみました。 174 root 14 0 924 924 748 R 0.0 2.8 0:00 top用意しているメモリは 128MB ですが、この状態で使われている記憶領域は約 26MB しか使っていません。 # dfを使ってディスクの利用状況を見てみると、最小のインストールでは約 645MB しか使っていません。 Filesystem 1k-blocks Used Available Use% Mounted on最小限のセットを考えた場合、このように小さいメモリでも動くことができます。 /dev/ubd0 507748 80252 401282 17% /この程度の資源でも(英文であれば、ですが)十分にテキストを編集し、スペルをチェックし、フォーマットし、さらにプリンタに出力ができます。</PRE>十分に「パーソナルな」コンピュータだといえます。
== コンピュータを仮想化させる ==
我々が、アプリケーションプログラムを使う時、プログラムがコンピュータこのように使い方によって、あるいはユーザのニーズによって「最小限の」という言葉を使って表現している広義のオペレーティングシステムの意味は揺らぐのがわかるかと思います。を占有しているように見えます。しかしながら揺らぐからといって無限に定義を拡大していくような問題でもありません。そのあたりがグラデーションのようになっていて簡単には線引きないのが特徴だといえるでしょう。 == コンピュータを仮想化させる == [[File:Virtualization.png|thumb|right|450px|Virtualization]]我々が、アプリケーションプログラムを使う時、プログラムがコンピュータを占有しているように見えます。ユーザが他にどれだけのプログラムが実行されているかなど気にすることなく使うことができます。
実際は、オペレーティングシステムが、リソースを抽象化し、プログラムに使えるリソースを割り当てることをします。つまり、プログラムは、「仮想化されたコンピュータ」を割り当てられることになります。実際は、オペレーティングシステムが、リソースを抽象化し、プログラムに使えるリソースを割り当てることをします。つまり、プログラムは、「仮想化されたコンピュータ」を割り当てられることになります。ユーザに使用許可(パーミッション)が与えられている限り利用することが可能です。
UNIXでは、どのような仮想化の例があるのでしょうか? 典型的な例をいくつかあげて見ましょう。典型的な例をいくつかあげて見ましょう。
* CPUのリソースは、プログラムに対し、プロセスという単位で割り当てられます。
* 入出力装置のリソースのために、デバイスファイルという入出力装置を抽象化した入出力リソースを提供しています。
<PRE>
プログラムA --- 仮想的なコンピュータ
[プロセス(CPUの抽象化),
仮想記憶(主記憶装置の抽象化),
ファイル(補助記憶装置の抽象化),
デバイスファイル(入出力装置の抽象化)
etc.]
プログラムB --- 仮想的なコンピュータ
[プロセス(CPUの抽象化),
仮想記憶(主記憶装置の抽象化),
ファイル(補助記憶装置の抽象化),
デバイスファイル(入出力装置の抽象化)
etc.]
プログラムC ....
プログラムD ....
プログラムE ....
</PRE>
:'''捕捉''' さらに
:[[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"を出力し、その出力先を ファイルを出力し、その出力先をファイル/dev/tty への入力するという働きをします。ファイル(デバイスファイルと呼びます)への入力するという働きをします。ファイル(デバイスファイルと呼びます)/dev/ttyというのは、tty端末を抽象化したものです。というのは、端末を抽象化したものです。
 <PREsyntaxhighlight lang="bash">
% echo "Hello" > /dev/tty
Hello
</PREsyntaxhighlight>
上の図で、プログラムA、B,....E、は、オペレーティングシステムから利用可
能なリソースを割り当てられ、その中で実行しています。しかし、アプリケー
ションA、B,....は、割り当てられたリソースのコントロールを意識しません。
例えば、プログラムがデータを補助記憶装置にファイルの形でデータを残そう
とした時、プログラムが、補助記憶装置に使われているハードウェアを直接的
にコントロールする必要はありません。
つまり、1つのプログラムは、1つの仮想化されたコンピュータで動いているよ上の図で、プログラムA、B,....E、は、オペレーティングシステムから利用可能なリソースを割り当てられ、その中で実行しています。しかし、アプリケーションA、B,....は、割り当てられたリソースのコントロールを意識しません。うに見えるわけです。例えば、プログラムがデータを補助記憶装置にファイルの形でデータを残そうとした時、プログラムが、補助記憶装置に使われているハードウェアを直接的にコントロールする必要はありません。つまり、1つのプログラムは、1つの仮想化されたコンピュータで動いているように見えるわけです。
==== 不完全なリソース管理 ====
もし、直接的にコントロールするはずのないリソースをユーザのアプリケーションプログラムがオペレーティングシステムを飛び越して直接的にコントロールできるようなことがあればどうなるのでしょうか?もし、直接的にコントロールするはずのないリソースをユーザのアプリケーションプログラムがオペレーティングシステムを飛び越して直接的にコントロールできるようなことがあればどうなるのでしょうか?
例えば、ユーザのアプリケーションプログラムにバグがあり、割り当てられたリソース以外のリソースを不用意に利用してしまうようなことを許すような不完全なリソース管理のオペレーティングシステムだとどうなるでしょうか?例えば、ユーザのアプリケーションプログラムにバグがあり、割り当てられたリソース以外のリソースを不用意に利用してしまうようなことを許すような不完全なリソース管理のオペレーティングシステムだとどうなるでしょうか?
上の図で、プログラムA、B,....は、オペレーティングシステムから割り当てられたリソースを使っているわけですから、オペレーティングシステムの知らない所で、割り当てられていないリソースに勝手なことをされては、一貫性が保てません。は、オペレーティングシステムから割り当てられたリソースを使っているわけですから、オペレーティングシステムの知らない所で、割り当てられていないリソースに勝手なことをされては、一貫性が保てません。
つい最近までパソコンのオペレーティングシステムは、このような不完全なリソース管理の能力しか持っていませんでした90年代のパソコンのオペレーティングシステム(そもそも、オペレーティングシステムと呼ぶに値するのか、本来はモニタと分類すべきものではないのか、という疑問がありますがと呼ばれていたもの)は、このような不完全なリソース管理の能力しか持っていませんでした。これらはオペレーティングシステムと呼ぶに値するのか非常に疑問で、本来はまだオペレーティングシステムまで発展していない前段階の機能であるハードウェアを監視するモニタと呼ばれるものに分類するのが適切であるように思えます。
==== さらなる仮想化の例 ====
===== 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からデバイスドライバまで =====
ファイルシステムをさらに抽象化するLinuxのファイルシステムを紹介しましょう。Linuxのファイルシステムは、上位にVFS (Virtual [[File System)が存在し、その下に、またMinix、MS:Filesystem-DOS、その他のファイルシステムをもち、さらにその下にバッファキャッシュをおき、さらに下にデバイスドライバをおくという、何重もの層を持っている形になっています。プログラムは、Linuxのファイルを扱っているだけで、その下がMSlayer-DOSのファイルシステムやMinix のファイルシステムであるかを知る必要はありません。しかも、その下には、ハードディスクやフラッシュメモリ (例えばUSBメモリやSDカードなど)といった1.png|thumb|right|400px|File System Layer]]補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。[[ファイルシステム]] をさらに抽象化するLinuxのファイルシステムを紹介しましょう。その下に、装置をコントロールするためのデバイスドライバが用意されている形になります。ファイルを書き込む説明で「ハードディスクに書き込む」という表現をみたことはないでしょうか。このように重層的な構造にすることによって、抽象化を図っています。目の前にあるパソコン本体のみを考えるならば、このモノに書き出すというので説明は十分なのかも知れませんが、ファイルを書き込む・読み込むというのはもっと抽象的な動作をします。
<PRE>Linuxのファイルシステムは、上位にVFS (Virtual File System)が存在し、その下に、FAT、ext4、JFS、XFS、NFS、その他のファイルシステムをもち、さらにその下にバッファキャッシュがあり、さらに下にデバイスドライバがあるといった、何重もの層を重ねる形になっています。プログラムは、Linuxのファイルを扱っているだけで、その下がFATのファイルシステムやJFSのファイルシステムであるか、あるいはネットワーク経由でファイルシステムを使うことができるNFSなのかを知らなくても利用することが可能です。
プログラム下層には、補助記憶装置との入出力効率を改善するために、バッファキャッシュというクッションをおいてあります。 ^^^^^^^^ ========[ファイル]======= バーチャルファイルシステム さらなる下層には、ハードディスクやフラッシュメモリ (VFS例えばUSBメモリやSDカードなど) <----(+) ↑ 高 --^^----^^-----^^----------^^---- 抽象度 [ext2][msdos][minix].....[proc] ↓ 低 ---^^^^^^^^^^^^^^------- バッファキャッシュ -------^^^^^----------- デバイスドライバ------------->(+) ------^^^^^^^^^-------- ___+____+____+_ v v V HDD HDD HDD ext2 --- Linuxのファイルシステム msdos --- MSDオペレーティングシステムのファイルシステムといった記憶するためのハードウェア、あるいはNFSのようにネットワークを経由して使うためのネットワークハードウェアをコントロールするためのデバイスドライバの層があります。 minix --- MINIXのファイルシステムファイルの情報が最終的にハードディスクに書かれるとしても、ファイルを書き込む動作を行った時点で、まだハードディスクにかかれているわけではありません。 proc --- プログラムファイルシステム このようなことにより、たぶん一度や二度は経験したことがあるかも知れませんが、突然、機材の電源を停止すると永続的な情報を保持するためのエリア(Linux独自ハードディスクやUSBメモリなど)にかかれていなかったファイルの情報は消えてしまうことになります。
<blockquote>
<syntaxhighlight lang="bash">
% sync;sync;sync
</syntaxhighlight>
 
sync
<ref>
syncを三回するのは "In the name of the Father, and of the Son, and of the Holy Spirit.(父と子と精霊の御名において)"と唱えて強制的にハードウェアリセットをするためだとむかし誰かに教わった。
</ref>
はバッファキャッシュなどにある情報を含めてすべてデバイスに同期させるコマンド。
</blockquote>
</PRE>このように重層的な構造にすることによって、抽象化を図り、かつどの層が変化しようとも、上位の層がその違いを吸収するような形になっています。またこのような枠組みにより柔軟に機能・モジュールを追加、変更することが出来る仕組みになっています。
== 脚注 ==