libfuseの高レベルAPIと低レベルAPI
FUSEのユーザー空間ライブラリlibfuseは、ファイルシステムを実装するためのAPIを「高レベル(high-level)」「低レベル(low-level)」の2段階で提供している。高レベルAPIは低レベルAPIをラップする形で実装されており、自動的なinode追跡・パス解決・キャッシュを付加する。
同期・非同期モデル
最も根本的な違いは同期性。低レベルAPIは完全に非同期で、コールバックは明示的なreply用APIを使って結果を返す。一方、高レベルAPIは同期的で、コールバック関数がreturnした時点でリクエスト処理が完了する。
パス名 vs inode
- 高レベルAPI: ファイルシステム側はファイル名・パス名を使って操作を実装する。返り値(0または
-errno)で成功/失敗を示す。inodeの管理はlibfuseが自動で行う。 - 低レベルAPI: コールバックはinode番号とリクエストハンドルを使って操作する。FUSEが各エンティティに独自の「node ID」を割り当てて管理する。結果は
reply関数で明示的に通知する。
カーネルドライバとの連携
低レベルAPIはオプションをカーネルドライバへ直接通知できるが、高レベルAPIでは高レベルのオプションしかカーネルドライバに伝わらない。
どちらを使うべきか
パフォーマンス自体は同程度とされる。選択基準はユースケース次第。
- シンプルな実装で済ませたい、学習コストを下げたい → 高レベルAPI
- 細粒度のinode管理やカーネルとの連携が必要な高度な用途 → 低レベルAPI