网路基础 — 浅析I/O多路转接之poll技术
来源:互联网 发布:李兆会转移资产知乎 编辑:程序博客网 时间:2024/06/10 14:37
浅析I/O多路转接之poll技术
————————————————————————————
在我的上一篇博客当中I/O多路转接之select服务器认识和编写我们了解到了select服务器的优点和缺点,已经掌握select函数的基本用
法,我们也看到了其实select服务器还是很多问题的,在历史的长河当中它的性能问题在用户体验上的影响会越来越大,这个时候终于有人受不了了,
可能是它需要同时监视超过1024个文件描述符,又或者它觉得代码太难编写了需要一遍一遍的遍历,所以决定自己写一个另外一种系统调用函数来提升
性能,这个时候poll出现在我们的面前。我们来看看他如何解决select问题呢?
poll函数
不同于select使用三个位图来表示三种fdset,poll他就是使用一个pollfd结构体来表示这些.
我们首先把重点放到那些红线里面,这里是POLL函数提高效率的一个关键,我们逐一来注意一下该结构体的内容.首先fd就不用说什么,也就是我们的
sock文件描述符,这里最关键的就是下面两个,因为fd上面需要关心的时事件都存在events里面而revents就是用来存放实际发生了那些事件用来返回
的.
events可以表示合法的事件如下:
除了上面,revents域中还可能返回下列事件:
这些事件在events域中无意义,因为它们在合适的时候总是会从revents中返回。
其实这里我们就可以看到poll函数较与select函数的优点在哪里,因为如果你是select函数,在调用完之后,select()函数会清空它的文件描述符fd指
定的关心的事件(也就是清空位图),这些在下次都得遍历来重新定义.也就是又遍历一遍fd集合.POLL函数:fds:是一个struct pollfd结构类型的数
组,用于存放需要检测其状态的Socket描述符;每当调用这个函数之后,系统不会清空这个数组,操作起来比较方便;特别是对于socket连接比较多的
情况下,在一定程度上可以提高处理的效率;这一点与select()函数不同,调用select()函数之后,select()函数会清空它所检测的socket描述符集
合,导致每次调用select()之前都必须把socket描述符重新加入到待检测的集合中;因此,select()函数适合于只检测一个socket描述符的情况,而
poll()函数适合于大量socket描述符的情况;
nfds
nfds_t类型的参数,用于标记数组fds中的结构体元素的总数量;
timeout:
timeout 为 -1
这会造成 poll 永远等待。poll() 只有在一个描述符就绪时返回,或者在调用进程捕捉到信号时返回(在这里,poll返回 -1),并且设置 errno 值
这会造成 poll 永远等待。poll() 只有在一个描述符就绪时返回,或者在调用进程捕捉到信号时返回(在这里,poll返回 -1),并且设置 errno 值
为 EINTR 。-1 可以用宏定义常量 INFTIM 来代替(在 pth.h 中有定义) 。
timeout 等于0
在这种情况下,测试所有的描述符,并且 poll() 立刻返回。这允许在 poll 中没有阻塞的情况下找出多个文件描述符的状态。
time > 0
这将以毫秒为单位指定 timeout 的超时周期。poll() 只有在超时到期时返回,除非一个描述符变为就绪,在这种情况下,它立刻返回如果超时周期到
齐,poll() 返回 0。这里也可能会因为某个信号而中断该等待。和 select 一样,文件描述符是否阻塞对 poll 是否阻塞没有任何影响.
其实我们应该已经看出来poll服务器的优势了吧~ 它首先相对于select服务来说,提升了性能它用pollfd结构体,防止了程序里面嵌套的各种各样繁琐
循环,以及呢select服务器它最大可以同时监视的文件描述符是一个定长的,而poll改变了这个因为它是由用户输入的长度,你输入多少那么我就给你
多少个pollfd结构体,这样有问题也不关我函数的事情,使用户自己使用出现问题. 是不是感觉poll完美了?无敌了? 其实我们应该冷静下来,再想
想为什么当前基本都在使用最广泛的是epoll服务器而不是poll? 如果poll这么无坚不摧的他为什么会被epoll取代? 思考一下
poll服务器在怎么样的应用场景下,就会出现问题?
select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket,这样想如果你可以表示的文件描述符超级超级的多,这时候有人攻
击你,让你的服务器短时间内产生大量的用户,因为每次返回后都需要遍历文件描述符来获取已经就绪的socket,这时候如果用户足够的多,别人
给你创建了骚起来创建用户,让你返回每次遍历的时候拥有接近死循环的遍历长度,这时候poll服务器何谈性能而言? 其实如果不解决通过遍历查
找就绪的文件描述符这种形式你的服务器其实就是相对不安全,而且就算是没有人攻击你,比如像双11这种购物节,如果马云使用的poll服务器那
么,服务器可能骚起来挂,马云心态就该崩了.
所以呢,因为poll也是在返回后,通过遍历文件描述符来获取已经就绪的socket,事实上,在连接的大量的客户端在某一时刻他们之间就绪的客户
端通常不会很多,因为随着文件描述符的增多,poll的效率也会成线性下降.这个时候就出现了poll的升级版本epoll,它真的可以完美解决掉一切
select和poll所遇到的问题,而且技术很成熟很稳定效率很高,当今拥有最好的I/O就绪通知方法,在下一个博客我会详细的说明他底层的实现原
理.
阅读全文
0 0
- 网路基础 — 浅析I/O多路转接之poll技术
- 网路基础 — 浅析I/O多路转接之epll技术原理
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- I/O多路转接之poll
- Linux—I/O多路转接之poll
- I/O多路转接之select、poll、epoll
- I/O多路转接之poll 函数
- 【计算机网络】I/O多路转接之poll
- I/O多路转接之poll服务器
- I/O多路转接之poll 函数
- I/O多路转接至poll
- 【英语系列】——2017年7月
- PAT题解——1028. List Sorting (25)
- 跨站点请求伪造保护
- 查验身份证
- python读写excel文件
- 网路基础 — 浅析I/O多路转接之poll技术
- Fragment获取Activity为null的问题。
- 【备忘】小码哥11期2016年6月份毕业班的最新IOS视频教程
- 设计模式C++实现(13)——中介者模式
- Linux-Ubuntu-16.04安装过程
- JavaScript最重要的5个数组方法
- VMWare之网络环境配置学习笔记
- noi字符串11:潜伏者题解
- NYOJ 95 众数问题