IO多路复用EPOLL的ET模式下EPOLLIN事件触发时机

网上说的太宏观,自己测试一下各种情况,FD为nonblock。

0.客户端发送新数据过来,单线程阻塞在epoll_wait,epoll_wait返回可读事件。

1.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件。

2.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端不再发送数据过来,并且缓冲区的数据没有读完,线程继续epoll_wait,不会返回可读事件。

3.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端继续发送新数据过来,并且缓冲区的数据循环读取直到客户端不发了,线程继续epoll_wait,不会返回可读事件。

4.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端不再发送数据过来,并且缓冲区的数据没有读完,线程继续epoll_wait,此时客户端继续发送新数据过来返回可读事件。

5.单线程阻塞在epoll_wait,客户端发送新数据过来,epoll_wait返回可读事件开始读数据,同时客户端不再发送数据过来,并且缓冲区的数据没有读完,但是用EPOLL_CTL_MOD重新绑定客户端FD的EPOLLIN | EPOLLET到EPOLL_FD上面,线程继续epoll_wait,返回可读事件。

6.多线程阻塞在epoll_wait,客户端一次性发送新数据过来(理想情况)一个线程返回可读事件。

7.多线程阻塞在epoll_wait,客户端一次性发送新数据过来(理想情况)一个线程返回可读事件,该线程开始缓慢读数据,同时客户端继续一次性发送新数据过来,另一个线程返回可读事件。

8.多线程阻塞在epoll_wait,客户端一次性发送新数据过来(理想情况)一个线程返回可读事件,该线程开始快速读数据,同时客户端继续一次性发送新数据过来,另一个线程不会返回可读事件。

9.多线程阻塞在epoll_wait,客户端分批次发送新数据过来(实际情况有缓冲区大小,网络拥塞等原因限制导致分批)多个线程返回可读事件。

总结:有新数据来或者进行epoll_ctl( 缓冲区有数据剩余)会触发读事件,第8点比较奇怪,原因可能是线程读数据太快了,其他线程感知不到缓冲区来了新数据。

你可能感兴趣的:(网络相关)