Linuxに置けるバッファリングの制御 3つ
- バッファリングなし
データは直接カーネル空間へ書き込まれユーザ空間のバッファイングを行わない。 標準エラー出力などが該当し
- 行バッファリング
行単位でバッファリングする。改行文字が書かれるとバッファをカーネル空間へ書き込む。 画面へ出力するストリームなどで効率的に使用される。
- ブロックバッファリング
ブロック単位でバッファリングされる。ファイルの場合に最適なバッファリングである。 デフォルトでは、ファイルに対応するすべてのストリームはブロック単位でバッファリングされる
#include <stdio.h> int setvbuf (FILE *stream, char *buf, int mode, size_t size); # バッファリングなし _IONBF # ラインバッファリング _IOLBF # ブロックバッファリング _IOFBF
bufはsizeバイト数分のバッファを指し、標準I/Oライブラリ関数はstreamバッファとしてbufを使用する。
scatter-gather I/O
1データストリームへ複数バッファを1度のシステムコールで書き込むまたは読み込むI/O ベクタI/Oと言った呼ばれ方もする。 ヘッダファイルですでにフィールドが指定されているなどデータがもともとセグメントに分割されている場合でも直感的に処理できる。 複数のリニアI/Oを一つへまとめることができるので効率性も高い。