3

私のアプリケーションはネットワーク経由で大量のデータを送信する予定なので、(Linux を使用しているため) epoll と splice を使用することにしました。これが私がそれをどのように見るかです(疑似コード):

epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
while(1)
{
    epoll_wait (tmp_structure);

    if (tmp_structure->fd == file_descriptor)
    {
        epoll_ctl (file_fd, EPOLL_CTL_DEL); 
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_ADD); // wait for EPOLLOUT event
    }

    if (tmp_structure->fd == tcp_socket_descriptor)
    {
        splice (file_fd, tcp_socket_fd);
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_DEL); 
        epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
    }
}

私のアプリケーションは最大 2000 の TCP ソケットを開くと仮定します。次の 2 点についてお尋ねします。

  1. 非常に多くの epoll_ctl 呼び出しが発生しますが、非常に多くのソケットを使用すると遅くなりませんか?
  2. ファイル記述子は最初に読み取り可能になる必要があり、ソケットが書き込み可能になるまでにある程度の間隔があります。ソケットが書き込み可能になった時点で、ファイル記述子がまだ読み取り可能であることを確認できますか (呼び出しのブロックを回避するため)。
4

2 に答える 2

2

最初の質問

  1. トリガーされたポーリングではなくエッジトリガーを使用できるため、毎回ソケットを削除する必要はありません。
  2. EPOLLONESHOTを使用して、ソケットの取り外しを防ぐことができます

ファイル記述子は最初に読み取り可能になる必要があり、ソケットが書き込み可能になるまでにある程度の間隔があります。

どんな種類のファイル記述子?ファイルシステム上のこのファイルがこの目的でselect/pollまたは他のツールを使用できない場合、ディスクとキャッシュの状態に関係なく、ファイルは常に読み取りまたは書き込み可能になります。スタッフを非同期にする必要がある場合は、aio_*APIを使用できますが、通常はファイルから読み取り、ファイルへの書き込みを行い、非ブロッキングであると想定します。

TCPソケットの場合、ほとんどの場合書き込み可能です。EWOULDBLOCKを取得するときは、非ブロッキング呼び出しを使用し、ソケットをepollに配置することをお勧めします。

于 2010-11-13T20:27:29.283 に答える
1

EPOLLET フラグの使用を検討してください。これは間違いなくその場合です。このフラグを使用すると、epoll での最初の登録以降、ファイル ディスクリプタを登録解除 (またはモード オンの変更) せずに、適切な方法でイベント ループを使用できます。:) 楽しい!

于 2014-02-16T23:03:10.030 に答える