2 つのプロセス間でファイル記述子を渡すアプリケーションを作成しています。私はUNIXドメインソケットを使用sendmsg()
しrecvmsg()
ており、FDを補助データとして渡すことで同じことを行っています。
私のテストでわかったことはsendmsg()
、接続モードSOCK_SEQPACKET
ソケットのパフォーマンスは、接続なしソケットのパフォーマンスよりもはるかに優れているということですSOCK_DGRAM
。この背後にある理由は何ですか?
これが私のコードをテストする方法です。クライアント側のプログラムは、 を使用したイベント ループですepoll
。これは、FD に対して aを実行recvmsg()
し、受信した FD をすぐに閉じます。非常に簡単です。
sendmsg()
サーバー側では、クライアント側でこの単一の FD に対して複数のスレッドを実行しています。sendmsg()
スレッドの数、スレッドごとの呼び出しの数などの複数の組み合わせを試しましたが、sendmsg()
接続モードのソケットは、接続のないソケットのカウンター部分よりもはるかに高速です。
私が考えることができる唯一の理由は、カーネルがいくつかのファイルシステム呼び出しを含むソケットパス名でクライアント FD のルックアップを行う必要があるかもしれないということですか?