その差を選択epoll.poll

差select.pollとのepoll

選択したイベントのストリーミング先のようちょうどに移動し、自然に流れる、事件によって、あなたを伝えるのepoll、あなたは1件の投票ずつ行かなければならない、とイベントが開催されます、フロー・イベントの特定の数があるあなたを伝えます。
1、実現を選択

呼び出し手順を選択して、次のとおりです。
ここに画像を挿入説明

(1)は、ユーザ空間からカーネルスペースFD_SETにcopy_from_userをコピーします

コールバック関数を登録する(2)__pollwait

対応するポーリング・メソッドを呼び出し、すべてのFD、(ソケットに対して、ポーリングがsock_pollある、tcp_poll、udp_poll又はdatagram_pollに場合によって呼び出しをsock_poll)〜(3)

(4)tcp_poll例に、そのコアの実装では、コールバック関数の上方に登録されている__pollwait、です。

(5)__ pollwait主な仕事は、現在の(現在のプロセス)を入れてデバイスへのキュー待機中にハングアップすることで、異なるデバイスがtcp_pollごとに異なる待ちキューを持って、そのキューはSK-> sk_sleep(ノートがあることハングへのプロセスキューで待機している)は、プロセスがスリープされていることを意味するものではありません。デバイスがメッセージ(ネットワーク機器)やファイルデータを記入(ディスクデバイス)を受信した場合、デバイスはキューで待機しているプロセスを寝て目を覚ますでしょう、そして現在は起こされるだろう。

(6)ポーリングは、マスクFD_SET割り当てに応じて、読み取りまたは書き込み動作の準備リターンマスクマスクするかどうかをマスクする方法戻る説明しました。

すべてのFDを経て完成した場合(7)、また、読み書き可能なマスクマスクがスリープ状態になる(、最新であることを)選択プロセスを呼び出すschedule_timeout呼び出されます返されませんでした。デバイスドライバは、独自のリソースを読み書きすることができたときに発生し、それがキューで待機して眠っているプロセスを起動します。より特定のタイムアウトより(schedule_timeoutは、指定された)、または誰も目覚めない、プロセスがGETのCPUまで再選択するきっかけと呼ばれ、その後、再反復FD場合、裁判官は何の準備ができて、FDを持っていません。

(8)は、ユーザ空間にカーネル空間からコピーFD_SET。

要約:

いくつかの主要な欠点を選択します。

とき、多くのFD(1)は、各呼び出しは、カーネルモードへのユーザモードからFDコレクションをコピーする必要性を選択するには、このオーバーヘッドは素晴らしいものです

(2)同時に、各コールがカーネルに渡されたトラバースするすべての必要性を選択するFD際に、多くのFD、このオーバーヘッドも素晴らしいです

ファイルの数は、選択のサポートをディスクリプタ(3)が小さすぎる、デフォルトは1024です

2投票達成

世論調査と選択の実装は非常に似ていますが、さまざまな方法がFDの収集、使用ポーリングpollfd構造体ではなく、選択FD_SET構造を説明し、他も同様です。

選択し、世論調査の分析に達成し、以下のいくつかのブログの記事を参照してください。

http://blog.csdn.net/lizhiguo0532/article/details/6568964#comments

http://blog.csdn.net/lizhiguo0532/article/details/6568968

http://blog.csdn.net/lizhiguo0532/article/details/6568969

http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/index.html?ca=drs-

http://linux.chinaunix.net/techdoc/net/2009/05/03/1109887.shtml

3、ファイルディスクリプタ

これを選択して投票ファイルディスクリプタ改善されるので、上記3つの欠点を回避することができなければなりません。それのepollは、それを解決する方法ですか?これに先立ち、我々は異なる見て、選択して、ポーリング呼び出しインターフェースを選択しファイルディスクリプタにのみ機能--selectまたはポーリング機能を提供してポーリングします。ファイルディスクリプタは、次の3つの機能、epoll_create、epoll_ctlやイベントがepoll_waitを提供し、epoll_createはファイルディスクリプタのハンドルを作成することです。epoll_ctlは、イベントタイプをリッスンするために登録されている、イベントがepoll_waitは、待機イベントです。

第1の欠点、ファイルディスクリプタソリューションepoll_ctl機能のために。epollハンドルが、fdはすべてかなりのイベントがepoll_wait時に複製コピーよりも、カーネルにコピーされます(中epoll_ctlにEPOLL_CTL_ADD指定された)新しいイベントを登録するたびに。ファイルディスクリプタfdの各プロセス全体で一度だけコピーしてください。

第二の欠点のために、ファイルディスクリプタのソリューションを選択、または同じ現在のデバイスのターンは(再び不可欠である)現在の上にハングアップし、それぞれにepoll_ctl場合にのみ、追加待ち行列をfdに対応するたびにポーリングのようなデバイスはキューで待機して目を覚ます人たちを待って、準備ができたときにコールバック関数を指定し、FD、それはコールバック関数を呼び出しますが、このコールバック関数)がFDの準備リストに参加できるようになります。イベントがepoll_wait実際に動作するが、何の準備ができてFDが存在しない、レディリストを見ることです(しばらくの間、睡眠を達成するために使用schedule_timeoutは()、ステップ7は、判決の効果になり、選択の実装は似ています)。

100,000特定の数について第3の欠点のために、ファイルディスクリプタFDが1GBのメモリマシン上で、例えば、この数は、一般的に2048よりもはるかに大きい、上限は、ファイルの最大数を開くことが可能であるサポートし、この制限を持っていません缶猫を/ proc / sys / fs /ファイル-maxのビューは、一般的に、これは大きな数とシステムメモリとの間の関係です。

要約:

(1)を選択し、ポーリング連続達成世論調査では、すべてのデバイスの準備ができるまで、あなたがスリープ状態にしたいと代替の間に何回か目を覚ますことがあり、自分のFDのセットを必要としています。そして、常にポーリングレディリストのepollイベントがepoll_waitを呼び出す必要があり、それが交互に繰り返してもよい睡眠と覚醒の間に、それは、デバイスの準備ができているとき、コールバック関数を呼び出すで、レディリストに入れて準備ができfdが実際には、スリープ状態になり、イベントがepoll_waitに目覚めますプロセス。すべての睡眠が交互ますが、選択して「目覚め」時間の世論調査では、単に準備リストは、CPUの節約ライン、上空であるかを決定する際、「目覚め」でコレクション全体のFD、およびファイルディスクリプタを横断します時間。これは、パフォーマンスを向上させるためにコールバックメカニズムによって引き起こされます。

(2)は、各コールは一度カーネルモードのコピーにユーザーモードからFDに設定されている必要があり、デバイスに現在のポーリングし、選択し、ハングアップを待っているキューを作成し、ファイルディスクリプタただ一つのコピーが、待っている現在のキューがハングします(デバイスがキュー待ち行列を待っていますが、定義された待機中のキューのepoll内部にはないことに注意してくださいは、イベントがepoll_waitの初めに)一度だけぶら下がっ。これは、オーバーヘッドを大幅に節約することができます。

参考リンク:

http://www.cnblogs.com/Anker/p/3265058.html

公開された100元の記事 ウォンの賞賛0 ビュー1190

おすすめ

転載: blog.csdn.net/Aplox/article/details/104238864