選択、投票、ファイルディスクリプタの違い

(1)> == Oの時間複雑度(N)を選択します

それは唯一のI / Oイベントが発生、しかし、我々は唯一の未分化投票すべてのストリームは、読み取りを識別することができますいくつかのストリームは(1、より多くの、あるいはすべてがあるかもしれない)というものについて知りませんが、知っていますデータ、または書き込みデータ・ストリームは、それらを操作します。だから、選択ポーリングは何の違いの複雑性O(n)が持っていない、より多くのストリーム処理はしばらく長い未分化のポーリング時間を。

(2)ポーリング==> Oの時間複雑度(N)

世論調査は、本質的に何の違いを選択しないと、ユーザーはカーネル空間に渡された配列をコピーし、FDに対応する各機器の状態を照会、だろう  が、それは接続の最大数を制限しません、それが記憶されたリストに基づいているため、。

O(1)の(3)ファイルディスクリプタ==>時間計算

ファイルディスクリプタの世論調査では、イベントとして理解することができるビジーポーリングと非差別の世論調査とは異なり、流れはI / Oイベントは、私たちが知っているどのように発生しますがepoll。私たちは実際のepoll言うように、イベント駆動型(FDに関連付けられている各イベントを)、そしてこの時点で、我々はこれらのストリームで動作している意味があります。(複雑さはO(1)に還元されます)

、投票を選択し、ファイルディスクリプタは、IO多重化メカニズムです。I / O機構を介して多重化、ディスクリプタを複数のディスクリプタを監視することができ、一度レディ(準備一般読み取りまたは書き込みレディ)、プログラム読み取りおよび書き込み操作に応じて通知することができます。しかし、彼らはイベント後の読み取りおよび書き込みする必要があるので、それは、I / Oを選択し、ポーリング、ファイルディスクリプタの本質同期していることは読み書きプロセスがブロックされていることを、自分自身の読み込みと書き込みのための責任準備ができて、非同期I / Oは、自身に必要ではありません読み書きを担当し、非同期I /ユーザーへのカーネル空間からコピーされたデータの実装のためのO責任を負います。  

ファイルディスクリプタは、I / Oの多重化を選択し、マルチチャネルでのソリューションを提供することができます。そこ今やLinux固有のファイルディスクリプタでのLinuxカーネルをサポートすることができる、およびPOSIXで指定する必要があります選択し、一般的なオペレーティング・システムが実現しています

 

次のように今日では、これら三つのIO多重比較、参考書やオンライン上記の情報は、要約されています:

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_SET構造pollfd構造体ではなく、選択を使用して、FDのセットを説明し、そしてほとんどすべての他の、記述子は、複数の状態記述子に応じた処理、ポーリングを管理していますしかし、世論調査では、ファイル記述子の数には上限の制限はありません世論調査や欠点も存在する選択は、配列がユーザーモードとカーネルアドレススペースにその全体がコピーされる間に関係なく、ファイルディスクリプタの、多数のファイル記述子が含まれているファイルディスクリプタの数とその支出を増加する準備ができています直線的に増加します。

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の初めに)一度だけぶら下がっ。これは、オーバーヘッドを大幅に節約することができます。 

发布了58 篇原创文章 · 获赞 29 · 访问量 14万+

おすすめ

転載: blog.csdn.net/taoqilin/article/details/103964979