epoll ET LT

LT模式为什么同时支持阻塞和非阻塞?

如果LT模式是阻塞的,我们不用一次读完所有数据

epoll_wait会一直有数据,直到read buf为空,这种模式下首先不会丢失后处理的部分连接数据,其次当read buf 空时,由于我们只recv()一次,所以只会阻塞在epoll_wait 而不是recv(),所以只要有新的连接读、或者数据读。

ET模式为什么只支持非阻塞?

fd[1] == listen_sock ET模式下,一次没有处理完fd[1] read buf的全部链接请求数据,未处理的那部分的数据将会丢失,所以accept丢失。

ET模式下如果是阻塞的,由于同一读事件总的数据处理完成与否,只通知一次

所以应该是

for true { recv() }

这个时候才能读取完全部数据,但是这个时候当buf空时,会一直阻塞等待,进程挂起,新的accept不会得到相应,所以会丢失连接。

总结: LT 不会阻塞在recv(),所以阻塞非阻塞都可以
ET 会阻塞在recv(),所以只能非阻塞

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容