私はよく「Unixのユニークな哲学は、すべてをファイルとして扱う」または「Unixではすべてがファイルである」と言うことをよく耳にします。しかし、それがなぜUnixに特有なのかを誰も説明するのを聞いたことがありません。
それでは、なぜこれがUnixに特有なのでしょうか?WindowsやMacなどの他のオペレーティングシステムはファイルで動作しませんか?
また、他のオペレーティングシステムと比較してユニークですか?
私はよく「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ライクになります。
WriteFile
。しかし、さらに、ファイルだけでなくミューテックスも含む「同期オブジェクト」のさらに大きなカテゴリがあります。
「すべてがファイルである」という考えは、Multicsから生まれました。Unixの設計者は、多くの仕事を前任者、特にMulticsに基づいていました。実際、コンピューティングの多くのことは前任者に基づいています。
Unixの設計におけるデニス・リッチーの晩年の研究をもっと読むことができます。彼は、ツリーのようなファイルシステム、コマンドシェル、ファイルの非構造化など、Multicsから「コピー」されたものを参照しました。Unixの人々がMulticsの人々から盗んだことを暗示しているわけではありません。すべての意図と目的のために、それは同じ人々でした。
ユニークですか?いいえ。定義していますか?絶対に。
すべてをファイルまたは既知の階層のデバイスとして持つことは、すべてに同じツールセットを使用できることを意味します。Bell LabsのPlan 9は、ファイルとしてハードウェアデバイスを使用してもこれをさらに進めます。
さらに重要なことは、これにより2つの非常にシンプルで強力な概念が可能になることです。One Thing Well(tm)を実行する基本ユーティリティ。必要に応じてパイプでつなぐことができます。テキストファイルで何かを見つけたいですか?を使用cat
して表示し、通過させgrep
、ガスで調理します。これが、「Unix」方式の真の力です。特殊なアプリケーションが連携して非常に大きな柔軟性を実現します。
Mac OS Xはまた、Unixの哲学に従うが、隠された方が良いでしょう(「アプリケーション」バンドルが本当にファイルの完全なディレクトリである)、そして実際にはUnixの認定を受け、適切である、の子孫のNeXTのビット使用し、FreeBSDの。
Windowsには、イベントビューアやレジストリなどのバイナリコンポーネントがいくつかあります。その特定のシナリオでは、速度上の利点がいくつかあります。
特殊ファイルのため。「すべてがUnixのファイルである」と人々が言うとき、一般的なファイルとディレクトリは彼らが念頭に置いているものではありません。特殊ファイルはUnixライクなOSに固有のもので、その多くがあります。したがって、 Unixに固有のものではありません。
特殊ファイルには多くの目的があります。たとえば、パイプ、ソケット、そして最も注目すべきはデバイスファイルです。パイプとソケットは、プロセス間の通信ストリームです。サブシステムの機能の多くは、デバイスファイルを介してユーザー空間で利用できます。
プログラムは、通常のファイルを使用するのと同じようにそれらを使用します。実際、ほとんどの場合、使用するファイルの種類を気にしません。そのため、Unixコマンドを非常に多様に組み合わせて強力な新しいシステムを形成できます。(おがくずの答えのI / Oリダイレクトを参照)
前述のように、これらはユーザー空間のインターフェイスのように機能します。たとえば、CDトレイを取り出すために、プログラマは最初に対応するデバイスファイルを開きます。別の例:プログラムで仮想端末を切り替えたい場合。最初に/ dev / consoleを開きます。
次に何が起こるかは単なる文字を送信していないにそれらのファイルが、発行)(のioctlの上の彼ら。発行できる個々のioctlは、デバイスによって異なります。たとえば、コンソールはconsole_ioctl(4)に文書化されています
私はおそらくこれを言ったことで名声を得ようとしていますが、すべてがUnixのファイルであると言うのは実際には誤りです。それは本当に2つのことです。
ファイルシステムはこの名前空間を実装し、これらのオブジェクトへのインターフェイス関数のディスパッチを可能にするフレームワークを実装します。ファイルシステムは、最初にファイルを格納するために概念化されましたが、その後、ネームスペース階層内の他のオブジェクトを整理するために採用されました。オブジェクト指向以前のポリモーフィズムの例は、ものでした。
すべてのファイルを呼び出すだけで害はありません。しかし実際には、これらはより一般的なオブジェクトです(ファイルはそのようなオブジェクトの1つです)。この観点から見ると、この考えはUnixに固有のものではありません。他の多くのOSは、このようなポリモーフィックオブジェクトの階層を実装しています。
mmap()
もちろん、できることはほとんどありません。...)
人々が「Unixでは、すべてがファイルである」と言うとき、彼らが意味するのは、ファイルではないものもファイルとして扱われるということです。
もちろん、ほとんどのオペレーティングシステムはファイルを処理します。テキストファイル、画像ファイル、音声ファイル。ただし、すべてのオペレーティングシステムがデバイスをファイルとして扱うわけではありません。それは重要な違いです。Ubuntuオペレーティングシステム(Unixベース)の/ dev /フォルダーのコンテンツを一覧表示すると、200を超えるデバイスの一覧が表示されます。これらのデバイスの一部はハードウェアですが、フォルダー内に表示されます。たとえば、ハードドライブ、USBポート、マウスとキーボード、オーディオデバイスとプリンターなどです。一部のデバイスは仮想です。たとえば、/ dev / urandomは、乱数でいっぱいの無限ファイルとして動作します。それは私のハードドライブ上の実際のファイルではありません。
これらのデバイスはすべてファイルとして扱われます。これらのデバイスからデータを読み取ったり、それらのデバイスにデータを書き込んだりできます。ここに、異なるデバイスからオーディオデバイスにデータをコピーする例があります。ファイルとして扱われるため、これが可能です。(マニアックな)結果は、ハードドライブのコンテンツ、マウスの動き、コンピューターのメモリ、または画像のピクセルを聞く能力です。デバイスがファイルとして処理されない場合、これは達成するのがはるかに困難です。これは、各デバイスがデータの読み取りと書き込みに異なる方法を必要とするためです。
そうは言っても、「すべて」の意味はシステムによって異なります。たとえば、OS XはUnixベースですが、/ dev / audioデバイスはありません。CoreAudioと呼ばれる独自のオーディオシステムを使用します。したがって、この場合、「ほとんどすべてがファイルです」と言うかもしれません。次に、「すべてがファイルではない」Windowsなどのシステムでは、ファイルの内容をプリンターポートにコピーするなどの操作を行うことができます(たとえば、次のように入力しますcopy mydocument.txt >lpt1:
)。システム。
WindowsやOS Xなどの他のオペレーティングシステムはファイルで動作しませんか?はい、彼らがやります。WindowsとOS Xはファイルを操作しますが、Windowsはデバイスをファイルとして扱いません。これは「すべてがファイル」の意味の一部です。
Multicsは「すべてがファイル」のソースとして引用されているように見えますが、デバイスファイル、名前付きパイプ、通常のファイルなどよりも少し深く見る必要があると思います。ファイルの命名構文を調べる必要があります。これは、AUX、CON、LPの「マジックファイル名」が存在する場合でも大きな違いをもたらします。
Rob Pikeによる「The Hideous Name」を参照してください。Unixファイル名の構文と、他のいくつかの構文、特にVMSを比較します。Unixが生まれた60年代後半/ 70年代前半のメインフレームOSには、現代の人が非常にロココ様式のファイル命名構文を考慮するものがあったことに注意してください。VM / CMS、またはNOSまたはNOS / VEを使用してから何年も経ち、Univac OSを使用している人の肩越しにだけ見てきましたが、癖が規則性を上回っていると言えば十分です。
Multicsが実行されるのを見たことがありませんが、そのファイルシステムに関する論文を見ることができます。オリジナルのUnixはMulticsがやったよりも「すべてはファイル」であるように見えましたが、あなたの走行距離は異なるかもしれません。
Linus Torvaldsでさえ、「すべてがファイルである」ことに同意しないことに注意してください。「を検索する場合
すべてがバイトストリームです
「すべてがファイルではなく、たとえばメモリ内の抽象的なデータ構造またはポインターが確実にファイルではないことを意味する興味深い哲学を見つけることができます。もちろん、何でもファイルとして表現できますが、表現と存在は2つの異なるアクションです。
The UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".