パイプとキューという概念

ITシステムの基礎知識を解説(IT素人さん向け)リンクリストに戻る

最初にお断りしておくがここで技術の話をするつもりはない。
このブログは非情技(非ITエンジニア)向けに記事を書いており、技術に近い話も「この概念は非情技の人にも役に立つのではないか」と思って解説している。
以前紹介した「レイヤー」のようにコンピュータを実現する為に考えられた概念の中には情技師(ITエンジニア)でなくても役に立つモノの考え方がたくさん有る。
Windowsなどを使用しているとWordやExcel,ブラウザなど同時に複数のアプリ(プログラム)が実行できることは知っていると思う。
これらの起動中のアプリのことを「プロセス」とか「タスク」と呼ぶ。
通常は「プロセス」の方をよく使う。
アプリとかソフトウェアとは「命令の束」でありストレージ(HDD,SSD)に保存されているだけでは機能しない。
OSによって「命令の束」がメインメモリに読み込まれて、さらにそこに「作業用メモリ空間」をOSに与えられて初めて動くことが可能になる。
この「命令の束」が「作業用メモリ空間」を与えられて、動ける状態になったアプリ(ソフトウェア)を「プロセス(タスク)」と呼ぶ。
Excelなどを使用していれば分かると思うが、アプリは二重起動三重起動などメモリサイズの許す限りいくつでも起動できる。
言い換えれば「一つのアプリから複数のプロセスを作る事ができる」と言える。
ちょうど一つの「鯛焼きの型」からいくつもの「鯛焼き」を作る事ができるように。
プロセスとプロセスは互いに様々な方法で情報を交換することも、直接通信することもできる。
クリップボードでテキストをExcelからWordへ貼り付けることは日常的にやっていると思う。
あるExcelのエクスポートしたファイルを別のプロセスのExcelから読み込むこともあるだろう。
RDB(DBMS:Oracle や SQL Server や MySQLなど)を介してデータを受け渡すことも多いと思う。
これらはOSやミドルウェアにいったん情報を出力して情報を受け渡す方法だ。
他にプロセスとプロセスが直接コネクション(これから通信するという合意)を確立して、直接通信する方法がある。
これを「プロセス間通信」と呼ぶ。
プロセス間通信にはいくつか種類があるが、この記事は非情技(非ITエンジニア)向けの記事なので、全てのプロセス間通信を説明する必要はないし、非情技の方々もプロセス間通信自体を理解する必要はない。
今回、非情技の方々に紹介したいのはプロセス間通信の中の「パイプ」と「キュー」という考え方である。
「パイプ」と「キュー」はUNIX系OSの機能として実装されておりシステムやソフトウェアを開発するときの標準化された道具として使われている。
この「考え方」が人間の業務を考える上でも役に立つのではないかと考えている。

FIFO(先入れ先出し)

「パイプ」と「キュー」はどちらもFIFO(First In First Out)というルールと言うかアルゴリズムによって実装されている機能である。
FIFOは日本語では「先入れ先出し」と表現される。
「パイプ」という名前は「先入れ先出し」の本質を分かりやすく表現している。
プロセスからプロセスへパケットのような「情報のかたまり」を複数送る場合、パケットを順番に送る事になる。
このとき受け手側が「先に送られたパケットから先に取り出す」ことを「先入れ先出し」と呼んでいる。
一本道一方通行のトンネルが正にFIFO(先入れ先出し)である。
一本道のトンネルでは追い越しは不可能なので、入り口から入った自動車は、先に入った車両から先に出口へ出てくる。
工場の流れ作業などもFIFOの連続である。
前工程が終わった物から先に、後工程へ送られる。この繰り返しである。
ものすごく当たり前の話だが、情報処理の世界でこの当たり前を意図的に実装したモノがFIFOである。
情報処理の世界ではかなり自由にルールを規定できるので逆にいくつかルールを定めないと一貫した情報処理が行い難くなる。
そのルールの一つがFIFOなのである。
他にもLIFO(後入れ先出し)や、メモリ管理などの領域確保のルールである「ヒープ」などがある。
(ヒープはプロセス内の動的メモリ領域を示す言葉としても使われる)

パイプ(pipe)

パイプ(pipe)は二つのプロセスが一対一でFIFOのルールで通信する機能である。
回線の接続は電話のように一対一になり、第三者はこの回線に接続出来ない。
通信はFIFOなので非同期通信になる。
タイミングを合わせる必要はない。

