IOモデル(ファイルディスクリプタ) - 詳細-02

EDITORIAL

  サービス側の開発で、そして最終的に、接触ネットワークプログラミングへ。必要な技術として、Linuxでのepollは、ほとんどのサーバーは、このゲームの多重化技術を使用して、重要な高性能ネットワーク・サーバです。記事の核となるアイデアは、次のとおりです。読者が明確に理由のepoll良好な性能を理解しましょう。

コアネットワークによって受信されたデータの第四の、全体プロセス

  このステップでは、カードを介して、プロセススケジューリング知識、RECVをブロックするのに物語、全体のカーネルプロセス受信したデータを中断します。

  以下に示すように、閉塞処理はRECV中、コンピュータは、端末のデータ転送(ステップ①)を受信します。メモリカード(ステップ②)を介してデータ転送が、その後、割り込みがカードデータによってシグナリングされるCPUは、CPU割り込みプログラムは(ステップ③)が実行される到着します。ここで、プログラムは、2つの主要な機能を有する割り込み、データは、ソケット(ステップ④)内部バッファを受信し、対応する第一のネットワークに書き込まれ、その後、処理A(ステップ⑤)、作業キューに再びプロセスAを起動します。

 

   覚醒処理プロセスを以下に示します。

 

  上記コアが受信したデータの全体処理であります

    二人は最初にそれについて考える、質問を考えてここに残しました。

    どのようにまず、オペレーティング・システムは、ソケットに対応したネットワークデータを知っていますか?ポート番号に対応するソケット、およびネットワーク・データ・パケットは、情報IPとポートを含んでいるので、カーネルが対応するソケットのポート番号を経由して見つけることができます。もちろん、処理速度を向上させるために、オペレーティング・システムは、迅速に読み取るために、ソケットのインデックス構造にポート番号を維持します。

    第二に、どのように同時にデータの複数のソケットを監視するには?多重化が最優先事項である、それは、この記事の後半の焦点であります!

第五に、簡単な方法は、ソケットの複数を監視しながら

  サーバが複数のクライアント接続を管理する必要がある、とのrecvが単一のソケットを監視することができ、この矛盾は、人々は、複数のソケットを監視する方法を探し始めました。epollは、効果的なモニタリング、複数のソケットの本質です。視点の発展の歴史的な観点からは、あまり効率的な方法は、必然的に、最初の改善と相まって、人々が来ます。最初のepollの性質を理解できるようにするには、あまり効率的な方法を理解しています。

  あなたはソケット事前にリストを渡すことができた場合は、リストには何のデータソケットでない場合は、データを受信するためのソケットがあるまで、プロセスを中断し、プロセスを覚まします。この方法は非常に直接的ですが、また、デザインを選択します。

  理解を容易にするために、我々は最初の選択の使用を確認します。全てFDSソケットを監視する必要性を保つように、次のコードでは、アレイ(下記のコードでFDS)を調製。そして、ソケットがデータを選択しリターンを受け取るまで、すべてのソケットFDSがデータ、選択ブロックをされていない場合は、選択呼び出しプロセスを覚まします。FDSユーザには特定FD_ISSETの決意を介してデータを受信するソケット、横断することができ、それに対処します。

ソケットS = INT(AF_INET、SOCK_STREAM、0 );   
結合(S、...)
(...、S)聴く

INT FDS [] =   記憶ソケット聴いする必要がある

(一方、1 ){ 
    int型N- = SELECT(.. 。、FDS、...)
    (I int型のため = 0 ; Iはfds.countを<; Iは++ ){ 
        (FD_ISSET(FDS [I]、... IF)){
             // データ処理FDS [I]において
        } 
    } 
}

選択プロセス

  アイデアの選択実現は簡単です。プログラムはsock1次の図、sock2 sock3三個のソケットを監視しながら場合は、select呼び出した後、オペレーティングシステムのキューは、Aは、3つのソケットに追加された処理します。

ソケットがデータを受信すると、割り込みルーチンはプロセスを呼び起こすだろう。次の図は、処理フローsock2データを受信示します。RECV割り込みコールバックを選択するには、別のコンテンツに設定することができます。sock2は、データ、プロセス割り込みルーチンを喚起する受信しました

