応用プログラミング パイプの概念とデータストリーム ダグラス・マキルロイ

twcritique
パイプで連結することを前提とした構成のプログラムをフィルタと呼ぶ。ラストワンマイル。プログラミング入門

パイプってなんだ

パイプ(pipe)、もしくはパイプライン (pipeline) とは、複数のプログラムの入出力をつなぐための仕組みの一つである。
パイプ (コンピュータ) – Wikipedia

プロセス群の標準ストリームを連鎖的に相互接続するもので、あるプロセスの標準出力 (stout) を直接別のプロセスの標準入力 (stdin) に接続する。このような接続の実装を匿名パイプ(英語版)と呼ぶ。このアイデアはUNIXやUnix系のOS以外にも、MS-DOS をはじめとする様々なOSやアプリケーションに、動作に多少の違いはあるものの受け継がれている。パイプで連結することを前提とした構成のプログラムをフィルタと呼ぶ。


https://matome.naver.jp/odai/2135502467033263101/2150244390121859803
同じコンテキストを別の処理に渡し、情報を変換する流れ

パイプとはコマンドの実行結果を,次のコマンドの入力として扱えるようにするシェルの機能である。パイプを利用するには,「|」という記号を用いる。
Linuxコマンド逆引き大全 – 【 パイプの使い方 】:ITpro

すると,左のコマンドの結果を右のコマンドに入力として引き渡すことができる。パイプを用いることで,出力結果をいったんファイルに落とすことなく,複数個のコマンドを1回の操作で実行できるようになる。

以下が典型的なパイプの利用例である。|(バーティカルバー) はシェルにパイプを指示する記号である。
パイプ (コンピュータ) – Wikipedia

grep 札幌市 Address.txt | a2ps | lpr

パイプを考えた人 ダグラス・マキルロイ通称マキ様

ダグラス・マキルロイがUnixシェル向けに考案したもので、パイプライン輸送からの連想で名付けられた
パイプ (コンピュータ) – Wikipedia

彼は、あるプログラムの出力を別のプログラムの入力とするような処理が非常に多いことに気付き、パイプを考案するに至った。そのアイデアを1973年、ケン・トンプソンがUNIXにパイプとして実装した[2]。その後、DOS、OS/2、Microsoft Windows、BeOSといったOSにほぼ同じ記法でパイプが採用されていった。

パイプのとらえかた

UNIXのパイプは左側結合(英語版)で中置記法の演算子と見ることができ、そのオペランドはパラメータ付きのプログラムである。プログラム的観点ではパイプ内の全プログラムは同時(並列)に動作すると見なせるが、構文的には左から順に実行されると見ることができる。パイプは一種の写像の合成である。関数型プログラミングで、ある関数の出力を別の関数の引数(入力)として渡すのに似ている。
パイプ (コンピュータ) – Wikipedia

パイプ (コンピュータ) – Wikipedia

パイプライン処理(パイプラインしょり)とは、コンピュータにおける処理要素を直列に連結し、ある要素の出力が次の要素の入力となるように配置して処理することである。
パイプライン処理 – Wikipedia

ライン生産方式の例で示したように、パイプライン処理は単一のデータの処理を高速化するわけではなく、データストリームの処理をする際のシステムのスループットを向上させるだけである。
パイプラインを長くすると、レイテンシは増大し、1つの信号がパイプの先から先まで到達するのに時間がかかるようになる。
パイプライン化されたシステムでは、あるステージが前のステージのリソース(回路、処理装置、メモリなど)を再利用できないため、一般に1つずつ処理するシステムよりも多くのリソースを必要とする。さらに言えば、パイプライン処理によって1つの命令の完了にかかる時間は増大する可能性がある。
パイプライン処理 – Wikipedia

ソフトウェアでも、パイプライン処理は行われる。その場合は、複数のスレッドを使い、マルチスレッドを使い実装する。
パイプライン処理 – Wikipedia

一般に、オブジェクト指向の場合、情報が発生する側から情報を受け取る側に情報を渡すときは、Observer パターンを使う。パイプライン処理をオブジェクト指向で実装する場合も、普通のメソッド呼び出しではなく、Observer パターンで前のスレッドからデータを受け取り、受け取った側のスレッドでキューにデータをためる、というのが基本形の実装方法である。
前のスレッドと後ろのスレッドでスレッドの競合を避けるために、キューにロックをかけてからキューの読み書きをするのではなく、Lock-freeなキューを使って、ロックをかけずに、キューの読み書きをすることも多い。

NATOソフトウェアエンジニアリング・カンファレンスでは、米AT&Tのベル研究所のM・ダグラス・マキルロイ(M. Douglas McIlroy)がソフトウェア部品の組み合わせによってソフトウェアを開発する方法を提唱し、その環境を「コンポーネントファクトリー」と呼んでいる。
情報システム用語事典:ソフトウェアファクトリ(そふとうぇあふぁくとり) – ITmedia エンタープライズ

ダグラス・マキルロイ(M. Douglas McIlroy)(1932年誕生)は数学者であり、エンジニアであり、プログラマーである。 2007年時点で、彼はDartmouth Collegeのコンピューターサイエンスの非常勤教授である。Dr. McIlroyは元々はUnixパイプライン、ソフトウェアの構成部品、そしてspell、diff、sort、join、graph、speak、trのようないくつかのUnixツールを発明したことで知られている。
彼のソフトウェアのコンポーネント化の独創性に富んだ研究は、彼をソフトウェアエンジニアリングとソフトウェア製品ラインのエンジニアリングを構成基礎とする先駆者に位置づけている。

どうもマキ様の記述がのっているらしい

パイプのしくみ バッファリング

多くのUnix系システムでは、パイプを構成する全プロセスは入出力が適切に相互接続された状態で同時に起動し、同じマシン上の他のプロセスと同様にスケジューリングされる。このとき重要な観点として、パイプの仕組みであるバッファリングがOS側で提供されている。
パイプ (コンピュータ) – Wikipedia

例えば、あるプロセスが毎秒5000バイトのデータをパイプに送り込み、受け取る側のプロセスが毎秒100バイトしか処理できないとする。それでもデータは失われない。実際にはカーネル内で送信側プログラムの出力がキューに保持され、受信側プログラムがデータ読み取り可能となったとき、カーネルがキューからデータを送り、キュー上で送信済みとなったデータを削除する。キューの容量上限までデータが溜まると、送信側プロセスがブロックされ、受信側が溜まったデータを処理するのを待ち合わせる。Linuxではこのバッファの大きさは65536バイトとなっている。


https://matome.naver.jp/odai/2135502467033263101/2137712342630854103
パイプの概念図
下回りが微妙だが、とりあえずイメージ

PlaggerとYahoo!Pipes パイプのような使いごこち

パイプ豆知識

MS-DOS におけるパイプは、シングルタスク OS という制約のためパイプの動作は中間ファイルによってエミュレートされている
パイプ (コンピュータ) – Wikipedia

あーなんか身に覚えある

pipe関数でいうパイプとは、バッファーのようなもの。
パイプに対してデータを書き込んでおき、そのパイプからデータを読み込むことが出来る。

このバッファーはOS(カーネル)の機能を使っている。一時ファイルのようなイメージ。
なので、1つのパイプを複数のプロセスで共有すれば、プロセス間通信に使うことが出来る。
C言語pipeメモ(Hishidama’s C “pipe” Memo)

https://matome.naver.jp/odai/2135502467033263101
2019年07月09日