連載
» 2007年04月29日 07時00分 公開

Undocumented Mac OS X:第2回 initを置き換えるlaunchd【後編】 (3/3)

[白山貴之,ITmedia]
前のページへ 1|2|3       

launchdの内部構造

 launchdは、ネットワークの接続や時間、ファイルやディレクトリの変化とさまざまな事象を並列して監視する必要がある。この監視の肝となるのが、FreeBSDで搭載されたkqueue(2)だ。Mac OS XのBSDレイヤーはFreeBSDから多くのコードが移植されており、kqueue(2)もPantherにてすでに移植されている。しかし、特に使用されているわけではなかった。

 kqueue(2)は、select(2)に代わるイベントの待ち受けシステムコールである。selectがファイルディスクリプタ*しか監視できないのに対して、kqueueは、ファイルの変更やシグナルの着信、プロセスの起動や終了といったより多くのイベントを効率的に監視できる(図2)。launchdの多彩なイベント監視機能は、まさにこのkqueueあってのこと*なのである。

図2 図2 kqueueを使うこうことで、カーネル内部で発生するイベントの中から、必要なものに関する通知をユーザーランドで効率良く受信できる

 イベント監視以外では、/var/launchd以下のUNIXドメインソケットを通じて行われるlaunchctlとの接続も、kqueueを通して処理される。

 そもそもkqueueは、selectよりも高機能なだけでなく、効率的な動作を視点に置いたシステムコールである。その点だけでもxinetdやinetdよりも高速な動作が期待できる。さらに、これまでxinetd、cron、mach_initなど複数のプロセスが分散して処理してきたことを集中的に処理し、加えてStartupItemsで起動していた処理の多くをlaunchdから起動するように移行したため、OSの起動処理で実行するコマンドの数は半分程度にまで減少している。TigerがPantherに比べ高機能にもかかわらずきびきびと動作するのは、こうしたlaunchdによる隠れた高速化のおかげといえる。

最後に

 launchdは、決して大きく取り上げられることはない、日陰の存在である。しかし、Tigerの体感速度や機能の向上に大きく貢献しており、しかもそれはMac OS由来の良く分からないものなどではなく、われわれUNIX使いの良く知るFreeBSDの技術を巧みに利用したソフトウェアでもある。

 Mac OS XはBSDをベースとしたOSで、その構造はUNIXそのものである。一見UNIXの標準と異なる機能があるとしても、その根底にはAppleらしい示唆に富んだUNIXの思想が息づいているのだ。

 次回は、Mac OS Xにおいてオブジェクトの永続化に用いられるファイル形式plistについて、plistとこれに対応するFoundationフレームワークがMac OS Xをどのように支えているのか解説する。

このページで出てきた専門用語

ファイルディスクリプタ

プログラムがアクセスするファイルの名称、サイズ、更新日時のほか、標準入出力などの情報をOSが識別するために用いる数値。

launchdの多彩なイベント監視機能は、まさにこのkqueueあってのこと

ただしMach IPCに関しては、まだkqueueでは処理できない、EVFILT_MACHというkeventのフィルターの定義が存在するが、いまのところ機能していない模様。このためlaunchdでは、スレッドッドを2つ立ち上げ、これらを待つMach IPC専用の処理を行っている。


関連キーワード

UNIX | Mac | Mac OS X | API | BSD


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