Unixパイプの正確な工夫は何ですか


52

ダグラス・マックロイがどのようにコンセプトを思いついたのか、そしてケン・トンプソンがそれを一晩でどのように実装したのかという話を聞いたことがあります。

私が理解している限り、パイプは、1つのプロセスが書き込みと他の読み取りを行う2つのプロセス間でメモリを共有するシステムコールです。

OSの内部や概念に精通していない人として、私はストーリーの「天才」とは一体何なのか疑問に思っていました。メモリを共有する2つのプロセスのアイデアですか?それとも実装ですか?または両方?

PS:パイプの有用性やシェルでの使用方法を知っています。問題は、の概念と実装に関するものです|


4
当時は、アプリケーションを構成するメカニズムを実装することを強く推進することは非常に急進的だったと思います。そのためには、インターフェイスを実装から分離するという適切な形式の概念を持ち、プログラミングにおける機能構成の有用性を実現する必要があります。
チャンホーSuh

4
それだけでなく、すでに実行中のアプリケーションには、標準入力ハンドルと標準出力ハンドルがあり、UnixライクなオペレーティングシステムAPIには、これらのハンドルに適用する読み取り/書き込み機能がありました。いくつかの直交する非常に有能な概念(ハンドル、出力、およびそれらからの入力)を巧みに使用すると、パイプだけでなく、ソケット、キャラクターとデバイスの相互作用、その他多数のことにもつながります。ファイルハンドル(キーボード入力とテキスト出力を提供するtty用)ができたので、一方のアプリケーションが他方のttyになるようにアプリケーションを作成しましょう。
ウォーレンP

6
@WarrenPは実際には、Unixのは、標準入力と標準出力を持っためのpipe()システムコールと|シェル演算子(:REF マッキロイ)。または、ヴォルテールが言ったように、「[stdio]が存在しなかった場合、発明する必要があります。」:
ロスパターソン

AFTERパイプまでファイルハンドル、入出力ハンドルなどはありませんでしたか?
ウォーレンP

4
@WarrenP:パターソンが言っていることはこれのように聞こえます:最初にファイルハンドルがありました。次に、これらの人は、各プログラムがデフォルトで入力ハンドルと出力ハンドルを持ち、プログラムが簡単に連鎖できるようにするというアイデアを思いつきました。これらは「標準」入出力として知られるようになりました。
Mooingダック

回答:


109

私が理解している限り、パイプは、1つのプロセスが書き込みと他の読み取りを行う2つのプロセス間でメモリを共有するシステムコールです。

実際、関与する共有メモリはありません。リーダーとライターはアドレス空間の一部を共有しておらず、明示的な同期を使用していません。

読み取りおよび書き込みプロセスは、ファイルの読み取り/書き込みを行っている場合とまったく同じように行われreadwriteシステムコールが行われます。それは天才です...革新:(単純な)プロセス間通信とファイルI / Oは同じ方法で処理できるという概念です...アプリケーションプログラマーとユーザーの観点から。

パイプが設定されると、OS(アプリケーションコードやユーザー空間のライブラリではない)がバッファリングと調整を処理します。透過的に。


対照的に、パイプ概念の発明の前に、「パイプライン」処理を行う必要がある場合、通常、1つのアプリケーションがファイルに出力を書き込み、それが終了したら、2番目のアプリケーションを実行して、ファイル。

また、真のパイプラインが必要な場合は、両方のアプリケーションをコーディングして(実際の)共有メモリセグメントを設定し、セマフォ(または何か)を使用して読み取り/書き込みを調整できます。複雑な...そして結果として頻繁に行われません。


34
「それは天才です...イノベーション:プロセス間通信とファイルI / Oを同じ方法で処理できるという概念」-まさにこれ。これにより、決して設計されていないプログラム間でプロセス間通信を行うことができ、何が起こっているかさえ知らない(必要としない)ことができます。
Guntram BlohmはMonicaをサポートします

6
また、Unixはテキスト処理用に設計されているため、IPCにファイルI / Oを使用する理由が主に有用であったことに注意することも有用です-プログラムからプログラムへのテキストデータのストリーミングにより、比較的簡単な構成が可能になり、システム全体を構築できるようになりました(おそらく)単純な操作の長いチェーンでデータを相互にストリーミングする比較的単純な小さなプログラム。基本的に、テキスト処理を処理するための比較的柔軟な言語を持っていることを意味します。
ルアン

1
したがって、「Unixパイプの不正」は「Unixの不正」です。すべてのI / O(プロセス間通信、標準ファイル、およびその他のファイルシステムオブジェクトを含む)はファイルとして処理されます。
マークハード

天才の別のストロークは、UNIXがすべてのバイトがカウントされたときに人間が読めるファイル構造を提唱したこと
でした...-EvertW

14

私の意見では、「パイプ」のアイデアの天才は使いやすさです。

システムコールを行ったり、メモリを割り当てたりする必要はありません。複雑なことはまったくありません。シェルでは、単一の文字を使用します|。これにより、単純な(または複雑な)ツールを特定のタスクに組み合わせることで、並外れた力が得られます。

テキストをきちんと並べ替えるなど、いくつかの一般的な日常のタスクを実行します。たくさんの名前をリストするコマンドがあるかもしれません。(私の例では、listofrandomnames.comの好意により、名前の束を含むファイルを使用します。)パイプを使用すると、次のようなことができます。

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

これはほんの一例です。何千もあります。パイプを使用することで著しく簡単になった他のいくつかの特定のタスクについては、このページの「The Unix Philosophy」セクションを参照してください


この答えを強調するには、プレゼンテーションのスライド4〜9、「なぜZshがあなたのシェルよりもクールなのか」を参照してください


