POSIX 1003.1b

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スレッドでは、リアルタイムシグナルをカーネルがスレッドの制御に使用しているため、リアルタイムシグナルの数個を使用することができない。

Realtime (XSI Option) 
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関数をサポートしている。
 - 完了していない非同期IOをキャンセルする。
 - 非同期IO操作のエラー状態を取得する。
 - 非同期readを行う。
 - 非同期IO操作の返り値を取得する。
 - 非同期IO操作の完了を待つ。
 - 非同期writeを行う。
 - 非同期IOをリスト操作で行う。
 _POSIX_PRIORITIZED_IO
 優先度付き非同期IO関数をサポートしている。
 struct aiocbのaio_reqprioフィールドにしたがって、IOスケジューリングを行う。
 _POSIX_SYNCHRONIZED_IO
 メモリ上の内容をファイルと同期させる関数をサポートしている。
 - パラメータで渡された非同期IOの、同期していない操作を同期させる。
 _POSIX_FSYNC
 メモリ上の内容をファイルと同期させる関数をサポートしている。XSIに準拠している場合には、必ず定義されていなければならない。
,  - メモリ上の内容をファイルと同期させる。
 _POSIX_MAPPED_FILES
 ファイルへのメモリマップ関数をサポートしている。XSIに準拠している場合には、必ず定義されていなければならない。
 - ファイルやデバイスをメモリにマップする。
 - メモリにマップしたファイルやデバイスをアンマップする。
 _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タイマーをサポートしている。

Advanced Realtime (XSI Option) 
 _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 タイムアウトオプションをサポートしている。
タイムアウト付きで、メッセージキューの受信を行う。
タイムアウト付きで、メッセージの送信を行う。
タイムアウト付きsigwaitinfo()
 _POSIX_TYPED_MEMORY_OBJECTS 下記、関数をサポートしている。

リアルタイムのスレッド規格 
以下の規格は、正確にはPOSIXスレッドに含まれるが、リアルタイムのスレッド規格として以下に記述する。
リアルタイムスレッドをサポートしている場合には、_XOPEN_REALTIME_THREADSが定義されている。

Realtime Threads (XSI Option) 
 _POSIX_THREAD_PRIO_INHERIT プライオリティインヘリタンス（優先度継承）mutexをサポートする。
 _POSIX_THREAD_PRIO_PROTECT プライオリティ最高限度mutexをサポートする。
 _POSIX_THREAD_PRIORITY_SCHEDULING 優先度スケジューリングスレッドをサポートする。

Advanced Realtime Threads (XSI Option) 
 _POSIX_BARRIERS バリア同期をサポートする。
 _POSIX_SPIN_LOCKS スピンロック（ビジーウェイト）をサポートする。
 _POSIX_THREAD_CPUTIME CPU実行時間チェック関数をサポートしている。
 _POSIX_THREAD_SPORADIC_SERVER POSIX sporadic サーバーインターフェースをサポートしている。

サンプルプログラム 
コンカレント日本によるPDF「ベーシックトレーニング編」にいくつかのサンプルがある。

脚注 

この規格は、The Single UNIX Specification, Version 3から入手することができる。
その後の改訂の版については、下記を参照の事。
The Open Group の Base Specifications Issue 6の定義 
The Open Group のBase Specifications Issue 7の定義

外部リンク 
The Single UNIX Specification
RedHat POSIX Option Groups
Ubuntuマニュアルページ

POSIX