はじめに
本記事はlinuxカーネルのソース分析によって、このソフトウェアの様々な特徴を可視化します。ソースの総行数といったありがちなものから、1つのバージョン内のrelease candidate(rc)ごとのパッチ数の推移やサブシステムごとのデータなども出しています。
データ採取した範囲はgitで追える範囲のv2.6.12〜v4.10までです。ものによってはv4.0〜v4.10までの情報のみを採取しています。
総行数
行数は*.[ch]というパターンにマッチする行の数を使いました。v2.6.12では600万行そこそこ(それでも凄いのですが)だったのが、12年弱後に出た執筆時点では最新のv4.10では約4倍の2200万行弱まで増加しています。行数はおおよそ単調増加をしていますが、唯一v3.17だけ減少していました(理由は後日調査するかも)。増加速度が衰える気配は見えておらず、未だ活発なプロジェクトであることがわかります。
パッチ数
v2.6.24あたりまでは増加傾向にありますが、その後はバージョンごとに一万から一万五千パッチあたりをうろうろしています。やや増加傾向にあると言えるかもしれません。行数ではなくパッチ数という観点で見ても開発は活発といえます。
行の増加数
バージョンごとの行の増加数も数えました。行の増加数は、挿入行数から削除行数を引いたものを簡単のため使用しました。
ばらつきはありますが、リリース毎におよそ25万行(!)増加していることがわかります。linuxカーネルは9〜10週程度に一度新バージョンをリリースしますので(後述)、一週間ごとに2万〜3万行、一日ごとに3千〜4千行増加していることがわかります。linuxの開発には、いかに莫大なリソースが投入されているかがわかります。
ただし、これはあくまでリリース版に入ったコードだけの話なので、実際には
- 上記の通り、単に行の追加だけではなく削除もしている
- マージされなかったコードが星の数ほどある
などの理由によって、このデータに現れないものも含めた投入リソースはさらに多いと推測します。
パッチごとの行の増加数
時を経るに従って増減するわけではなく、かなりばらばらです。平均すると1パッチごとに20行程度増加しているようですが、このデータだけでは平均値を使うのがそもそも適切かどうか怪しいところです。いずれ分散を計算したり、中央値を出したりするかもしれません。
release candidate(rc)ごとのパッチ数から見るlinuxのリリースサイクル
バージョンごとのデータを見るとパッチ数はそれなりに安定していましたが、さらに細かい単位で見るとどうなるでしょうか。
linuxは新たなバージョンをリリースするごとに、その後二週間後にrc1がリリースされます。その後一週間ごとにrc2, rc3...とバージョンを重ねて安定化させてゆき、rc7の一週間後に次版をリリースします。たまにLinux開発のリーダーであるLinus氏の判断により、rc7から一週間後のバージョンでも安定していないとみなされた場合はrc8が出ることがあります1。
以下はrcリリースごとに見たパッチ数の推移です。
rc1で莫大な数のパッチが適用されて、その後はそれに比べればほとんどマージされないことがわかります。それもそのはず、linuxでは、ある版がリリースされてから次版用のrc1が出るまでの二週間はマージウィンドウと呼ばれ、新機能追加パッチが入るのは基本的にこの期間だけです2。
rc1のパッチ数が多すぎるので、縦軸のスケールを変えて、rc1以外に注目したグラフを見てみましょう。
なんとなくrcの数が増えるごとにマージされるパッチの数が減っていっていることがわかります。これは、rc1ではあらゆるパッチ(前述の新機能パッチに加えて重要な修正、マイナーな修正、cleanupなど)がマージされますが、rc2以降、とくにrc後半になるほど重要なパッチしかマージしなくなってゆくという開発方針によるものです。
サブシステムごとの情報
これまでにカーネルの総行数について分析してきました。では、カーネルにある様々なサブシステムのうち、全体に対してどれの行数が多いのか、どれに対するパッチが多いのかを見てみましょう。ここはソースのトップディレクトリのうち、
- カーネルに関係ないユーザ空間のもの
- ヘッダファイル用(include/)
- ドキュメント(Documentation/)
などを除いた以下のディレクトリをサブシステムとしてデータを採取しました。
サブシステム名(ディレクトリ名) | 役割 |
---|---|
arch | 各CPUアーキテクチャ固有部分 |
block | ブロックデバイス層 |
crypto | 暗号化 |
drivers | ドライバ。キャラクタデバイス、ブロックデバイス、NICなど |
fs | ファイルシステム。ext4, XFS, Btrfs, nfsなど |
init | 初期化 |
ipc | System V IPC |
kernel | コア部分。プロセススケジューラ、割り込み、タイマー、シグナル制御など |
lib | 他のサブシステムから使うライブラリ |
mm | メモリ管理 |
net | ネットワーク。IPv{4,6}など |
security | セキュリティ。SELinuxなど |
sound | サウンド |
virt | 仮想化。KVMなど |
どのサブシステムの行数が多いか
一見してドライバ(drivers/)のコードが圧倒的に多いことがわかります。その後に第二勢力としてファイルシステム(fs/)、サウンド(sound/)、ネットワーク(net/)などが続きます。コア部分(kernel/)やメモリ管理(mm/)はじつは全体から見ると大した規模ではないというのが面白いところです。
どのサブシステムの増加行数が多いか
ドライバが圧倒的多数を占めており、その他のサブシステムの増加量はほとんど誤差範囲です。これより、linuxのコードが年々凄まじい速度で増加しているのは事実だとしても、その増加量のうちのほとんどはドライバのコードだということがわかります。
まだデータ採取はしていませんが、恐らくは既存ドライバ用コードの修正、機能追加というよりは、新デバイスへの対応が大多数を占めるものと筆者は推測しています。
ドライバを除いた部分についても見てみましょう。
行数の場合の第二勢力であったファイルシステム(fs/)、サウンド(sound/)、ネットワーク(net/)がこちらでも第二勢力であることがわかります。ただし、どのバージョンでどのサブシステムが大きく変更されるかについてはかなりばらつきがあります3。
おわりに
本書で統計情報に使ったソースはgithub上に置いています。
他にも色々見ると面白いところはありますが、まずはここまで。