2012-05-01 26 views
4

シンプルなサーバー(Linux)に非同期ソケットを実装することを決定する際に、問題が発生しました。私は継続的にpoll()を行い、呼び出し間でいくつかのクリーンアップとキャッシングを行います。今これは無駄に思えるので、私はもっと掘り下げて、への道を見つけた可能性があります。はi/oでコールバックを実装しています。Linuxの非同期ソケット - ポーリングとコールバックの比較

O_NONBLOCKでソケットを作成した場合は、SIOCSPGRP ioctl()を使用してi/oでSIGIOを送信し、sigaction()を使用してコールバック関数を定義すると、パフォーマンスが低下し、 I/O中に。

さらに、さまざまなソケットに異なる機能を定義できますか?

+0

[libevent](http://libevent.org/)や['libev'](https://github.com/brimworks/libev)のようなものを見てみませんか? – c00kiemon5ter

+0

私は可能な限り裸のアセンブリとして使用しようとしています^^ –

+0

私はかつてこれを試しました(そして成功しました!)が、結果のプログラムはsigprocmaskで時間の80%を過ごすのに費やしました。要点は、シグナルハンドラでmalloc()を呼び出すことができないため、SIGIOを無効にして事前に割り当てる必要があることです。単純なselect()やpoll()ループ(おそらくスレッドを持つ)は、管理が簡単です。参考:IIRC NTPはSIGIOを使用しています。恐らくDNS/bindもそうではありません。 – wildplasser

答えて

3

「私は継続的に()をポーリングしよう、と呼び出しの間にいくつかのクリーンアップとキャッシングを行いました。さて、これは無駄なようだ」

は無駄か?実際にこれを試して実装しましたか?

fdリストがあります。あなたはポーリングまたは(より良い)epoll()をリストに呼び出します。トリガーすると、fdリストを歩き、それぞれを適切に処理します。入力データと出力データをキャッシュする必要があるので、各fdには何らかの構造体が必要です。私がこれを行ったとき、fd構造体(fdからキーを生成する)にハッシュテーブルを使用しましたが、おそらく最初はであり、最初はで、固定長配列を使用し、 OSはあなたに奇妙な高いfdを発行します(nb、私はそれが起こるのを見たことがないと私は数えることができますより多くのログをsquinted)。構造体は、例えば、おそらく、状態変数、着信と発信のバッファへのポインタを保持する:おそらく、リンクリストは、FDさんのために、実際に最善である

struct connection { 
    int fd; // mandatory for the hash table version 
    unsigned char *dataOut; 
    unsigned char *dataIn; 
    int state; // probably from an enum 
}; 

struct connection connected[1000]; // your array, or... 

...、私はハッシュテーブルの無関係な要件を持っていました。

ここから開始し、段階的に修正してください。あなたは簡単な方法を見つけようとしていると思います。後で他のものを作ってお金を払うかもしれません。難しい;)$ 0.02。

+0

コールバックの使用のポイントは、私はresorcesの管理、メモリの最適化(私は自分自身のmallocも実装しています)にもっと時間を割けることができます。私はいつポーリングをやめ、維持管理を開始すべきか分かりません。私はサーバがメモリを解放するために何を動かすことができるか把握しようとしているので接続を逃したくありません;私はスケジューリングの仕方がわからないので、何らかのコールバックを実装すると解決策。 またスレッドから離れようとしています。 (前にそれらと一緒に作業しましたが、ただのスレッド/プロセスでそれを試してみたい) –

+0

コールバックを介してmmルーチンを中断し、接続を処理することが人生を楽にするとは思えません。一度に少しずつ行うようにルーチンを記述します。これは、非同期モデルに適合します。アイドル時にポーリングに適切なタイムアウトを設定します。 poll()がfd listの処理の最後に*を返すときには、ループしてpoll()を再度呼び出す前にいくつかのクイックmmの処理を行うべきかどうかをチェックします。その時点で、サーバがビジー状態の場合、対処するためにOSソケット層にたくさんのものを渡したばかりです。それはあなたの(速いビット)mmを行うための最善の時間です。 – delicateLatticeworkFever

+0

また、poll()が返ってきたときにfdリストの内容に基づいてサーバがアイドルであるかどうかを判断したり( "how busy"のメトリックを出してもよい)、それを使ってそのサイクルの最後には物が適切です。基本的には、1つのプロセスで2つの完全に無関係な独立したアクティビティとして処理するのではなく、ソケット処理とmmを統合する方法について考える必要があります。そうでなければ、スレッド。 – delicateLatticeworkFever

関連する問題