選択、投票のIO多重化、ファイルディスクリプタの詳細
現在、I / Oの多重化システムコールサポートし
select,pselect,poll,epoll
、I / Oの多重化されます
通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作
。
但select,pselect,poll,epoll本质上都是同步I/O
イベントは、読み取りと書き込みのプロセスがブロックされていることを、自分自身の読み込みと書き込みのための責任準備ができている、と非同期I / Oの読み取りと書き込みに責任を所有する必要はありませんした後、彼らは、I / Oは、の実装を担当する非同期、読み書きする必要があるためカーネルにユーザ空間からデータをコピーします。
マルチプロセスとマルチスレッド技術と比較すると
I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程
、大幅システムのコストを削減し、これらのプロセス/スレッドを維持する必要はありません。
まず、利用シーン
IO多重化は、1つ以上のコアIO条件指定されたプロセスが一度見出さ読み取る準備ができていると、それはプロセスに通知指します。IO多重化の機会以下適用されます。
1)クライアント・プロセス記述子の複数(典型的には、対話型入力及びネットワークソケット)がI / O多重化を使用する必要がある場合。
2)場合は、クライアント・プロセスが複数のソケット、この状況はまれ、可能です。
3)ソケットを聞くTCPサーバに対処するだけでなく、接続されたソケットに対処する必要がある場合には、一般的には、また、I / Oの多重化を使用します。
TCPを処理するサーバならば4)、一般的にI / Oの多重化を使用して、UDPに対処する必要があります。
5)サーバは、一般的にI / Oの多重化を使用して、より多くのサービスまたは複数のプロトコルを処理するためにした場合。
二つの選択、投票、ファイルディスクリプタのプロフィール
ファイルディスクリプタは、I / Oの多重化を選択し、マルチチャネルでのソリューションを提供することができます。現在のLinuxカーネルでは、サポートすることがある
其中epoll是Linux所特有,而select则应该是POSIX所规定
一般的なオペレーティングシステムが実現されます。
1、選択
基本原理:
SELECT機能監視ファイルディスクリプタは、次の3つのカテゴリ、すなわちwritefds、readfds、およびexceptfdsに分け。記述子は(データの読み取り、書き込み、またはそこを除く)準備ができて、またはタイムアウトになるまでコール・ブロックの後に機能を選択します(あなたはすぐにnullに戻ることができた場合、タイムアウトは、待機時間指定)、関数が戻ります。選択機能は、ディスクリプタを見つけるために準備ができてfdsetを横断することにより、戻ったとき。
示すように、基本的なプロセス、:
ほとんどサポートされているすべてのプラットフォーム上で、今選択
其良好跨平台支持也是它的一个优点
。select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制
1024一般のLinuxでは
、
可以通过修改宏定义甚至重新编译内核的方式提升这一限制
しかし、それはまた、効率低下につながります。
select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理
。このような欠点が原因で発生します。
図1に示すように、最大の欠陥個々のプロセスを選択オープンFDがFD_SETSIZEセットから成る一定の限界である場合、デフォルト値は、1024です。
一般に、これは大きな数とシステムメモリの関係です
具体数目可以cat /proc/sys/fs/file-max察看
。デフォルトでは、32ビットマシン1024です。デフォルトでは、2048、64ビットマシンです。
ソケットは、即ち、ポーリング方式、あまり効率的で走査するリニアスキャンである2、。
以上のソケットは、それぞれ選択した場合と()FD_SETSIZEをソケットを横断スケジューリングによって行われるべき、ソケットに関係なく再びトラバースされるのに活性です。これは、多くのCPU時間を無駄にします。
如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询
これはやるのepollやkqueueのです。
3、需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。
2、世論調査
理論的根拠:
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间
機器の準備ができるまで、その後、デバイスは散歩を待ちキューに参加して続行する準備ができている場合はトラバースされてFD、現在のプロセスが中断された場合、デバイスは、すべての機器を準備見つけられませんでしたfdに対応する各機器の状態を問い合わせますまたはアクティブタイムアウト、再fdはトラバース後に再び目を覚まします。このプロセスは、多くの不必要なトラバーサルを受けています。
これは、接続の最大数を制限する、しない
原因是它是基于链表来存储的
だけでなく、欠点があります。
1)大量的fd的数组被整体复制于用户态和内核地址空间之间
、かどうかは、そのようなコピーは意味がありません。
2)poll还有一个特点是“水平触发”
報告されたFDは、処理されない場合は、次は再びFDの世論調査を報告します。
注意:
上から見た、選択し、ポーリングが復帰した後に必要
通过遍历文件描述符来获取已经就绪的socket
。実際には、
同时连接的大量客户端在一时刻可能只有很少的处于就绪状态
そのための記述子の数を監視成長し、その効率は直線的に低下します。
3、ファイルディスクリプタ
ファイルディスクリプタはカーネル2.6に提示され、以前の選択や投票の拡張バージョンです。選択に関して及び記述子を制限することなく、ファイルディスクリプタをより柔軟に、ポーリング。
epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次
。
理論的根拠:
epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次
。もう一つの特徴は、ということです
epoll使用“事件”的就绪通知方式
epoll_ctl登録fdで、
一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd
、イベントがepoll_waitを通知することができます。
ファイルディスクリプタの利点:
1、没有最大并发连接的限制
FDを開くことができ、上限は、1024(約100,000ポート1Gメモリに聞くことができる)よりもはるかに大きいです。
2、效率提升,不是轮询的方式,不会随着FD数目的增加效率下降
。
利用可能な唯一のアクティブFDは、コールバック関数と呼ばれます。
即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关
したがって、実際のネットワーク環境では、ファイルディスクリプタの効率は、選択と世論調査よりもはるかに高くなります。
3、内存拷贝
ファイル転送加速度とカーネル空間マッピングされたMMAP()メッセージメモリを使用して、即epoll使用mmap减少复制开销
。
ファイルディスクリプタ上のepollは、2つのモードがあります:
LT(level trigger)和ET(edge trigger)
。LTモードがデフォルトモードで次のように、LTおよびETモードモードとの違いは以下のとおりです。
LTモード:イベントがepoll_waitは、このイベントが検出され、イベント通知記述子アプリケーションされている場合
应用程序可以不立即处理该事件
。次のコールがepoll_waitは、再度アプリケーションに対応し、このイベントに気づくでしょう。
ETモード:イベントがepoll_waitは、このイベントが検出され、イベント通知記述子アプリケーションされている場合
应用程序必须立即处理该事件
。未処理の場合は、イベントがepoll_waitを呼び出す次回は、再びアプリケーションに対応し、このイベントを気付くことはありません。
1、LTモード
LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket
。このアプローチでは、カーネルはファイルディスクリプタは準備ができているあなたに伝え、その後、あなたはFD IO操作のための準備ができます。
如果你不作任何操作,内核还是会继续通知你的
。
2、ETモード
ET(edge-triggered)是高速工作方式,只支持no-block socket
。このモードでは、記述子は準備ができたときに準備ができなったことがない、あなたはファイルディスクリプタ経由カーネルを教えてください。それは、もはやレディ状態とは、例えば(されていないあなたを、あなたはファイルディスクリプタは準備ができている知っていると仮定しますと、あなたはファイルディスクリプタにつながるいくつかの操作を行うまで、そのファイルディスクリプタのためのより多くの準備の通知を送信しません)、送信、受信、または要求を受信し、または一定量EWOULDBLOCK未満の誤差で受信したデータ伝送をもたらします。
但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once)
。
ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高
。ファイルディスクリプタの作業時にETモード
必须使用非阻塞套接口
、複数のタスクが餓死処理するために、ファイル記述子をブロック読み取り/書き込みにファイルハンドルをブロックしないようにするためです。
3、で選択/世論調査
进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描
ファイル記述子を登録し、する、とepoll_ctlによって予めのepoll()
一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制
プロセスは、()時間がepoll_waitを呼び出したときに、すぐにファイルディスクリプタをアクティブに通知されます。(
此处去掉了遍历文件描述符,而是通过监听回调的的机制。这正是epoll的魅力所在。
)
注:
あなたがいないアイドル接続またはデッド接続、ファイルディスクリプタ効率ではなく、はるかに高い選択/世論調査よりますが、アイドル状態の接続が多数に直面したとき、あなたはファイルディスクリプタ効率が選択/世論調査よりもはるかに高いことがわかりますの多くを行う場合。
三、選択、投票、ファイルディスクリプタ差
図1に示すように、接続の最大数を開くことができるプロセスをサポート
2、FDはIOの効率の劇的な増加をもたらします
3、メッセージングモード
综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点:
1、表面上看epoll的性能最好,
但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好
,毕竟epoll的通知机制需要很多函数回调。
2、select低效是因为每次它都需要轮询
。但低效也是相对的,视情况而定,也可通过良好的设计改善。
ref:http://my.oschina.net/xianggao/blog/663655