【Redis】用ET还是LT?- 基于epoll的Reactor

发布时间 2023-03-29 23:33:25作者: ydssx

【框架开发】用ET还是LT?- 基于epoll的Reactor

如果要写一个事件驱动的非阻塞的异步IO框架,该怎么考虑?

用epoll作为多路复用的框架

Reactor

image

LT和ET

image

LT vs ET 在读流程上

读的话是有数据才要干活

image

可以看到我们需要不断循环ET直到将缓冲区里面的东西读完,防止epoll_wait卡住,直到返回了Eagin

==》可以自己记录一个状态,不通过epoll_wait唤醒回调

在LT模式下我们可以直接返回epoll_wait,epoll_wait会一直通知你

LT vs ET 在写流程上

写的话是没数据可以干活,但此时不一定有事要干==》大部分写缓冲是空的

可写状态是常态

fd作为一个写事件注册进来,而fd大部分时间都是可写的。此时LT模式下epollwait没有意义,会一直告诉有out事件,在write时发现buf里面没有要写的事件,又回去wait,发现又是可写的,==》死循环了

为了避免反复触发的可写

==》通过epollctl把fd拿出来,只有在必然有写事件时才把fd放进来

==》先尝试写到fd中,写不进去再写到writebuf中,这时候才注册一个写事件。等到写完了再把fd拿出来

LT的写流程

image

ET的写流程

可见ET下写模式比较简单

image