75.epoll ltet

lesson51

就绪队列把新链接拿走了,但是没有accept,下次检测还是就绪的,继续激活,又给就绪队列了。

面试题:为什么ET模式必须工作在非阻塞模式下,因为ET模当中,底层有了数据只通知上层一次,这种通知策略倒逼程序员把数据读完,因为并不知道内核数据读没读完,所以应用层循环读取,读完继续读继续recv阻塞的话,单进程就会出错,必须设置非阻塞。

返回值小于期望值也代表读完了,总共3000,每次100正好读完也是巧合,我们屋脑循环通过看错误码eagain判断。

LT下也可以非阻塞,循环全读,为什么是ET效率高,

面试题LTET谁更高效

超过低水位线,才通知上层取走,因为系统调用有成本。TCP报文携带PSH标志,只要有数据立即就绪,ET模式下不取就丢了

看13课件LET

我期望这次没读完,buff留下来,下次读拼接,下次如果是别人,buff又给别人了,所以这个代码不对。

未来我这个服务器通过listener accep新的文件描述符,通过epoller告诉我文件描述符是否就绪,获取新链接,我拿到的不仅仅是文件描述符,我把文件描述符封装成connection,插入到connectionsli,未来读就可以把数据读到当前sockfd in outbuferr里 ,这样每一个套接字都有各自缓冲区。

普通套接字和listener当成一个怎吗处理,Listenner当成connection子类,TCP 中的connerction指针可以指向listener对象,

但是读方式不一样,但是函数名可以一样。

TCPserver内部有个epoller对象,还有unorderedmap ,通过文件描述符管理所有coonnection对象,所以TCPserver相当于一个容器把所有connection装到connections里面

listen加进去之后,服务器启动,调用wait,获取就绪事件,就获取到了fd,拿着fd查map表就能找到connection,就能找到继承的recv,再也不关心listen还是普通套接字

课堂板书/20250605_Reactor开始.png · whb-helloworld/113 - 码云 - 开源中国