LinuxのI/Oは同期?非同期?
まず、ここでLinuxのI/Oについて、簡単に説明します。
基本的に、LinuxのI/Oは、非同期で行われます。非同期というのは、I/O要求とディスクアクセスは同期していないということです。ふつうにwrite()を呼んでも、ディスクに書き込み要求がいきません。read()要求をだしても、ディスクにread()要求が即時にいくとは、限りません。
ここら辺の説明は、id:naoyaさんのまとめが、非常にわかりやすいと思います。
Linux のページキャッシュ - naoyaのはてなダイアリー
Linux I/O のお話 write 編 - naoyaのはてなダイアリー
つまり、ページキャッシュのみで操作できるときは、ディスクにアクセスにいかないということです。はしょりすぎてすみません。俗に言う、遅延書き込みや先読みと呼ばれる部分です。ページキャッシュがやりとりをするので、データの転送は、カーネルモードのプロセスがカーネル空間のメモリをつかうことになります。
ただし、open()で、O_DIRECT(直接転送のためのフラグ)がたてられていたりすると、ページキャッシュによるデータ転送を行わず、ユーザー空間のメモリをカーネルモードのプロセスが操作することになります。つまり、read()/write()を行うとディスクまでアクセスが行われることになります。また、アクセスを行っても、ページキャッシュを生成したりしません。O_DIRECTについて、以前簡単にまとめたものをどうぞ。
O_DIRECTで遊ぶ - takkan_mのNo planな日常
なので、LinuxでのI/O操作では、意図的にO_DIRECTを指定したりなど、同期I/Oを発行するような操作を行わない限りは、非同期に行われるといえます。