4

sys/queue.h4.4BSDで最初に登場しました。Linuxはそれをディストリビューションに含めましたが、バージョンは最新ではないようです。

FreeBSDバージョンは、単一リンクリスト、単一リンクテールキュー、リスト、およびテールキューを実装しています。Linuxバージョンは、リスト、テールキュー、および循環キューを実装します。

Ubuntu PCにlibbsd-devパッケージをインストールした後、でBSDバージョンを見つけましsys/queue.h/usr/include/bsd/sys/queue.h

私の質問:

  • このヘッダーファイルのLinuxバージョンはどこにありますか?

  • これら2つの実装の主な違いは何ですか?LinuxバージョンはBSDの古いバージョンにすぎませんか?

4

2 に答える 2

3

彼らは同じ祖先を共有していますが、彼らの中で行われた開発はずっと前に分岐したように見えます。

プロジェクトで使用する場合は、最も気に入ったものをプロジェクトにコピーして使用するのが最善の策です。あなたにそれを提供するシステムに依存しないでください。これは、多数のマクロを含む単なるヘッダーファイルであり、動作するためにライブラリや依存関係を必要としないため、オペレーティングシステム固有ではありません。私は通常、プロジェクトのためにOpenBSDからのものを取ります。

于 2013-01-23T16:26:32.990 に答える
0

Linuxのバージョンはひどく時代遅れのようです。CIRCLEQは、2001年以降BSDで(かなり強力に)非推奨になり、実装がまだqueue.hにある場合でも、ドキュメントから削除されています。TAILQを使用することになっています。これは、同じ機能を提供し、パフォーマンスが向上し、問題が少なくなり、実装が適切になります。

一方、Linuxでもまだ文書化されていますが、BSDの非推奨を理由に、CIRCLEQからTAILQに移行するkconfigの変更を見つけることができます。

CIRCLEQの具体的な問題は、リストノードとは異なる特定のヘッドを使用しているようですが、それはとにかくノードとしてリンクされています。そのため、ノードがヘッドであることが判明するかどうかを確認するために、ヘッドポインタを維持し、すべてのノードアクセスでチェックする必要があります。したがって、2つの問題があります。すべてのアクセスでのチェックと、レジスタまたはキャッシュを取得するためにヘッドポインタを手元に保持する必要があることです。

于 2015-08-14T15:25:11.883 に答える