POSIXモデル

summary:

POSIXモデル[/ˈpɑːzɪks/,Portable Operating System Interface]とは,UNIX互換システムにおけるプログラムインターフェースおよび実行環境の標準仕様であり,アプリケーションがオペレーティングシステム資源[ファイル,プロセス,スレッド,I/Oなど]を制御・利用するためのAPI設計指針を指す.すなわち,POSIXモデルとは,プロセス中心の抽象化と同期的[blocking]なI/O操作を基本とする,汎用OS向けの伝統的プログラミングモデルを意味する.

POSIXは1980年代初頭に,UNIXシステムの多様化によって生じた互換性の問題を解決するために構想された.1984年にIEEE[米国電気電子学会]がPOSIXの標準化作業を開始し,1988年に初めての標準仕様IEEE 1003.1[POSIX.1]が公開された.この標準は当初,AT&TのSystem VとBSDのUNIXバリアントの違いを橋渡しするために作られた.

その後,ISO[国際標準化機構]とIEEEが共同で標準化を進め,1990年にISO/IEC 9945としても認定された.1990年代を通じて標準は拡張され,シェルとユーティリティ[POSIX.2],スレッド[POSIX.1c],リアルタイム拡張[POSIX.1b]などが追加された.2001年にはSingle UNIX Specification[SUS]と統合され,現在はThe Open Groupが管理するUNIX標準の中核をなしている.

現在のPOSIX規格[IEEE Std 1003.1-2017]は,The Open Group,IEEE,ISOの共同作業によって維持されており,多くの現代オペレーティングシステム[Linux,macOS,FreeBSD,各種商用UNIX]がこの規格に準拠または対応している.

POSIXでは,すべてのリソースをファイル記述子[file descriptor]を通じて扱う.「すべてはファイル」というUNIX哲学に基づき,様々なリソースに対して統一的なインターフェースを提供する.ファイルシステム上の通常ファイルだけでなく,デバイス,パイプ,ソケット,プロセス間通信チャネルなども同じインターフェースで操作できる.これらのリソースに対して,open[],read[],write[],close[]といった基本操作が適用される.ネットワーク通信にはsocket[],bind[],listen[],accept[],connect[],send[],recv[]などのAPIが用意されている.プロセス制御にはfork[],exec[],wait[],kill[]などが,メモリ管理にはmmap[],munmap[],brk[]などが,スレッド操作にはpthread_create[],pthread_join[],pthread_mutex_lock[]などが提供されている.このような抽象と一貫性が移植性を高め,マルチプラットフォームなソフトウェア開発を可能にしてきた.

POSIXでは,標準的なI/O操作は同期的[blocking]に設計されている.すなわち,read[]accept[]といった関数は,データが到着するまで呼び出し元スレッドがブロックされる.このブロッキングI/Oモデルは,プログラマにとって理解しやすく,制御フローが直線的に記述できるという利点がある.ただし,高性能な並行処理が必要な場合には,select[],poll[],epoll[][Linuxの場合]などの多重化I/O機能を使用する必要がある.また,非同期I/O[AIO]もPOSIX標準の一部として定義されているが,実装の完全性や効率性はプラットフォームによって異なる.大量のI/O処理を行う場合には,スレッドの多重化・コンテキストスイッチのオーバーヘッドが問題となるため,現代の高負荷サーバーアプリケーションでは,POSIXモデルの限界を超えるためのさまざまな工夫がなされている.

POSIXのスレッド実装[pthreads]は,共有メモリを前提とし,プリエンプティブ[強制割り込み]によるマルチスレッド動作を行う.これにより,スレッド間で同一アドレス空間を共有することができるが,同時にロック/ミューテックス/セマフォなどによる明示的な同期機構が必要となる.このモデルではスレッド競合やデッドロック,優先度逆転などの問題が発生するリスクがあり,マルチスレッドプログラミングを複雑にしている.POSIXスレッドは軽量プロセスとも呼ばれるが,実際のコンテキストスイッチのコストは無視できず,数千から数万のスレッドを同時に扱うスケーラビリティには課題がある.このため,より軽量な実行単位[コルーチンやファイバー]や,イベント駆動型のプログラミングモデルが代替として登場している.

POSIX I/O操作は,カーネルモードとユーザモード間のコンテキストスイッチを頻繁に発生させる.ファイルディスクリプタの操作,バッファリング,エラーハンドリングなどはすべてカーネルが仲介するため,システムコールのオーバーヘッドが生じる.特に小さなI/O要求が多数ある場合,このオーバーヘッドは無視できない.また,POSIXファイルシステムの一貫性保証やアクセス権管理も,追加的なパフォーマンスコストとなる.近年のハイパフォーマンスコンピューティングやデータセンター環境では,ユーザ空間I/Oライブラリ[SPDK,DPDK,io_uring]など,POSIXモデルの制約を緩和または回避する手法が導入されている.

POSIXモデルは,その堅牢性と移植性から,依然として多くのシステムプログラミングの基礎となっているが,新しいワークロードやハードウェアアーキテクチャに対応するため,継続的に拡張や代替モデルの開発が行われている.POSIXの原則に忠実でありながら,現代のコンピューティング要件に対応するための進化は,システムプログラミングの重要な課題である.

Mathematics is the language with which God has written the universe.





















POSIXモデル Netmap TDM パス制御 アドドロップマルチプレクサ Time Series Transformer