读缓冲区不为空时, 读事件触发。
写缓冲区不为满时, 写事件触发。
处理流程linux
accept新的链接, 监听读事件。
读事件到达, 处理读事件。
须要写入数据, 向fd中写数据, 一次没法写完, 开启写事件监听。
写事件到达, 继续写入数据, 写完后关闭写事件。
优缺点nginx
不会遗漏事件, 易编程。
长链接须要写入的数据量大时, 会频繁开启关闭写事件。redis
读缓冲区状态变化时, 读事件触发, 网卡接受到新数据。
写缓冲区状态变化时, 写事件触发, 网卡发出了新数据。
处理流程编程
accept新的链接, 同时监听读写事件。
读事件到达, 须要一直读取数据, 直到返回EAGAIN。
写事件到达, 无数据处理则不处理, 有数据待写入则一直写入,直到写完或者返回EAGAIN。
优缺点缓存
不须要频繁开启关闭事件, 效率较高。
读写事件处理不当, 可能致使事件丢失, 编程教复杂。.net
对于读事件而言,整体而言, 采用水平触发方式较好。应用程序在读取数据时,可能会一次没法读取所有数据,边沿触发在下一次可能不会触发。若是可以保证一次读取缓存的所有数据,能够采用边沿触发,效率更高, 但同时编程复杂度也高。
对于写事件,当客户端服务端采用短链接或者采用长链接但发送的数据量比较少时(例如: Redis), 采用水平触发便可。当客户端与服务端是长链接而且数据写入的量比较大时(例如: nginx), 采用边沿触发, 由于边沿触发效率更高。
目前,linux不支持读写事件分别设置不一样的触发方式,具体采用哪一种方式触发,须要根据具体需求。
监听套接字事件设置blog
监听套接字不须要监听写事件,只须要监听读事件。
监听套接字通常采用水平触发方式。(nginx开启multi_accept时,会把监听套接字全部可读的事件所有读取,此时可使用边沿触发。但为了保证链接不丢失,nginx仍然采用水平触发)
通讯套接字设置事件
redis对于与客户端通讯使用的套接字默认使用水平触发。
nginx对于与客户端通讯使用的套接字默认采用边沿触发。get