まえがき xi |
第1部 序説 1 |
第1章 序説 3 |
1.1 導入 3 |
1.2 プロセスとスレッドにおける情報の共有 4 |
1.3 IPCオブジェクトの持続性 6 |
1.4 名前空間 7 |
1.5 IPCオブジェクトに対するfork、execおよびexitの影響 9 |
1.6 エラー処理:ラッパー関数 9 |
1.7 Unixにおける標準 13 |
1.8 IPC例題一覧 15 |
1.9 要約 16 |
第2章 PosixのIPC 19 |
2.1 導入 19 |
2.2 PosixのIPC名 20 |
2.3 IPCチャネルの作成とオープン 22 |
2.4 IPCのアクセス許可 25 |
2.5 要約 26 |
第3章 SystemVのIPC 27 |
3.1 導入 27 |
3.2 key_tキーとfrok関数 28 |
3.3 ipc_perm構造体 30 |
3.4 IPCチャネルの作成とオープン 30 |
3.5 IPCアクセス許可 31 |
3.6 識別子の再利用 34 |
3.7 ipcsとipcmプログラム 36 |
3.8 カーネルが課す上限 36 |
3.9 要約 37 |
第2部 メッセージパッシング 41 |
第4章 パイプとFIFO 43 |
4.1 導入 43 |
4.2 簡単なクライアントーサーバ例題 43 |
4.3 パイプ 44 |
4.4 全二重パイプ 50 |
4.5 popen関数とpclose関数 52 |
4.6 FIFO 53 |
4.7 パイプとFIFOに関するそのほかの性質 58 |
4.8 単一のサーバと複数のクライアント 60 |
4.9 反復サーバと並行サーバ 66 |
4.10 ストリームとメッセージ 67 |
4.11 パイプとFIFOに関する量的な制限 72 |
4.12 要約 73 |
第5章 Posixメッセージキュー 75 |
5.1 導入 75 |
5.2 mq_open、mq_closeおよびmq_unlink関数 76 |
5.3 mq_getattr関数とmq_setattr関数 79 |
5.4 mq_send関数とmq_receive関数 82 |
5.5 メッセージキューに関する量的制限 86 |
5.6 mq_notify関数 87 |
5.7 Posix実時間シグナル 98 |
5.8 メモリマップI/Oを用いらインプリメンテーション 105 |
5.9 要約 123 |
第6章 System V メッセージキュー 127 |
6.1 導入 127 |
6.2 msgget関数 128 |
6.3 msgsnd関数 129 |
6.4 msgrcv関数 130 |
6.5 msgctl関数 132 |
6.6 簡単なプログラム 132 |
6.7 クライアトーサーバ例題 138 |
6.8 メッセージの多重化 139 |
6.9 メッセージキューとselectおよびpoll関数 146 |
6.10 メッセージキューに関する量的制限 148 |
6.11 要約 150 |
第3部 同期 153 |
第7章 相互排除変数と条件変数 155 |
7.1 導入 155 |
7.2 相互排除変数:ロックとアンロック 155 |
7.3 生産者-消費者問題 157 |
7.4 ロックと待ち 161 |
7.5 条件変数:待ちと通知 162 |
7.6 条件変数:制限時間付きの待ちとプロードキャスト 166 |
7.7 相互排除変数と条件変数の属性 167 |
7.8 要約 170 |
第8章 リードライトロック 171 |
8.1 導入 171 |
8.2 リードライトロックの取得と解放 172 |
8.3 リードライトロックの属性 173 |
8.4 相互排除変数と条件変数を用いたインプリメンテーション 174 |
8.5 スレッドの取り消し 180 |
8.6 要約 186 |
第9章 レコードロック 187 |
9.1 導入 187 |
9.2 レコードロックとファイルロック 191 |
9.3 Posixのfcntlレコードロック 192 |
9.4 勧告ロック 196 |
9.5 強制ロック 199 |
9.6 読み手と書き手の優先度 201 |
9.7 デーモンを1つだけ起動する方法 206 |
9.8 ロックファイル 207 |
9.9 NFSのロック 209 |
9.10 要約 210 |
第10章 Posixセマフォ 213 |
10.1 導入 213 |
10.2 sem_opne、sem_closeおよびsem_unlink関数 219 |
10.3 sem_wait関数とsem_trywait関数 220 |
10.4 sem_post関数とsem_getvalue関数 221 |
10.5 簡単なプログラム 221 |
10.6 生産者-消費者問題 226 |
10.7 ファイルロック 231 |
10.8 sem_init関数とsem_destroy関数 232 |
10.9 複数の生産者と単一の消費者 235 |
10.10 複数の生産者と複数の消費者 237 |
10.11 複数のバッファ 240 |
10.12 プロセス間でのセマフォの共有 244 |
10.13 セマフォに関する量的制限 246 |
10.14 FIFOによるインプリメンテーション 249 |
10.15 メモリマップI/Oによるインプリメンテーション 253 |
10.16 System V セマフォによるインプリメンテーション 261 |
10.17 要約 268 |
第11章 System V セマフォ 271 |
11.1 導入 271 |
11.2 semget関数 272 |
11.3 semop関数 275 |
11.4 semctl関数 277 |
11.5 簡単なプログラム 278 |
11.6 ファイルロック 283 |
11.7 セマフォに関する上限 285 |
11.8 要約 288 |
第4部 共有メモリ 291 |
第12章 共有メモリ序説 293 |
12.1 導入 293 |
12.2 mmap、munmapおよびmsync関数 297 |
12.3 メモリマップファイル中のカウンタ増加操作 301 |
12.4 4.4BSDの匿名メモリマッピング 304 |
12.5 SVR4の/dev/zeroメモリマップ 306 |
12.6 メモリマップされたオブジェクトの参照 306 |
12.7 要約 311 |
第13章 Posix共有メモリ 313 |
13.1 導入 313 |
13.2 shm_open関数とshm_unlink関数 313 |
13.3 ftruncate関数とfstat関数 315 |
13.4 簡単なプログラム 316 |
13.5 共有カウンタの増加操作 320 |
13.6 サーバへのメッセージ送信 323 |
13.7 要約 328 |
第14章 Sytem V 共有メモリ 331 |
14.1 導入 331 |
14.2 shmget関数 331 |
14.3 shmat関数 332 |
14.4 shmdt関数 332 |
14.5 shmctl関数 333 |
14.6 簡単なプログラム 333 |
14.7 共有メモリに関する上限 336 |
14.8 要約 338 |
第5部 リモート手続き呼び出し 339 |
第15章 Doors 341 |
15.1 導入 341 |
15.2 door_call関数 347 |
15.3 door_create関数 348 |
15.4 door_return関数 350 |
15.5 door_cred関数 350 |
15.6 door_info関数 351 |
15.7 例題 352 |
15.8 ディスクリプタパッシング 364 |
15.9 door_server_create関数 369 |
15.10 door_bind,door_unbindおよびdoor_revoke関数 374 |
15.11 クライアントあるいはサーバの中途終了 375 |
15.12 要約 382 |
第16章 Sun Rpc 385 |
16.1 導入 385 |
16.2 マルチスレッド 394 |
16.3 サーバのバインディング 397 |
16.4 サクセス権検査 401 |
16.5 タイムアウトと再送 404 |
16.6 呼び出しセマンティクス 409 |
16.7 クライアントあるいはサーバの中途終了 410 |
16.8 XDR:外部データ表現 412 |
16.9 RPCパケット形式 429 |
16.10 要約 433 |
あとがき 437 |
訳者あとがき 441 |
付録A 性能測定 443 |
A.1 導入 443 |
A.2 結果 444 |
A.3 メッセージパッシングの帯域測定用プログラム 453 |
A.4 メッセージパッシングの遅延測定用プログラム 466 |
A.5 スレッド同期測定用プログラム 472 |
A.6 プロセス同期測定用プログラム 483 |
付録B スレッド入門 487 |
B.1 導入 487 |
B.2 基本スレッド関数:生成と終了 488 |
付録C 雑多なソースコード 491 |
C.1 unpipc.hヘッダ 491 |
C.2 config.hヘッダ 495 |
C.3 標準エラー処理関数 496 |
付録D 演習問題解答例 499 |
参考文献 519 |
索引 523 |