上記のコマンドにUUOCが含まれることを認識しています。テキストを生成する任意のコマンドのプレースホルダーであるため、それをそのままにします。


3
小さな小さなメモ:より速くsort -u仕事をすることができますsort | uniq
Iwillnotexist Idonotexist

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100あなたはそれに慣れているかもしれませんが、私はそれをまったく簡単とは呼びません。特にawk部品。
フェデリコポロニ

パイプは簡単です。「... 特定のタスクに対する単純な(または複雑な)ツールの組み合わせにおける並外れた力」と言いました。
ワイルドカード

5

そこで、PDP-10 / TOPS-10のマニュアルを探して、パイプの前に最新技術が何であったかを調べることで、これについて少し研究を試みました。私はこれを見つけましたが、TOPS-10はグーグルにとって非常に難しいです。パイプの発明に関する良い参考文献がいくつかあります:UNIXの歴史と影響に関するMcIlroyへのインタビュー

これを歴史的な文脈に入れなければなりません。私たちが当たり前と思っている現代のツールと便利さはほとんどありませんでした。

「最初は、トンプソンはPDP自体でプログラミングさえしなかったが、代わりにGE-635マシンのGEMAPアセンブラーにマクロのセットを使用した。」(29)GE 635で紙テープが生成され、テストされたリッチーによれば、「原始的なUnixカーネル、エディター、アセンブラー、単純なシェル(コマンドインタープリター)、およびいくつかのユーティリティ(Unix rm、cat、cpコマンドなど)が完了するまで、PDP-7。ポイントは、オペレーティングシステムが自立型であり、プログラムは紙テープに頼らずに作成およびテストでき、開発はPDP-7自体で継続されたということです。

PDP-7はこのように見えます。対話型ディスプレイまたはハードディスクがないことに注意してください。「ファイルシステム」は磁気テープに保存されます。プログラムとデータ用に最大64kBのメモリがありました。

その環境では、プログラマは、テープをスピンアップし、テープインターフェイスから直接読み取った文字を1つずつ処理するコマンドを発行するなどして、ハードウェアに直接対処する傾向がありました。UNIXはこれを抽象化したので、「テレタイプから読み取る」と「テープから読み取る」別々のインターフェイスではなく、それらを1つにまとめ、「ディスクに一時コピーを保存せずに他のプログラムの出力から読み取る」という重要なパイプを追加しましたまたはテープ」。

これは、McIlroyによる発明ですgrep。これは、UNIX以前の環境で必要な作業量を要約するのに良い仕事だと思います。

「グレップは私のために発明されました。音声シンセサイザーでテキストを読み上げるプログラムを作成していました。音声規則を発明したので、失敗する可能性のある単語がないかウェブスターの辞書をチェックします。 「フルーツ」、「ガイル」、「罪悪感」、「アングイッシュ」、「イントゥイット」、「ベギン」など、さまざまな方法で発音されているui」?リストを選択するためのグローバルコマンドです。提案された各ルールがどのように機能するかを確認するために、edで繰り返しスキャンすることでこのリストを削ります。」

「辞書を分割しなければならなかったので、プロセスは退屈でひどく無駄でした(分割コピーをオンラインに残す余裕はありませんでした)。次に、edは各部分を/ tmpにコピーし、gコマンドを実行するために2回スキャンし、そして最後にそれを捨てました。これも時間がかかります。」

「ある午後、私はケン・トンプソンに正規表現レコグナイザーをエディターから外して、それを行うためのワンパスプログラムを作ってくれないかと尋ねました。彼はイエスと言いました。その面白い名前の意味を尋ねられたとき、ケンはそれが明らかであると言いました。それはシミュレートしたエディタコマンドg / re / p(グローバル正規表現印刷)の略でした。

その最初の部分をcat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100例と比較してください。オプションが「コマンドラインを構築する」と「アセンブラで手動でプログラムを作成する」の場合、コマンドラインを構築する価値があります。(紙の)マニュアルを読むのに数時間かかる場合でも。その後、将来の参照のために書き留めることができます。


1

Pipesの天才は、3つの重要なアイデアを組み合わせていることです。

まず、パイプは「コルーチン」の実用的な実装であり、1958年にコンウェイによって造られた用語であり、有望ではあったが、パイプの前にはほとんど実用的ではなかった。

第二に、シェル言語でパイプを実装することにより、トンプソンらは最初の本当の「接着剤言語」を発明しました。

これらの2つのポイントにより、再利用可能なソフトウェアコンポーネントを低レベルの最適化された言語で効率的に開発し、それらをつなぎ合わせてより大規模で複雑な機能を形成できます。彼らはこれを「大規模プログラミング」と呼びました。

第三に、ファイルアクセスに使用されたのと同じシステムコールを使用してパイプを実装すると、ユニバーサルインターフェイスでプログラムを作成できます。これにより、ソフトウェアの問題に対する真に普遍的な解決策が可能になりました。これは、ファイルからのデータを使用して対話形式で使用できます。コンパイルも設定も不要で、簡単なシェルコマンドがいくつかあります。

学習曲線を通り抜けたいと思うなら、UNIXソフトウェアは40年前と同じくらい便利です。私たちは、彼らが既に知っており、ソリューションを構築しているものを常に再発明しています。そして、重要なブレークスルーはシンプルなパイプでした。その後の唯一の真の革新は、80年代のインターネットの創造でした。劇的に、UNIXは別個のAPIを作成することにより、その実装に失敗しました。私たちはまだ結果に苦しんでいます...ああ、そうです、80年代後半に人気になったビデオディスプレイとマウスがありました。しかし、それはWIMP向けです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.