STREAMSは、UNIX System Vのキャラクタデバイスの実装フレームワークである。
STREAMSは、カーネルやユーザ空間プロセスとデバイスドライバとの全二重双方向のキャラクタI/Oを実装するモジュール性の高いアーキテクチャとして設計された。端末I/Oやネットワークサブシステムの開発によく使われた。System V Release 4では、全ての端末インタフェースがSTREAMSを使って実装された[1]。
STREAMSは、プロトコルスタックを実装するためのカーネル内の仕組みである。たとえば、TCP/IPでは、TCPやIPがそれぞれSTREAMSモジュールとして実装される。STREAMSモジュールには上位層への双方向接続ポートと下位層への双方向接続ポートを持つ。STREAMSモジュールは基本的には上位層や下位層のことを全く知らなくてもよい構造になっていて、TCPモジュールのルーチンがIPのルーチンを直接コールすることはない。
STREAMSはBSDのソケットAPIと対抗する技術だが、STREAMSを使ったシステムでは常にソケットのインタフェースも提供された。STREAMSはソケットよりも複雑だが、柔軟性も高い。 STREAMSはデニス・リッチーがVersion 8 Unixに導入したのが最初であり、その時点で端末I/OとTCP/IPプロトコルに使われていた。当時のUNIXの入出力システムコール (open, close, read, write, ioctl) に新たな機能を導入しようとする試みであったが[2]、その応用は端末I/Oとパイプ状のI/O意味論を提供するプロトコル群に限定されていた。その後、Robert Israel、Gil McGrath、Dave Olander、Her-Daw Che、Maury BachらがSystem V Release 3に移植し、様々なトランスポート層プロトコル(TCP/IP、ISO Class 4 transport、SNA LU 6.2、RFS
歴史
ベル研究所によるオリジナルの実装[7]は遅いという悪評があったが、SVR3やその後の実装では特に性能が悪いという話はない。
SVR3への移植と並行して、AT&TはOSI参照モデルの各層(2層から4層まで)についてのSTREAMSメッセージパッシングの(プロトコルに依存しない)ガイドラインを開発した。
データリンク層 - DLPI (Data Link Provider Interface)[8]
ネットワーク層 - NPI (Network Provider Interface)[9]
トランスポート層 - TPI (Transport Provider Interface)[10]
しかし、ネットワーク層とトランスポート層の間はプロトコルスタックの実装に依存する部分が大きく、また上位層 (5-7) はカーネルでは実装されないことから、データリンク層[8]とトランスポート層[11]がそれぞれの上位層に見せるSTREAMSインタフェースだけが後にX/Openによって標準化された。トランスポート層の実装に依存しないメッセージパッシング型のAPIとしてTransport Layer Interface (TLI) が定義され、後にX/Open Transport Interface (XLI) として採用された。また、セッション層、プレゼンテーション層、アプリケーション層をサポートするライブラリが定義され[12]、後にThe Open Groupが標準化した[13]。
STREAMSはSingle UNIX Specificationのバージョン1 (UNIX95) とバージョン2 (UNIX98) では必須とされていたが、BSDやLinuxでは採用されなかったためバージョン3 (UNIX03) ではオプションとなっている。 STREAMSは主にSystem V系UNIXで使われたが、他にも以下のような実装が存在する。
実装
Plan 9も当初はSTREAMSによるネットワーク機能を持っていたが、第3版へ移行する過程で単純なI/Oキューに変更された。
Mentatという企業がSTREAMSの実装を開発している。
ノベルはNetWareのTCP/IPスタックの実装にMentat版のSTREAMSを使っていた。
Apple ComputerはMentatの実装したSTREAMSのライセンス提供を受け、MacのOSである漢字Talk 7.5.2以降にネットワークシステムOpen Transportの一部として導入した。STREAMSアーキテクチャはMac OS XのClassic環境に残っている(ただし、macOSネイティヴのネットワークアーキテクチャはBSDのsocketである)。
Linuxカーネルでは、開発者らがSTREAMS技術を不適切と見ているため実装されていない。代わりにSTREAMS操作をソケット操作に変換する互換レイヤーが存在する[14]。