選択し、ファイルディスクリプタ、ソケット

ソケット()関数:
通常のファイルオープン操作に対応するソケット関数は、通常の開動作が一意のソケットを識別するソケット記述子のためのソケットを作成するために、ファイルのファイル記述子を返し、ソケット関数3でした。

  • ドメイン、プロトコルファミリ(AF_INET)プロトコル・スイートは、アドレス型センスに対応するソケット、AF_INET対応する組成物(32)とIPv4のポート番号(16)を決定します
  • タイプ、一般的にそうでSOCK_STREAM、SOCK_DGRAM、SOCK_PACKETと使用されるソケットのタイプを指定し、
  • プロトコル、TCPまたはUDP伝送プロトコルの代わりにトランスポートプロトコル
    タイプとプロトコルのランダムな組み合わせではありません
    あなたはソケットを使用してソケットを作成すると、ソケット記述子が返されたが、特定のアドレスを持っていない、アドレスにバインドするbind関数を呼び出すとき、またはコールシステムを接続し、ランダムなポートを割り当て聞く
    、例えば、AF_INETアドレスとポート番号をソケットに割り当てられたIPv4なり、バインド機能は、プロトコルファミリのソケットに割り当てられた特定のアドレスに対処するためにある
    三つのパラメータのパラメータがバインドされている
    socketfd:ソケットディスクリプタ
    ADDR:socketfdに割り当てられたプロトコル・アドレスを指定し、socketaddr *ソケットを介さずに、アドレス・プロトコル・スイートを作成する際の構造に応じて、ポインタ型であり、IPv4と異なるIPV6
    addrlenはを:アドレス長は、対応
    一般サーバーあなたがサービスのためのよく知られたアドレスをバインド起動したときに、顧客がそれを介してサーバーに接続することができ、顧客は、サーバが通常聞く直前である理由である、指定システムが自動的にポート番号とアドレスの組み合わせのIPが割り当てられていませんバインド()、およびクライアントを呼び出します 呼び出しが、ランダムにシステムによって生成されたときに接続しないでください
    ソケットを呼び出すことにより、指定されたソケットアドレス、TCPクライアントを監視し、に接続することができます)(聞く)(順番にTCPサーバーはバインド後にソケットを()を呼び出した後、サーバーが接続要求を送信し、それは、TCPサーバーが要求を受け入れる取るための要求を受け入れるようにリッスンし、その接続が確立され、そして呼び出します
    成功した場合、戻り最初のパラメータは、サーバーへのソケット記述子であり、第2引数のクライアントプロトコルアドレスへの復帰のためいるsockaddrへのポインタ、第三のパラメータは、プロトコルアドレスの長さであり、受け入れる:受け入れます()値が自動的にリターンのTCPに接続されているお客さまに代わってカーネルによって生成された記述するための新しい単語である
    ソケットをパラメータを受け入れ、そのサーバーソケット()ファンクションジェネレータを呼び出しを開始するために、リスニングソケット記述子と呼ばれ、接続のリターンを受け入れますソケット記述子には、サーバは通常、唯一のリスニングソケットを作成し、その寿命は、サーバーがあった、各サーバプロセスは、コア顧客を受け入れるサーバは顧客サービスを完了することと、ソケットが接続されて作成されます、対応するコネクタソケット記述子がクローズされています

クライアントは、3ウェイハンドシェイクハンドシェイク二度目に戻るに接続し、第三3ウェイハンドシェイクのリターンを受け入れます

、投票を選択し、機構IOファイルディスクリプタが多重化され、記述子の複数回ディスクリプタがレディ(準備完了読み出し又は書き込みの準備のために)であり、監視することができ
、ポーリングを読み出し、適切な通知プログラムに通知し、操作を書くことができるが、選択epollを、本質的に、同期IO上、彼らは準備ができてイベントの後、自分の読み出しおよび書き込みに読み書きする必要があるため、読み取りと書き込みのプロセスがブロックされている
、すなわち三つのカテゴリー、writefdsに分け選択機能・モニター・ファイル記述子を、readfds、exceptfds、選択呼び出し記述子の準備ができるまで、機能ブロックの後に、データの読み取り、書き込み、またはタイムアウト、関数が戻る、SELECT関数は記述子がfdset横断することによって準備ができて見つけることができ返し
欠点を選択1つのプロセスがファイル記述を監視することができるがあるということです量で存在は、Linux上で一般的に1024上限を破る
複数のファイルの数が悪い性能記述子、スキャンファイル記述子を選択ポーリング
しばしば、複雑な操作をコピーし、カーネル/ユーザ・データを

ポーリング
と同じ機能を選択し、リターンがポーリング記述子たpollfdによって準備投票を取得します

epoll
epoll_create、epoll_ctlは、3つの機能をれるepoll_wait、epoll_create機能がリスニング記述子は、カーネルの内部データ構造の初期勧告を割り当てることができますされていない最大サイズのパラメータのファイル記述子の制限を作成し、それはファイルディスクリプタの記述子を返します。-1、作成に失敗したファイルディスクリプタの意味
指定されたディスクリプタのFD OP操作の実装上_ctl制御を、イベントがFD、イベントがepoll_wait上のイベントを監視するための3つ、EPOLL_CTL_ADD、EPOLL_CTL_MOD、EPOLL_CTL_DEL、削除、および修正が追加されたされたイベント、演算操作、リッスンFDに関連付けられていますIOは、epfdに存在上のイベントを待つmaxevents個のイベントまで戻ります

epollは、主に以下のような利点があります。
記述子の数が無制限に監視、それはFD上限をサポートして開くことができるファイルの最大数で、数字は2048年よりもはるかに大きい、
IOの効率がFDの成長と衰退を監視する数ではなく、 、ファイルディスクリプタを選択し、ポーリングポーリング異なるが、FD定義のコールバック関数によって達成される、コールバック関数を実行するだけ準備FDは、
レベルトリガとエッジトリガ二つの方法でサポートして
加速MMAPカーネルとユーザ空間情報をメモリコピーイントレピッドを避けるために、メモリとファイルディスクリプタのカーネルとユーザー空間で、送信

epollを効率的に使用すると、ハンドルの何百万人もの内側に詰めepoll_ctlを呼び出すときに、イベントがepoll_waitはまだすぐに戻って、効率的にあなたがepol_createを呼び出すときので、イベントがファイルディスクリプタで私たちを助けるためにカーネルに加えて、ユーザーの皆様はどうなるの扱うことができるということですファイルシステムノードのビルドファイル、epoll_ctl赤黒木を保存するためのカーネルキャッシュを構築するソケットを来たがepoll_wait電話の際は、ちょうどこのリストでリストを見て、readyイベントを格納するためのリストをリンクリストを作成します。データは、データは、睡眠に関するデータを返されませんすることができます。
カーネルのepollは、epoll_create物事を呼び出すとき、それは仮想ファイルシステムのepollにファイルノードを作成し、上記監視対象のソケットを格納するためのファイル・システムを登録してすべてが、カーネル内のファイルである
カーネル内のepoll初期化時間は,,それはこれらのソケットは、高速検索、挿入および削除をサポートするために、カーネルキャッシュの赤と黒の木の形で保存される監視するソケットを格納するために、独自のカーネルのepoll高速キャッシュ領域を開きます

  • epoll_createを呼び出し赤黒木と二重リンクリスト、および基礎となるコールバックメカニズムの確立が含まれているファイルディスクリプタオブジェクトを作成します
  • この呼び出しは百万オブジェクトソケットのepollへのリンクを追加epoll_ctl
  • イベントがepoll_waitは、呼接続イベントが発生集めます

カーネルの割り込みハンドラに対応するソケットepollファイルシステムのファイルオブジェクトがあれば、カーネルの割り込みハンドラを伝えるためにコールバック関数を登録しますへの外赤黒木に加えて、レディリストのメンテナンス、epoll_ctlを行い、カーネルは、カーネルの中に挿入されるカードにデータをコピーするデータがソケットに存在するときに、レディリストリンクリストの上に置いたので、リストにソケットを入れて準備ができています。

おすすめ

転載: blog.csdn.net/qq_30035749/article/details/88856013