「Unixの独自の哲学は、すべてをファイルとして扱う」または「Unixではすべてがファイルである」という人々の意見をよく耳にします。しかし、なぜそれがUnixに特有なのか誰もが説明するのを聞いたことがありません。
では、なぜこれがUnixに固有なのでしょうか。 WindowsやMacなどの他のオペレーティングシステムはファイルを操作しませんか?
そして、それは他のオペレーティングシステムと比較してユニークですか?
では、なぜこれがUnixに固有なのでしょうか?
Unixより前の典型的なオペレーティングシステムは、ファイルを一方向で処理し、その周辺機器をそのデバイスの特性に従って処理していました。つまり、プログラムの出力がディスク上のファイルに書き込まれた場合、それが出力を配置できる唯一の場所でした。プリンタまたはテープドライブに送信できませんでした。各プログラムは、入出力に使用される各デバイスを認識する必要があり、代替I/Oデバイスを処理するコマンドオプションが必要です。
Unixはすべてのデバイスをファイルとして扱いますが、特別な属性があります。プログラムを簡略化するために、標準入力および標準出力がデフォルトの入力であり、プログラムの出力デバイス。そのため、通常コンソール画面を対象としたプログラム出力は、ディスクファイル、プリンタ、またはシリアルポートなど、どこにでも移動できます。これはI/Oリダイレクトと呼ばれます。
WindowsやMacなどの他のオペレーティングシステムはファイルを操作しませんか?
もちろん、すべての最新のOSはさまざまなファイルシステムをサポートし、「ファイルを操作」できますが、デバイスの処理方法の違いは何ですか。 Macについては知りませんが、WindowsはI/Oリダイレクトを提供しています。
また、他のどのオペレーティングシステムと比較してユニークですか?
実際にはもうありません。 Linuxにも同じ機能があります。もちろん、OSがI/Oリダイレクションを採用している場合、他のUnix機能を使用する傾向があり、最終的にはUnixのようなものになります。
「すべてがファイルである」という考えはMulticsから生まれました。 Unixの設計者は、多くの仕事を前任者、特にMulticsに基づいていました。実際、コンピューティングにおける多くのことは、前任者に基づいています。
詳細については、Unixの設計における故Dennis Ritchieの研究を読んでください。ツリーのようなファイルシステム、コマンドシェル、ファイルの非構造化など、Multicsから「コピー」したものを参照しました。 Unixの人々がMulticsの人々から盗んだという意味ではありません。すべての意図と目的のために、それは同じ人々でした。
ユニーク?いいえ。定義?もちろんです。
すべてを既知の階層内のファイルまたはデバイスとして持つことは、すべてに同じツールセットを使用できることを意味します。 Bell LabsのPlan 9は、これをハードウェアデバイスでもファイルとして扱います。
さらに重要なことに、これにより2つの非常にシンプルで強力な概念が可能になります。 One Thing Well(tm)を実行する基本ユーティリティ。必要に応じてパイプと一緒に接続できます。テキストファイルで何かを見つけたいですか?表示するにはcat
を使用し、grep
に渡します。ガスで調理しています。 それは 'Unix'の真の力です-特化したアプリケーションが連携して大規模な柔軟性を実現します。
Mac OS XもUnixの理念に従っていますが、非表示にした方がよく(「アプリケーション」バンドルは実際にはファイルでいっぱいのディレクトリです)、実際には NeXT から派生した適切な認定済みUnixです。 FreeBSD のビットを使用。
Windowsでは、それ以来、イベントビューアやレジストリなどのバイナリコンポーネントがいくつかあり、その特定のシナリオでは速度の利点がいくつかあります。
特殊ファイルのため。人々が「すべてがUnixのファイルである」と言うとき、一般的なファイルとディレクトリは彼らが考えているものではありません。特別なファイルはUnixライクなOSに固有のものであり、その中には数多くあります。したがって、これはtheUnixに固有のものではありません。
特殊ファイルは多くの目的に役立ちます。たとえば、パイプ、ソケット、特にデバイスファイル。パイプとソケットは、プロセス間の通信ストリームです。サブシステムの機能の多くは、デバイスファイルを通じてユーザー空間で利用できます。
プログラムは、通常のファイルを使用するのと同じようにそれらを使用します。実際、ほとんどの場合、ユーザーは使用するファイルの種類を気にしません。そのため、Unixコマンドを多様に組み合わせて、強力な新しいシステムを形成できます。 (おがくずの答えのI/Oリダイレクトを参照してください)
前述のように、これらはユーザー空間のインターフェースのように機能します。たとえば、CDトレイを取り出すために、プログラマは最初に対応するデバイスファイルを開きます。別の例:プログラムで仮想端末を切り替えたいとします。最初に/ dev/consoleを開きます。
次に発生するのは、単なる文字をに送信するのではなく、 ioctl() 'sonそれら。発行できる個々のioctlは、デバイスによって異なります。例えば。コンソールは console_ioctl(4) に文書化されています
私はおそらくこれを言うためにリーマを取得するつもりですが、すべてがUnixのファイルであるということは実際には誤りだと思います。それは実際には2つのことです。
ファイルシステムはこの名前空間を実装し、これらのオブジェクトへのインターフェース関数のディスパッチを可能にするフレームワークを実装します。ファイルシステムは最初にファイルを格納するために概念化されましたが、その後、ネームスペース階層で他のオブジェクトを編成するように選択されました。オブジェクト指向以前のポリモーフィズムの例は物でした。
すべてのファイルを呼び出すだけで害はありません。しかし実際には、これらはより一般的なオブジェクトです(そのようなオブジェクトの1つであるファイル)。この観点から見ると、このアイデアはUnixに固有のものではありません。他の多くのOSは、このような多態性オブジェクトの階層を実装しています。
人々が「Unixではすべてがファイルである」と言うとき、彼らが意味することは、ファイルではないものもファイルとして扱われるということです。
もちろん、ほとんどのオペレーティングシステムはファイルで動作します。テキストファイル、画像ファイル、音声ファイル。ただし、すべてのオペレーティングシステムがデバイスをファイルとして扱うわけではありません。それは重要な違いです。 Ubuntuオペレーティングシステム(Unixベース)の/ dev /フォルダーのコンテンツを一覧表示すると、200を超えるデバイスのリストが表示されます。これらのデバイスの一部はハードウェアですが、フォルダー内に表示されます。たとえば、ハードドライブ、USBポート、マウスとキーボード、オーディオデバイス、プリンターなどです。一部のデバイスは仮想デバイスです。たとえば、/ dev/urandomは、乱数でいっぱいの無限ファイルとして動作します。それは私のハードドライブ上の実際のファイルではありません。
これらのデバイスはすべてファイルとして扱われます。これらのデバイスからデータを読み書きできます。 ここに例があります さまざまなデバイスからオーディオデバイスにデータをコピーします。これは、ファイルとして扱われるため可能です。 (マニアックな)結果は、ハードドライブのコンテンツ、マウスの動き、コンピューターのメモリ、または画像のピクセルを聞く機能です。各デバイスがデータの読み取りと書き込みに異なる方法を必要とするため、デバイスがファイルとして扱われなかった場合、これを実現するのははるかに困難です。
そうは言っても、「すべて」の意味はシステムによって異なります。たとえば、OS XはUnixベースですが、/ dev/audioデバイスがありません。 CoreAudioと呼ばれる独自のオーディオシステムを使用します。したがって、この場合、「ほとんどすべてがファイルです」と言うかもしれません。次に、「すべてがファイルではない」Windowsのようなシステムでは、ファイルの内容をプリンターポートにコピーする(copy mydocument.txt >lpt1:
のようなものを入力する)などの操作を行うことができます。 Unixシステムのプリンタデバイス。
WindowsやOS Xなどの他のオペレーティングシステムはファイルを操作しませんか?はい、彼らはやる。 WindowsとOS Xはファイルを操作しますが、Windowsはデバイスをファイルとして扱いません。これは「すべてがファイルである」という意味の一部です。
Multicsは「すべてがファイル」のソースとして引用されているようですが、デバイスファイル、名前付きパイプ、通常のファイルなどだけではなく、少し深く調べなければなりません。ファイルの名前付け構文を調べる必要があります。これは、AUX、CON、LPの「マジックファイル名」が存在する場合でも、大きな違いをもたらします。
Rob Pikeの " The Hideous Name "を参照してください。 Unixファイルの名前付け構文を他のいくつかの構文、特にVMSと比較します。 Unixが生まれた60年代後半/ 70年代前半のメインフレームOSには、現代の人々が特別にrococoファイルの名前付け構文を考慮していたものがあることに注意してください。 VM/CMSまたはNOSまたはNOS/VEを使用してから何年か経ちましたが、Univac OSを使用している人の肩越しに見ただけですが、癖は規則性を上回った。
私はMulticsの実行を見たことはありませんが、 ファイルシステムに関する論文 を確認できます。オリジナルのUnixはMulticsよりも「すべてがファイル」であるように見えましたが、実際の距離は異なる場合があります。
Linus Torvaldsでさえ、「すべてがファイルである」ということに同意しないことに注意してください。 「を検索した場合
すべてがバイトストリームです
"すべてがファイルではなく、たとえばメモリ内の抽象的なデータ構造ではない、またはポインタがファイルではないという意味で興味深い哲学を見つけるでしょう。OK確かに何でもファイルとして表されるですが、表現することと存在することは、2つの異なるアクションです。