STREAMS
STREAMS は、UNIX System V のキャラクタデバイス の実装フレームワークである。
STREAMSは、カーネル やユーザ空間プロセスとデバイスドライバ との全二重双方向のキャラクタI/O を実装するモジュール 性の高いアーキテクチャとして設計された。端末I/Oやネットワークサブシステムの開発によく使われた。System V Release 4では、全ての端末インタフェース がSTREAMSを使って実装された。
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 ) に新たな機能を導入しようとする試みであったが、その応用は端末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 で使うAT&T NPACK protocol)を STREAMSで実装できるよう拡張された。これはまず、UNIX System V Release 3のNetwork Support Utilities (NSU) パッケージと共にリリースされた。この時点で、putmsg 、getmsg 、poll というシステムコール が追加された。これらはそれぞれ、BSDソケットのsend 、recv 、select システムコールに相当するが、名前空間の衝突を避けるために別の名前を付けている。System V Release 4では、STREAMSは端末I/Oフレームワークやパイプ の実装にも使われ、双方向パイプやファイル記述子 の受け渡しといった便利な機能が追加された。UNICOS への移植も行われている。
ベル研究所 によるオリジナルの実装は遅いという悪評があったが、SVR3やその後の実装では特に性能が悪いという話はない。
SVR3への移植と並行して、AT&T はOSI参照モデル の各層(2層から4層まで)についてのSTREAMSメッセージパッシングの(プロトコルに依存しない)ガイドラインを開発した。
データリンク層 - DLPI (Data Link Provider Interface)
ネットワーク層 - NPI (Network Provider Interface)
トランスポート層 - TPI (Transport Provider Interface)
しかし、ネットワーク層とトランスポート層の間はプロトコルスタック の実装に依存する部分が大きく、また上位層 (5-7) はカーネル では実装されないことから、データリンク層 とトランスポート層 がそれぞれの上位層に見せるSTREAMSインタフェースだけが後にX/Open によって標準化された。トランスポート層の実装に依存しないメッセージパッシング型のAPIとしてTransport Layer Interface (TLI) が定義され、後にX/Open Transport Interface (XLI) として採用された。また、セッション層 、プレゼンテーション層 、アプリケーション層 をサポートするライブラリが定義され、後にThe Open Group が標準化した。
STREAMSはSingle UNIX Specification のバージョン1 (UNIX95) とバージョン2 (UNIX98) では必須とされていたが、BSD やLinux では採用されなかったためバージョン3 (UNIX03) ではオプションとなっている。
実装
STREAMSは主にSystem V系UNIXで使われたが、他にも以下のような実装が存在する。
Plan 9 も当初はSTREAMSによるネットワーク機能を持っていたが、第3版へ移行する過程で単純なI/Oキューに変更された。
Mentatという企業がSTREAMSの実装を開発している。
Linuxカーネル では、開発者らがSTREAMS技術を不適切と見ているため実装されていない。代わりにSTREAMS操作をソケット操作に変換する互換レイヤー が存在する。
Linux での STREAMS 実装として、LiS (Linux STREAMS) や OpenSS7 Fast STREAMS がある。
FreeBSD はSVR4とのバイナリ互換性のためにSTREAMS関連システムコールをサポートしている。
Windows NT のカーネルにはSTREAMSの完全移植版であるstreams.sysがあった。DDK文書にはSTREAMSについての章があったが、NT4のDDKではobsoleteとされていた。
脚注
↑ Goodheart 1994 , pp. 51–53, 403–527
↑ Goodheart 1994 , pp. 52–53
1 2 Goodheart 1994 , p. 17
↑ Goodheart 1994 , p. 51
↑ Ritchie 1984
↑ Goodheart 1994
↑ Dennis M. Ritchie . “A Stream Input-Output System” . AT& T Bell Laboratories Technical Journal 63, No. 8 Part 2 (AT& T): 1897-1910. http://cm.bell-labs.com/cm/cs/who/dmr/st.html 2006年5月19日閲覧。 .
1 2 UNIX International (August 20, 1991), Data Link Provider Interface (DLPI) Specification , UNIX International Publication (Revision 2.0.0, Draft 2 ed.), Parsippany, N.J.: UNIX International Press, http://www.openss7.org/docs/dlpi.pdf 2009年7月27日閲覧。
↑ UNIX International (August 17, 1992), Network Provider Interface (NPI) Specification , UNIX International Publication (Revision 2.0.0, Draft 2 ed.), Parsippany, N.J.: UNIX International Press, http://www.openss7.org/docs/npi.pdf 2009年7月27日閲覧。
↑ UNIX International (December 10, 1992), Transport Provider Interface Specification , UNIX International Publication (Revision 1.5, Draft 2 ed.), Parsippany, N.J.: UNIX International Press, http://www.openss7.org/docs/tpi.pdf 2009年7月27日閲覧。
↑ Open Group (1999), “Transport Provider Interface (TPI) Specification”, Open Group CAE Specification (Berkshire, UK: Open Group Publication)
↑ UNIX International (October 25, 1990), ACSE/Presentation Library Interface (APLI) Specification , UNIX International Publication (Draft ed.), Parisppany, N.J.: UNIX International Press
↑ Open Group (September 1993), “ACSE/Presentation Services API (XAP)”, X/Open CAE Specification (Berkshire, UK: X/Open Company Limited) XAP (c303), ISBN 1-872630-91-X
↑ Alan Cox , Streams and Linux , Linux Kernel Mailing List, 28 June 1998
↑ LiS: Linux STREAMS , Francisco Ballesteros, Linux Journal , Sat 01 May 1999
↑ OpenSS7 download page
参考文献
Goodheart, Berny; James Cox (1994), The magic garden explained: the internals of UNIX System V Release 4, an open-systems design , Australia: Prentice Hall, ISBN 0-13-098138-9
Pajari, George (1992) [1991], Writing UNIX Device Drivers (2nd Printing, 1st ed.), Reading, MA: Addison-Wesley, ISBN 0-201-52374-4
Ritchie, Dennis M. (October 1984). “A Stream Input-Output System” . AT& T Bell Laboratories Technical Journal 63, No. 8 Part 2 (AT& T): 1897–1910. http://cm.bell-labs.com/cm/cs/who/dmr/st.html 2006年5月19日閲覧。 .
Stevens, W. Richard (1993), Advanced Programming in the UNIX Environment (15th Printing, 1st ed.), Reading, MA: Addison-Wesley, ISBN 0-201-56317-7
Thomas, Rebecca; Lawrence R. Rogers, Jean L. Yates (1986), Advanced Programmers Guide to UNIX System V , Berkeley, CA: Osborne McGraw-Hill, ISBN 0-07-881211-9
Waite Group (1987), Mitchel Waite, ed., UNIX Papers (2nd Printing, 1st ed.), Indianapolis, IN: Howard W. Sams & Company, ISBN 0-672-22578-6