プロセスがブロックする要因の一つにファイルI/Oがあります。これを同期I/Oと言いますが、POSIXではAIO(非同期 I/O、Asynchronous I/O)も定義しており、I/O中でもプロセスがブロックせず他の処理を進められるようになります。 本記事ではバッファキャッシュからファイル I/Oを解説し、Linuxのio_submit(2)を用いたPOSIX準拠のAIOライブラリを試作してみます。
ファイルI/Oとバッファキャッシュ
io_submit(2)ではDirect I/Oを用いますが、ライブラリの試作へ進む前にまずファイルI/Oのバッファ(バッファキャッシュ)について整理します。実は単にバッファと言ってしまうと誤解される場面が多くあり、例えばプログラミング入門一般としてファイルI/Oを取り上げる際には、
- CPUの動作は速い。ディスクの動作は遅い。
- 両者の間に速度差を緩和する緩衝地帯を設けないと、CPUの速度が犠牲にされてしまう。
- このため、ファイルバッファを用いる。
といった説明があり、よく以下のようなサンプルコードが提示されます。
ファイルI/Oサンプルコード
main()
{
# define SZ 16
int fd;
char buffer[SZ];
fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
memset(buffer, 'a', SZ);
write(fd, buffer, SZ);
}
先ほどの説明の後でbufferという名前の配列を見ると、これがCPUとディスクの速度差を緩和する緩衝体(バッファ)の役割をするもなのかと思ってしまいそうです。しかし現代の一般的な環境では、このbufferにはあまりそのような意味合いはなく、単なる作業用のメモリ領域に過ぎません。細部を説明する前に、あと2つサンプルコードを挙げます。以降のサンプルコードは付属のソースファイル一式に含まれているので、詳細はそちらを参照してください。
![[View Cart]](/images/button_cart_off.gif)

Theme![[com]](/images/usa.gif)
![[de]](/images/germany2.gif)
![[cn]](/images/china2.gif)
![[tw]](/images/taiwan2.gif)
ORJ on Twitter
Bookclub News