FreeBSD と DragonFlyBSD における実行モデルの違い
本資料は、FreeBSD と DragonFly BSD におけるカーネル内部の実行モデルの違い、
特に以下の点にフォーカスしてまとめました。あってるかは知りません。
- 割り込みの扱い
- スレッド / 実行主体の考え方
- DragonflyBSDならではのLWKTとは
2. FreeBSD:実行主体(人)中心
FreeBSD では、OSの内部処理を考える際の軸は「今どのスレッドが実行されているか」である。
- 現在実行中のスレッド(current thread)が判断の中心
- 割り込みは、既存の実行文脈に割り込んで処理される
- スケジューラは「誰を次に走らせるか」を常に判断する
例:飲食店のくそバイト方式(人間中心モデル)
- バイト = スレッド / プロセス
- 店長 = スケジューラ
- 仕事 = 割り込み・処理要求
状況例
店長:「いまAくん、手空いてるな」
店長:「これもやって」
Aくん:「もう終わりました」
店長:「じゃあ次はこれ」
仕事を早く終わらせられる人ほど、次の仕事がどんどん与えられる。
一方で、処理が遅い人が担当している仕事は、途中で他人に移されることもある。
OS的な対応関係
- 「今どのスレッドが動いているか」を中心に管理
- 割り込みは「今動いている文脈」に割り込んで処理
- 実行時に頻繁に判断が入る
人間にとって直感的で、
「今なにをすればいいか」「誰が重いか」を把握しやすい設計。
その一方、
割り込みや並列処理が多くなると文脈切替やロックが増えやすい。
3. DragonFly BSD:イベント(仕事)中心
DragonFly BSD では、実行主体ではなく「何が起きたか(イベント)」が中心となる。
- 割り込みはイベントとして扱われる
- イベントはメッセージ化され、対応する LWKT に配送される
- 実行主体は「仕事を処理する役割」として位置づけられる
人(スレッド)を見て仕事を振るのではなく、
仕事の種類を見て、あらかじめ決められた担当に流す
という設計になっている。
例:ベルトコンベア工場ライン方式(仕事中心モデル)
- ライン = CPU コア
- 機械 = LWKT
- 流れてくる部品 = 割り込み・イベント
初期設計
ラインA:ネットワーク処理
ラインB:ディスク処理
ラインC:USB処理
この役割分担は 最初にほぼ固定 される。
実行中の挙動
イベント発生
→ 種類を判定
→ 対応するラインに投入
- ラインAが速ければすぐ空く
- ラインBが遅ければずっと処理中
- 他ラインが暇でも手助けしない
「人が暇だから助けに行く」という判断は原則行われない。
仕事は必ず担当ラインに流れる。
OS的な対応関係
- 「何が起きたか」を中心に処理を決定
- スレッドは仕事を処理する“役割”にすぎない
- 実行時の判断を極力排除
人間から見ると冷たいが、割り込み洪水や高負荷状態でも構造が壊れにくい。
4. 比喩的まとめ
- FreeBSD:人を見て仕事を割り振る上司
- DragonFly BSD:仕事の流れを最初に決める上司
どちらが優れているという話ではなく、
「何を中心に世界を見るか」が異なる設計思想である。
5. LWKT(Light Weight Kernel Thread)とは何か
DragonFly BSD において、これまで例として説明してきた
「工場ラインの機械」に相当する実体が
LWKT(Light Weight Kernel Thread)である。
- LWKT は DragonFly BSD 固有のカーネルスレッド機構
- ユーザープロセスではなく、カーネル内部処理のための実行主体
- 割り込みやイベントを処理するために設計されている
DragonFly BSD では、割り込みや内部イベントは
直接「今動いているスレッド」に押し込まれるのではなく、
あらかじめ割り当てられた LWKT にメッセージとして配送される。
このため、実行の判断は
「どのスレッドが空いているか」ではなく、
「このイベントはどの LWKT の担当か」
によって行われる。
6. まとめ
- 本資料はユーザープロセス管理ではなく、カーネル内部の実行モデルの話である
- FreeBSD は実行主体(スレッド)中心
- DragonFly BSD はイベント中心
- 設計思想の違いが、コードの書き方・見え方に直結している
