多路io转接服务器
模型概述

select函数


其中 readfds,writefds,exceptfds都是传入传出参数,即我们传入这些值,然后select函数会给我们传出值 timeout:定时阻塞监控时间,3种情况 1、NULL 永远等下去 2、设置timeval 等待固定时间 3、设置 timeval里时间均为0 ,检查描述字后立即返回,轮询
优缺点
缺点:监听上线收文件描述符限制,最大1024 检测满足条件的fd,自己添加业务逻辑提高小,提高了编码难度
优点:跨平台监听
端口复用函数:为了解决多个应用想要共同使用一个端口的情况
int opt=1;
setsockopt(lfd,SOL_SOCKET,SO_REFUSEADDR,.......)
PoLL函数原型分析

优点:自带数组结构。可以将 监听事件集合 和 返回事件集合 分离 扩展监听上线 超出1024限制
缺点: 不能跨平台。Linux 无法直接定位满足监听事件的文件描述符,编码难度较大
突破1024文件描述符限制
cat /proc/sys/fs/file-max ------>当前计算机所能打开的最大文件个数。受硬件限制
ulimit -a -------->当前用户进程下,默认打开文件描述付个数 默认值1024
修改:sudo vi /etc/security/limits.conf
soft nofile 65536 ------>设置默认值
hard nofile 1000000 -------->命令修改上限
epoll函数:epoll_create创造的epfd句柄是一个文件描述符,在使用完之后应该进行关闭操作,否则可能导致fd被消耗殆尽
epoll是LInux下多路复用IO记峨口select/poll的增强版本,他能显著提高程序在大量并发程序中只有少量活跃的情况下CPU的利用率
epoll_create

size:创建的红黑树的监听节点数量。
(供内核参考) 返回值:成功:指向新创建的红黑树的根节点的fd 失败 -1
epoll_ctl
Epoll事件模型有两种触发模式
边沿触发ET:只有数据到来才触发,不管缓冲区是否还有数据 epoll的ET模式是一个高效模式,但是只支持非阻塞模式,因为如果还是阻塞模式读的话,摄像一种情况就是每次缓冲区中的数据服务端没有及时处理完上一次的数据,就会触发超时,因此这里就引出了 与非阻塞方式一起的一个模式,对于缓冲区的忙轮训,这样就不会引起客户端的超时重传----->忙轮训 【ET 模式下,内核只在状态变化时通知一次,你必须用非阻塞 IO,一次性处理完所有可用数据,直到返回 EAGAIN,否则可能漏事件。】

水平触发LT:只要有数据都会触发------>默认模式

Epoll 优缺点
优点:高效 能突破1024文件描述符限制
缺点:不鞥跨平台 只支持LInux
Epoll反应堆模型:epoll ET模式+非阻塞+void ptr