UNIXの実装では「名前なしパイプ」と「名前付きパイプ」がある。
「名前なしパイプ」は使い捨てのパイプである。
プロセスは自分で自分の複製である子プロセスをいくつでも作ることができる。
自ら作った子プロセスと通信する為に自分で「名前なしパイプ」を作り、子プロセスと通信し、仕事が終わったら「名前なしパイプ」を消去してしまう。
Bashなどのシェルのレベルでも「名前なしパイプ」を使用できる。
catなどのコマンドの出力を「名前なしパイプ」で他のコマンドに繋ぐことができる。
Ubuntu などのLinux OS 上のBashで、
cat /usr/include/stdio.h | more
などと入力すると cat コマンドの出力を、more コマンドの入力に「名前なしパイプ」で繋ぐことができる。
Windowsのコマンドプロンプトでも同様である。

help | more

と試してみると良い。

「名前付きパイプ」はファイルのようにファイルシステム上に常駐し、各プロセスが使いたいときにファイルのようにオープンして通信に使用する。
名前は「ファイル名」として扱える。
二つのプロセスが同じ「名前付きパイプ」をオープンし送信側プロセスが情報を書き込み、受信側プロセスがその情報を読み込めば、情報の受け渡しが完了する。
パイプによる通信は非同期で、送信側プロセスと受信側プロセスはタイミングを合わせる必要がない。
送信側だけが先に全ての情報をパイプに書き込んで終了してしまった後で、受信側がパイプを読みに行っても良い。
情報の順番はパイプの中に保存されている。
「非同期で通信できる」
「情報の順番が保存される」
これがパイプを使用するメリットである。

キュー(queue)

キュー(queue)もパイプと同様にFIFOでプロセス間通信を実現する機能である。
「非同期で通信できる」
「情報の順番が保存される」
という点はパイプと同じである。
パイプとの大きな違いは、二つ以上のプロセスで同じキュー(FIFO)を共有する点にある。
パイプは原則として一対一で通信するものだある。
(あくまで原則であって例外はある。特に名前付きパイプは一対一に限らない)
例えばある製造で前工程と後工程があるとする。
前工程が終わらなければ、後工程ができない。
前工程の担当者が三人、後工程の担当者が二人いるとする。
前工程の済んだ半製品をベルトコンベアーに乗せ、後工程担当者に送る。
後工程担当者はベルトコンベアーに乗せられた半製品を各自バラバラに取り出し、後工程を加えて完成させていく。
このベルトコンベアーがキューである。

パイプと同様にFIFO(先入れ先出し)で非同期で通信でき、順番が保存されるが、「先入れ」も「先出し」も双方とも複数のプロセスで実施できる。
先の製造の話のように、作業に順番があるが、同一作業の担当者が複数いる場合に使用する。
銀行の複数のATMの前に作られる行列もキューである。
ATMがプロセスで、ATMの利用者が来客順にキュー(行列)に入り、FIFOでランダムに複数のプロセス(ATM)に処理される。

パイプとキューの違い

パイプはプロセスとプロセスが一対一で通信する手段である。
キューは複数のプロセスと複数のプロセスが順番を守って、通信する手段である。
ただしUNIXの実装では「名前付きパイプ」はキューのように複数のプロセスと複数のプロセスが通信することが可能である。
したがって「名前付きパイプ」とキューを区別しない情技師(ITエンジニア)も多い。
情技師の中にはパイプとキューを区別しない人も多い。
ただ私は今回、非情技(非ITエンジニア)の為にパイプとキューを紹介しているので、あえてパイプとキューを1:1通信とn:n通信の手段として定義させてもらう。
考える道具としてパイプとキューを紹介しているので、両者を区別したほうが便利だからだ。
曖昧な言葉と概念は不便だ。
言葉の定義は明確にしたほうが良い。

業務設計の概念的小道具

何故、非情技にパイプとキューという概念を紹介するのかと言えば、業務担当者が業務手順を設計するときに、このパイプとキューという思考の道具が頭に有れば、論理的かつ合理的に業務手順を考えるとこができるからだ。
これだけでは不十分だが、先の「流れ作業」のような業務を考える時、前工程と後工程の引き継ぎ手順を考える時、「パイプにするか」それとも「キューにするか」と考えると考えやすい。
先に説明したように他にもLIFO(後入れ先出し)など便利な思考の道具は存在する。
これから少しずつパイプやキューのような、コンピュータの中で使われている思考の道具を非情技に紹介していきたいと思っている。
これが非情技の役に立つかどうかは、わからない。
少なくとも情技師とのコミュニケーションの役には立つと思う。
人間系の業務設計に活用して欲しい。

ITシステムの基礎知識を解説(IT素人さん向け)リンクリストに戻る

タイトルとURLをコピーしました