POSIX 1003.1b
2021-05
POSIX 1003.1bとは、POSIXによって定義された、リアルタイム拡張APIの規格である。古くはPOSIX.4とも呼ばれた。
この規格は、XSIと呼ばれるPOSIX 1003.1規格のオプションに含まれているが、多くのベンダーがリアルタイムAPIへの対応を強調するために、POSIX1003.1bの表記を利用している。
この規格に対応している場合は、ヘッダーファイルで「_XOPEN_REALTIME」を定義するが、個々の関数への対応は個別に定義されているため、詳細は実装によって異なる。
リアルタイム定義の内容を大別すると、「Realtime (XSI Option)」と「Advanced Realtime (XSI Option)」の2つがあるが、この規格はAPIを定義するだけであり、リアルタイム性能を保証する規格ではないことに注意しなければならない。
またリアルタイム拡張規格の実装には、プロセスモデル、スレッドモデル、タスクモデル、あるいは、これらの組み合わせなどの複数の実装形態が存在する。
特に、非同期IOシステムコールでは、リアルタイムオペレーティングシステム(リアルタイムカーネル)自身が非同期IOシステムコールをサポートしていない場合の実装では、タスクやスレッドを生成するために、POSIXスレッド (旧POSIX 1003.1c) との相互作用が発生する。
また、LinuxのPOSIXスレッドでは、リアルタイムシグナルをカーネルがスレッドの制御に使用しているため、リアルタイムシグナルの数個を使用することができない。
XSIの定義には、以下のものがあり、IEEE Std 1003.1-2001に準拠したリアルタイムAPIをサポートしている場合、各マクロシンボルは、200112Lとして定義されている。IEEE Std 1003.1-2008の場合には200809Lとして定義されている。
例えば、_POSIX_MEMLOCKが定義されている場合はmlockall(int flags), munlockall(void)関数がサポートされている。
_POSIX_MEMLOCK_RANGEが定義されている場合はmlock(const void *addr, size_t len), munlock(const void *addr, size_t len)関数がサポートされている。
また、_POSIX_ASYNCHRONOUS_IOが定義されていても、_POSIX_PRIORITIZED_IOが定義されていない場合には、struct aiocb構造体のaio_reqprioフィールドは意味を持たない(_POSIX_PRIORITIZED_IOは、_POSIX_ASYNCHRONOUS_IOのオプションである)。
すべてのAPIは共通でも、現実の動作はライブラリとカーネル実装の組み合わせによって異なるため、プログラムがエラー無しでコンパイルされたとしても、同じ動作をするとは限らない。
_POSIX_ASYNCHRONOUS_IO
非同期IO関数をサポートしている。
aio_cancel() - 完了していない非同期IOをキャンセルする。
aio_error() - 非同期IO操作のエラー状態を取得する。
aio_read() - 非同期readを行う。
aio_return() - 非同期IO操作の返り値を取得する。
aio_suspend() - 非同期IO操作の完了を待つ。
aio_write() - 非同期writeを行う。
lio_listio() - 非同期IOをリスト操作で行う。
_POSIX_PRIORITIZED_IO
優先度付き非同期IO関数をサポートしている。
struct aiocbのaio_reqprioフィールドにしたがって、IOスケジューリングを行う。
_POSIX_SYNCHRONIZED_IO
メモリ上の内容をファイルと同期させる関数をサポートしている。
aio_fsync() - パラメータで渡された非同期IOの、同期していない操作を同期させる。
_POSIX_FSYNC
メモリ上の内容をファイルと同期させる関数をサポートしている。XSIに準拠している場合には、必ず定義されていなければならない。
fsync(), fdatasync() - メモリ上の内容をファイルと同期させる。
_POSIX_MAPPED_FILES
ファイルへのメモリマップ関数をサポートしている。XSIに準拠している場合には、必ず定義されていなければならない。
mmap() - ファイルやデバイスをメモリにマップする。
munmap() - メモリにマップしたファイルやデバイスをアンマップする。
_POSIX_MEMLOCK: プロセスやタスクが使用している全てのメモリ領域をロックする関数をサポートしている。
_POSIX_MEMLOCK_RANGE: プロセスやタスクが使用しているメモリ領域を開始アドレスと大きさを指定してロックすることが可能な関数をサポートしている。
_POSIX_MEMORY_PROTECTION: プロセスやタスクが使用しているメモリ領域を保護する関数をサポートしている。XSIに準拠している場合には、必ず定義されていなければならない。
POSIXの定義では、mprotect()は、mmap()で獲得した領域に対してのみ使用できる。
_POSIX_MESSAGE_PASSING: POSIXメッセージキュー関数をサポートしている。
_POSIX_PRIORITY_SCHEDULING: 優先度スケジューリング関数をサポートしている。
_POSIX_REALTIME_SIGNALS: リアルタイムシグナル関数をサポートしている。
_POSIX_SEMAPHORES: POSIXカウンティングセマフォをサポートしている。
_POSIX_SHARED_MEMORY_OBJECTS: POSIX共有メモリオブジェクトをサポートしている。
_POSIX_TIMERS: POSIXタイマーをサポートしている。
_POSIX_ADVISORY_INFO: アドバイザリー情報関数をサポートしている。
_POSIX_CLOCK_SELECTION: 下記関数をサポートしている。clockidにリアルタイムクロックCLOCK_REALTIME等を指示できる。
CLOCK_REALTIMEの解像度の最大値は、ヨーロッパでは50Hz(20ms)であり、米国では60Hz(16.67ms)である。最小値は、構造体の定義からナノ秒になる。CLOCK_REALTIMEは、システム時計と共通の実装が存在する。この場合には、外部プログラムによりシステム時計が書き換えられると周的的な時間がジャンプする可能性がある。この現象を避けるためには、CLOCK_MONOTONICを使用する。
_POSIX_CPUTIME: clockidにCPU実行時間CLOCK_PROCESS_CPUTIME_ID,CLOCK_THREAD_CPUTIME_IDを指示できる。
_POSIX_MONOTONIC_CLOCK: clockidにモノトーニッククロックCLOCK_NONOTONICを指示できるが、クロックの値をclock_settime()を介して設定することはできない。
_POSIX_SPAWN: 下記、POSIX spawnプロセス関数をサポートしている。
_POSIX_SPORADIC_SERVER: 下記関数で、スケジューリングポリシーSCHED_SPORADICをサポートしている。
通常、周期的な繰り返しアクティビティには、SCHED_FIFOを利用するが、SCHED_SPORADICは、不規則なアクティビティの場合に利用する。
_POSIX_TIMEOUTS: タイムアウトオプションをサポートしている。
mq_timedreceive()タイムアウト付きで、メッセージキューの受信を行う。
mq_timedsend()タイムアウト付きで、メッセージの送信を行う。
sigtimedwait()タイムアウト付きsigwaitinfo()
_POSIX_TYPED_MEMORY_OBJECTS: 下記、関数をサポートしている。
以下の規格は、正確にはPOSIXスレッドに含まれるが、リアルタイムのスレッド規格として以下に記述する。
リアルタイムスレッドをサポートしている場合には、_XOPEN_REALTIME_THREADSが定義されている。
_POSIX_THREAD_PRIO_INHERIT: プライオリティインヘリタンス(優先度継承)mutexをサポートする。
_POSIX_THREAD_PRIO_PROTECT: プライオリティ最高限度mutexをサポートする。
_POSIX_THREAD_PRIORITY_SCHEDULING: 優先度スケジューリングスレッドをサポートする。
_POSIX_BARRIERS: バリア同期をサポートする。
_POSIX_SPIN_LOCKS: スピンロック(ビジーウェイト)をサポートする。
_POSIX_THREAD_CPUTIME: CPU実行時間チェック関数をサポートしている。
_POSIX_THREAD_SPORADIC_SERVER: POSIX sporadic サーバーインターフェースをサポートしている。
コンカレント日本によるPDF「」にいくつかのサンプルがある。