2つのライブラリは両方とも非同期I/Oスケジューリング用に設計されており、どちらもLinuxではepollを使用し、FreeBSDなどではkqueueを使用します。
表面的な違いを除いて、これら2つのライブラリの本当の違いは何ですか?建築、またはデザイン哲学に関して?
設計哲学に関しては、libevは、libeventのアーキテクチャ上の決定の一部を改善するために作成されました。たとえば、グローバル変数の使用により、マルチスレッド環境でlibeventを安全に使用することが困難になりました。ウォッチャー構造は、I / O、時間、および信号を組み合わせているため、大きくなります。ハンドラーが1つになっていると、httpサーバーやdnsサーバーなどの追加コンポーネントは、実装品質が悪く、セキュリティの問題が発生し、タイマーが不正確になり、タイムジャンプにうまく対応できませんでした。
Libevは、グローバル変数を使用せず、すべての関数にループコンテキストを使用し、イベントタイプごとに小さなウォッチャーを使用して(I / Oウォッチャーはx86_64で56バイトを使用しますが、libeventでは136バイトを使用します)、これらのそれぞれを改善しようとしました。ウォールクロック対単調時間に基づくタイマー、スレッド間割り込み、他のイベントループを埋め込む、または埋め込むためのウォッチャーの準備とチェックなどのイベントタイプ。
余分なコンポーネントの問題は、それらをまったく持たないことで「解決」されるため、libevは小さく効率的ですが、libevにはhttpライブラリがないため、他の場所でhttpライブラリを探す必要があります(たとえば、 libeioと呼ばれる非常に関連性の高いライブラリで、非同期I / Oを実行します。これは、独立して使用することも、libevと一緒に使用することもできるため、組み合わせて使用できます)。
つまり、libevは1つのこと(POSIXイベントライブラリ)のみを実行しようとします。これは、可能な限り最も効率的な方法です。Libeventは、完全なソリューション(イベントライブラリ、ノンブロッキングI / Oライブラリ、httpサーバー、DNSクライアント)を提供しようとします。
または、さらに短く、libevは、UNIXツールボックスの哲学である1つのことだけを可能な限り実行しようとします。
これは私がlibevを設計したので、私が権威を持って述べることができる設計哲学であることに注意してください。これらの設計目標が実際に達成されたかどうか、または哲学が健全な原則に基づいているかどうかは、あなたが判断する必要があります。
2017年の更新:
私が参照しているタイマーの不正確さ、およびlibevがWindowsでIOCPをサポートしていない理由を何度も尋ねられました。
タイマーに関しては、libeventは、あなたが知らないうちに、将来の未知の基準時間に関連してタイマーをスケジュールします。Libevは、タイマーのスケジュールに使用する基本時間を事前に通知できます。これにより、プログラムはlibeventアプローチとlibevアプローチの両方を使用できます。さらに、バックエンドによっては、libeventがタイマーを早期に期限切れにすることがありました。前者はAPIの問題であり、後者は修正可能です(そして、私がチェックしなかったので修正された可能性があります)。
IOCPのサポートに関しては-IOCPは単に十分に強力ではないため、それができるとは思いません。一つには、特別なソケットタイプが必要です。これにより、ウィンドウで許可されるハンドルのセットがさらに制限されます(たとえば、perlで使用されるソケットはIOCPの「間違った」タイプです)。さらに、IOCPはI / O準備イベントをまったくサポートせず、実際のI/Oのみを実行できます。ダミーの0バイト読み取りを行うなど、一部のハンドルタイプには回避策がありますが、これもWindowsで使用できるハンドルタイプをさらに制限し、さらに、すべてのソケットプロバイダーで共有されない可能性のある文書化されていない動作に依存します。 。
私の知る限り、WindowsでIOCPをサポートするイベントライブラリは他にありません。libeventが行うことは、イベントライブラリに加えて、IOCPを介して実行できる読み取り/書き込み操作をキューに入れることを可能にします。libevはI/Oを実行しないため、libev自体でIOCPを使用する方法はありません。
これは確かに設計によるものです。libevは小さくてPOSIXに似ているように努めており、WindowsにはPOSIXスタイルのI/Oイベントを取得する効率的な方法がありません。IOCPが重要な場合は、IOCPを自分で使用するか、実際にI /Oを実行してIOCPを使用できる他の多くのフレームワークのいくつかを使用する必要があります。
私にとってのlibeventの大きな利点は、組み込みのOpenSSLサポートです。libevent APIの2.0バージョンで導入されたBuffereventインターフェースは、開発者にとってほとんど苦痛なく安全な接続を処理します。私の知識が古くなっている可能性がありますが、libevはこれをサポートしていないようです。