コンピュータサイエンスにおいて、ファンネルはカーネル開発でシステムリソースを保護するために使用される同期プリミティブです。当初はDigital UNIXでデバイスドライバの実行を単一のプロセッサに「集中」させる方法として使用され、現在はMac OS XカーネルでXNUのBSD部分へのアクセスをシリアル化するためにファンネルが使用されています。[ 1 ]
ファンネルとは、複数のスレッドが同時に特定のカーネルリソースにアクセスするのを防ぐための相互排他(ミューテックス)メカニズムです。各スレッドは、カーネルの同期領域に入るときにファンネルを取得し、抜けるときにファンネルを解放します。スレッドがファンネルを保持したままブロック(スリープ)した場合、カーネルはスレッドにファンネルを自動的に解放するように強制し、他のスレッドがカーネルの同期領域に入れるようにします。
スレッドがブロックされるとファンネルは自動的に破棄されるため、ブロッキング操作の後には同期リソースが確実に再取得されるように注意する必要があります。具体的には、ファンネルの取得自体がブロッキング操作となる場合があるため、複数のファンネルが必要な場合は、それらを同時に取得する必要があります。このため、複数のファンネルを同時に保持する必要がある場合にロックの粒度が細かくなり、ファンネルの利便性が制限されます。
OS X 10.4以降では、ファンネルは1つだけです。バージョン10.4より前は、ネットワークリソースを保護するファンネルと、その他のBSDカーネルリソースを保護するファンネルの2つがありました。スレッドは一度に1つのファンネルしか保持できず、両方を保持するとカーネルパニックが発生しました。これらの制限と粒度の不足のため、ファンネルはMac OS Xから段階的に廃止されています。たとえば、ネットワークファンネルは、より粒度の細かいロック機構に置き換えられました。
出典に関する注記については、下記の参考文献を参照してください。