linux中poll和select的区别是:select单个进程所能打开的最大连接数由“FD_SETSIZE”宏定义,其大小是32个整数的大小,而poll因为采用链表存储,所以没有最大连接数的限制。
树图思维导图提供 linux中poll和select有什么区别思维导图 在线思维导图免费制作,点击“编辑”按钮,可对 linux中poll和select有什么区别思维导图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:b20026816b38c95669a1f2f7dee806bc
linux中poll和select有什么区别思维导图模板大纲
select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理
这样所带来的缺点是
1、 单个进程可监视的fd数量被限制,即能监听端口的大小有限
一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max察看。32位机默认是1024个。64位机默认是2048
2、 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低
当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间
如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的
3、需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历
如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历
它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点
1、大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义
2、poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd
epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式
LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读
所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN错误
还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知
树图思维导图提供 linux怎么设置不允许更改权限思维导图 在线思维导图免费制作,点击“编辑”按钮,可对 linux怎么设置不允许更改权限思维导图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:03d2e60667691df30c17bd452d42c664
树图思维导图提供 linux中tomcat能否加大内存思维导图 在线思维导图免费制作,点击“编辑”按钮,可对 linux中tomcat能否加大内存思维导图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e8edd23059b99dd1afe53ab655d829e6