IO 复用技术的应用场景:
1.客户端同时处理多个 socket
2.客户端要同时处理用户输入和网络连接
3.TCP 服务器要同时处理监听 socket 和连接 socket
4.服务器要同时处理TCP请求和UDP请求
5.服务器要同时监听多个端口
文件描述符就绪条件:
socket 可读:
1.socket 内核接收缓冲区的字节数>=其低位水平标记 SO_RCVLOWAT。返回的字节数大于0
2.socket 通信的对方关闭连接。返回的字节数等于0
3.监听 socket 有新的连接
4.socket 上有未处理的错误。
socket 可写:
1.socket 内核发送缓冲区的可用字节数大于或等于其低水位标记 SO_SNDLOWAT。返回的字节数大于0
2.socket 的写操作被关闭。将触发 SIGPIPE 信号
3.socket 使用非阻塞 connect 连接操作成功或者失败之后
4.socket 有未处理的错误。
epoll 与 poll, select 的区别 :
1.epoll 使用一组函数来完成任务,而不是单个函数
2.epoll 把用户关心的文件描述符上的事件放到内核里的一个事件表中,而无需像select和poll那样,
每次调用都要重复传入文件描述符集或事件集中。但 epoll 需要使用一个额外的文件描述符,来唯一标识
内核中的这个事件表。
epoll 对文件操作符的两种操作模式 LT 和 ET 模式:
1.LT(Level Trigger,电平触发):
默认的。这种模式下epoll相当于一个效率较高的poll.
当 epoll_wait 检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件。
这样,应用程序下一次调用 epoll_wait 时,epoll_wait 还会再次向应用程序通告此事件,直到该事件被处理。
2.ET(Edge Trigger, 边沿触发):
当往epoll 内核事件表中注册一个文件描述符上的 EPOLLET 事件时,epoll将以ET模式来操作该文件描述符。
ET模式是epoll的高效工作模式。
当 epoll_wait 检测到其上有事件发生时并将此事件通知给应用程序后,应用程序必须立即处理该事件,因为
后续的epoll_wait 调用将不再向应用程序通知此事件。
可见,ET 模式在很大程度上降低了同一个 epoll 事件被重复触发的次数,因此效率比 LT 模式高。
EPOLLONESHOT :
即使使用 ET 模式,一个 socket 上的某个事件还是可能被多次触发。这在并发程序中会引起问题。
有时候,我们期望一个 socket 连接在任一时刻都只被一个线程处理,这一点可以使用 epoll 的 EPOLLONESHOT 事件实现。
对于注册了 EPOLLONESHOT 事件的文件描述符,操作系统最多触发其上注册的一个可读,可写或异常事件,且只触发一次,除非我们使用
epoll_ctl 函数重置该文件描述符上注册的 EPOLLONESHOT 事件。这样,当一个线程处理某个 socket 时,其他线程不可能有机会操作该
socket 的。但反过来思考,注册了 EPOLLONESHOT 事件的 socket 一旦被某个线程处理完毕,该线程就应该立即重置这个 socket 上的 EPOLLONESHOT 事件,
以确保这个 socket 下一次可读时,起 EPOLLIN 事件能被触发,进而让其他工作线程有机会继续处理这个 socket.
9.1 select 系统调用
9.2 poll 系统调用
9.3 epoll 系列系统调用
9.3.3 LT 和 ET 模式
9.4 三组IO复用函数的比较
9.5 IO复用的高级应用一: 非阻塞 connect
9.6 IO复用的高级应用一: 聊天室程序
9.7 IO复用的高级应用三:同时处理TCP和UDP服务
9.8 超级服务xinetd