いわゆるプロセスは、すべての待機キューから削除内部の作業キューに追加され、プロセスを呼び起こします。図に示すように。プロセスは、内部の作業キューに追加し、すべての待機キューから削除されます

  プロセスAが目覚めたときにこれらのステップを経て、それは少なくとも一つのソケットがデータを受信して​​いる知っています。ちょうどあなたが準備ソケットを得ることができ、プログラムのソケットのリストを反復処理します。

  このシンプルで効果的な方法は、ほとんどすべてのオペレーティングシステムが対応しているで実現しています。

 しかし、簡単な方法は、多くの場合、主に、欠点を持っています:

  まず、プロセスを選択するために、各コールがキューを待っているすべての監視ソケットに追加する必要があり、各キューから削除するたびに目を覚ますする必要があります。これを2回横断関与し、カーネルに全体FDSのリストを渡すたびに、いくつかのオーバーヘッドがあります。効率の検討事項に起因する大規模なトラバーサル操作のオーバーヘッド、の、規定が監視されますので、それはデフォルトの最大数は1024のみソケットを監視できる選択です。

  第二の後、プロセスが起こされる、プログラムがデータを受け取るどのようなソケットを知っている、だけでなく、一度横断する必要はありません。

  だから、トラバーサルを軽減する方法はありますか?保存方法のない準備ソケットはありませんか?これらの2つの問題に対処するのepoll技術です。

追加情報:このセクションには、選択の唯一の状況を説明しています。プログラムの呼び出しを選択すると、カーネルは最初に再びソケットを横断する複数のソケットバッファにデータが受信がある場合、その後、ブロックせずに、直接のリターンを選択します。そこの理由の選択された1つの戻り値が1よりも大きくすることができる理由です。何のソケットデータが存在しない場合、プロセスはブロックされます。

第六に、ファイルディスクリプタのデザインのアイデア

  N発明の後に選択の年に現れているのepollは、それが選択し、投票の拡張バージョンです。次の措置を通じて効率を向上させるためのepoll。

対策:機能分離

  非効率的な理由の一つは、「メンテナンスが待ちキュー」と一つに二つのステップ「のプロセスをブロックする」を選択することです。以下に示すように、あなたはすべての時間を変更する必要はありません、各呼び出しは、これらの2つの操作を選択する必要がありますが、ほとんどのアプリケーションシナリオは、比較的固定されたソケットを監視する必要があります。epollは、これら2つの操作を分離、最初epoll_ctlでプロセスをブロックするイベントがepoll_waitを呼び出して、待ちキューを維持します。明白な、効率を向上させることができます。

  フォローアップの内容の理解を容易にするために、我々は最初のepollの使い方の下で確認します。次のコードは、epoll_createのepoll epfdに存在してオブジェクトを作成し、その後、ソケットを監視し、最終的なコールがepoll_waitデータを待つ必要がありますepoll_ctlによってepfdに存在に追加します。

ソケットS = INT(AF_INET、SOCK_STREAM、0 );    
バインド(S、...)
聞く(S、...)

epfdに存在int型 = epoll_create(...); 
epoll_ctl(epfdに存在し、...); // epfdに存在で必要なすべてのリスニングソケットを加え

ながら(1 ){ 
    int型N- = イベントがepoll_wait(...)
    のために(ソケットがデータを受信した){
         // 処理
    } 
}

 

  機能分離、持っているファイルディスクリプタを最適化することが可能となります。

対策II:準備リスト

  もう一つの理由は、非効率的な選択は一つだけトラバーサル、データを受信するソケット知らないことです。カーネルが「準備リスト」参照のソケットがデータを受信維持している場合は、トラバーサルを避けることができます。以下に示す、受信データsock2 sock3が参照rdlist(レディリスト)であるとして示され、3つのコンピュータソケットがあります。プロセスが目覚めているときに限り、コンテンツrdlistへのアクセスなど、データを受信するソケットを知ることが可能です。準備ができた概略リスト

 

おすすめ

転載: www.cnblogs.com/chihirotan/p/11521065.html