launchdは、ネットワークの接続や時間、ファイルやディレクトリの変化とさまざまな事象を並列して監視する必要がある。この監視の肝となるのが、FreeBSDで搭載されたkqueue(2)だ。Mac OS XのBSDレイヤーはFreeBSDから多くのコードが移植されており、kqueue(2)もPantherにてすでに移植されている。しかし、特に使用されているわけではなかった。
kqueue(2)は、select(2)に代わるイベントの待ち受けシステムコールである。selectがファイルディスクリプタ*しか監視できないのに対して、kqueueは、ファイルの変更やシグナルの着信、プロセスの起動や終了といったより多くのイベントを効率的に監視できる(図2)。launchdの多彩なイベント監視機能は、まさにこの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が識別するために用いる数値。
ただしMach IPCに関しては、まだkqueueでは処理できない、EVFILT_MACHというkeventのフィルターの定義が存在するが、いまのところ機能していない模様。このためlaunchdでは、スレッドッドを2つ立ち上げ、これらを待つMach IPC専用の処理を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.