「同期I/O」と「非同期I/O」の定義、とか

指摘を受けたので(あざーっす!)、言葉の整理のためちと調べてみました。

Synchronous I/O OperationとAsynchronous I/O Operationの定義

POSIXによれば、このように定義されています。

3.378 Synchronous I/O Operation


An I/O operation that causes the thread requesting the I/O to be blocked from further use of the processor until that I/O operation completes.


Note:
A synchronous I/O operation does not imply synchronized I/O data integrity completion or synchronized I/O file integrity completion.

http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_378

3.29 Asynchronous I/O Operation


An I/O operation that does not of itself cause the thread requesting the I/O to be blocked from further use of the processor.


This implies that the process and the I/O operation may be running concurrently.

http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_29

ちなみに、W. Richard Stevensの『UNIXネットワークプログラミング 第2版 Vol.1』の、「6 I/Oの多重化: select関数とpoll関数」(p145)のセクションでもこの定義が言及されています。

さて、この定義にのっとると、I/Oモデルはこのように分類できることになり、

  • Synchronous I/O Operation (同期I/O操作)
  • Asynchronous I/O Operation (非同期I/O操作)
    • Asynchronous I/O (非同期I/O)

「Asynchronous I/O Operation」に分類されるのは、Asynchronous I/O (関数名がaio_かlio_で始まるもの)のみとなります。

Synchronous notificationとAsynchronous notification

さて、developerWorks

のFigure 1を見ると、I/O multiplexingが「Asynchronous」に分類されています。

さきほどの分類とは違いますね。

件の文書を書いた本人ではないのであくまで推測ですが、この図の「Asynchronous」は「Asynchronous I/O Operation」ではなく「Asynchronous notification」なのではないかと思います。

つまり、「XXXが同期/非同期に行われる」を「I/O操作」ではなく「(なにかしらの)通知」を切り口とした分類なのでしょう。それならば、I/O multiplexingが「Asynchronous (notification)」に分類されるのも理解できます。

まとめ

自分で混乱気味だったのでちと整理をしてみました。


はなしはそれますが、Stevensの本、たとえば、

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

詳解TCP/IP〈Vol.1〉プロトコル

詳解TCP/IP〈Vol.1〉プロトコル

はまちがいなく買いです。前者はネットワークプログラミング、後者はTCP/IPプロトコルについての書籍。

ネットをうろついて断片的な知識を得るよりも、この本を通読したほうがためになると思います。通読しなくても、必要になった折に本の中の関連する周辺トピックを読むだけでもかなり勉強になります。

ちなみに、Stevensのページから、書籍中のソースコードなどがダウンロードできます。

いまさらながらですけど、StevensすごいぉStevens。そんな思いをこめて、天国に向けてはて☆をうかべました。お盆だしね。