ブロッキング・非ブロッキングとの違い
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/13 02:30 UTC 版)
「非同期IO」の記事における「ブロッキング・非ブロッキングとの違い」の解説
非同期I/Oはほぼ必ず非ブロッキングI/O (non-blocking I/O) であるため、非常にしばしば混同されるが、同期 or 非同期と、ブロッキング or 非ブロッキングという分類は、必ずしも一致しない。POSIX環境において、O_NONBLOCKが設定されたファイル記述子に対して通常のreadやwriteを行うと非ブロッキングになるが、それは「ブロックされるようであればエラーにする」という動作になるのであって、非同期になるのではない(たいていのI/O操作はOS内のバッファなどによって、同期型のAPIでもブロックすることなく完了できることも多い)。ディスクに実際に書き込まれるまでを待つかどうか、という観点での同期・非同期もあるが、それはここで扱っているものとは別の話である(詳細は文献等の、フラグ O_DSYNC, O_DIRECT についての記述や英語版記事 en:Raw device などを参照のこと)。 非同期I/Oとは、 バッファの内容が、カーネル等によってコピーされるか、あるいはプログラマの責任で処理が完了するまで要求元のプロセスがそれを保持しなければならない (権限違反など、即座にカーネルがエラー等にできる場合を除き)入出力の成否も、入出力を要求するシステムコールの結果としては得られず、コールバックか、別のシステムコール等で改めて得る必要がある 以上のような制限の下に、入出力要求のシステムコールはブロックせず、最小限の処理ですぐに終了する といったようなスタイルの入出力APIによるI/Oである。よって非同期I/Oが利用されるのは、「時間制約の厳しいRTOSだから」といったような理由ではない。排他制御の都合などでブロックさせられないとか、あるいは、性能上の理由ではエンタープライズ用途で欲されることもあれば、イベントドリブン型のフレームワークであるために必要であるといった場合もある。別スレッドを使うことで、プロセス内で非同期I/Oのように見せかけるライブラリ(フレームワーク)といったものもあり得る。
※この「ブロッキング・非ブロッキングとの違い」の解説は、「非同期IO」の解説の一部です。
「ブロッキング・非ブロッキングとの違い」を含む「非同期IO」の記事については、「非同期IO」の概要を参照ください。
- ブロッキング・非ブロッキングとの違いのページへのリンク