ablog

不器用で落着きのない技術者のメモ

LINUXシステムプログラミング

スーツをクリーニングに出したついでに、本屋に寄ったら

Linuxシステムプログラミング

Linuxシステムプログラミング

が素晴らしすぎて、衝動買いしてしまいました。


ファイルI/O、I/Oスケジューラなど、最近、興味のある分野について詳しく書かれていました。
この本で扱っている内容は主に以下の通りです。

RDBMSに密接に関連のあることばかりです。論理的で、本題を理解するために必要な前提知識についても親切に説明されています。著者の Robert Love 氏はLinuxのシステムソフトウェアやカーネルの開発者で Google に勤務されているようです。ぐぐってみると、彼のサイト(http://rlove.org/)やらブログ(http://blog.rlove.org/)やらTwitterアカウント(Twitter. It's what's happening.)やら見つかりました。


以下に一部引用します。
P. vii

まえがき
本書はシステムプログラミング、特にLinuxでのシステムプログラミングに焦点を当てた解説書です。システムプログラミング(system programming)はシステムの下位に位置するシステムソフトウェア(system software)の開発技術であり、カーネルやシステムのコアライブラリを直接操作します。別の言い方をすれば、本書で取り上げるテーマはLinuxシステムコール、およびCライブラリが実装する低レベルなライブラリ関数の使用方法です。

Unixシステムのシステムプログラミングを解説した書籍は多数存在しますが、Linuxを集中的に取り上げたものは多くありません。また、最新バージョンのLinuxLinux固有のインターフェースについて述べたものはさらに少ないのが現状です。さらに本書には1つの大きな特徴があります。著者が実際にLinuxの開発に加わっている点です。LinuxのシステムソフトウェアだけではなくLinuxカーネルも開発しています。本書で取り上げるシステムコールや機能のいくつかは実際に著者が開発したもので、本書には内部知識を多数盛り込み、単にシステムインターフェースはこのように定義されているという仕様面の話だけではなく、実際にどのように動作するかを解説しています。

P. viii

読者が本書を手に取った動機がなんであれ、まずは本書を楽しんでください

P. 118

4.6 I/OスケジューラとI/Oパフォーマンス
現代のシステムを見ると、ディスクだけがパフォーマンス面で大きく劣り、その格差は拡がっています。ディスクパフォーマンスでもっとも足を引っ張っているのは、ヘッドが移動する処理です。これをシーク(seek)と言います。わずかなプロセッササイクル数で多数の操作を処理する(処理それぞれは1/3ナノ秒もかかるかもしれません)世界では、1シークあたり平均して8ミリ秒以上かかる場合もあります。確かにディスクシークも速くなりましたが、それでも1プロセッササイクルの250万倍も遅いのです。

ディスクドライブとシステムの他の部分のパフォーマンス格差を考えれば、I/O要求が発生した順序通りにディスクへ渡していれば、信じられないほど未熟で非効率と言わざるを得ません。このため現代のオペレーティングシステムカーネルでは、I/Oスケジューラ(I/O scheduler)を実装しています。I/Oスケジューラは処理するI/O要求の順序および回数を管理し、ディスクシークの回数と移動量を最小化し、ディスクアクセスによるパフォーマンス劣化を最低限にとどめるものです。


4.6.1 ディスク上の配置
I/Oスケジューラの役割を理解するには、若干の知識が必要となります。ハードディスクはディスク上のデータ位置を特定するのに、昔ながらのシリンダ、ヘッド、セクタ(cylinder、head、sector)を使用しています。これをCHSアドレッシング(CHS addressing)と言います。

P. 119

4.6.2 I/Oスケジューラの目的
I/Oスケジューラの基本的な処理はマージとソートの2つです。マージ(merging)は複数の隣接するI/O要求を組み合わせ、1つのI/O要求へと変換する処理です。今2つのI/O要求があるとします。ディスクブロック5から読み取る要求と、ディスクブロック6と7から読み取る要求とします。この2つのI/O要求はディスクブロック5から7を読み取る、1つのI/O要求へマージ可能です。I/Oの総量は変化しませんがI/O要求数は半分になります。
ソート(sorting)はより重要な処理で、待機中のI/O要求をブロック番号が昇順になるように並び替える処理です。例えば、ブロック52、109、7へI/O要求があった場合に、I/Oスケジューラは順序を7、52、109へ並び替えます。