Linuxシステムプログラミング(1-4章)
- 作者: Robert Love,ロバートラブ,千住治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/16
- メディア: 大型本
- 購入: 5人 クリック: 181回
- この商品を含むブログ (31件) を見る
自分には結構良かった。手元に置きたい位。ただ、本当にできる人はmanやらdocumentやらヘッダファイル(ソース)にあたることでこの程度のことは理解しているんだよね。後半も必ず読みます。
- 標準I/O
- fflush()はストリーム内にあるまだ書き込まれて無いデータをカーネルバッファへ書き込む。その後fsync()でカーネルバッファをディスク上へ書き出す。
- バッファリング方法の変更にはsetvbuf()が使える。(printfで改行を出力するまでメッセージが出力されないケースはこれを使って調整かな。)標準エラー出力を除き、端末はラインバッファリングされ、ファイルはブロックバッファリングされる。ブロックバッファリングのバッファサイズデフォルト値は、stdio.hで定義されるBUFSIZ。
- 標準I/Oはスレッドセーフ(lock, unlockしている)
- 標準I/Oの欠点として、二重コピー(ライブラリバッファへのコピー、カーネルバッファへのコピー)による遅延、等がある。
- readv/writev
- epoll()
- mmap()
- posix_fadvise()
- fdに対して、その使われ方情報を伝えることで、最適化を効きやすくする。
- ランダムアクセスか、シーケンシャルアクセスか、等。試す価値ありそう。
- synchronized, synchronous
- synchronous: データが少なくともカーネルのバッファに書き込まれるまで戻らないこと。通常のリード/ライト
- asynchronous: データがユーザ空間にあっても(処理がキューにつながれただけでも)戻ること。いわゆるAIO(非同期IO)
- synchronized: データが実際にディスク上に書き出され終わることを保障する。いわゆる同期IO
- 非同期I/O
- I/Oスケジューラ
- コンピュータアーキテクチャを考えると、ディスクアクセスは非常に遅いのでそのスケジューリングが重要。
- 現在のディスクはcylinder, header, sectorの組み合わせを、ブロック番号(物理ブロック、デバイスブロック)にマッピングしている。さらにファイルシステムは、論理ブロック(ファイルシステムブロック)という単位で処理する。ファイルシステムの論理ブロックは、ディスクの複数の物理ブロックに対応する。
- 書き込みはデフォルトでノンシンクロナイズ。読み出しはシンクロナイズにする必要があるので遅い。結果、カーネルとディスクが書き込みストリームの処理に集中してしまう問題がおきる。(writes-starving-reads問題)
- I/Oスケジューラのアルゴリズムはas, cfq, deadline, noop等。