作者回复: io多路复用顾名思义,一个线程可以处理多个socket,只要有一个socket上可读或可写,线程就会忙碌起来。当然如果所有socket都不可读,也不可写,那么该线程的确是处理阻塞状态。但这和一个线程仅能处理一个socket,还阻塞在该socket的读/写上相比,是有质的飞跃的。
作者回复: 我最初是看了这篇文章 https://morsmachine.dk/netpoller ,之后自己read source code的。只有自己读代码,结果才深刻。
作者回复: 👍
作者回复: 这里仅是介绍了并发下网络I/O的可能存在的极端情况。实际设计中,尽量避免对一个socket的并发读和并发写。
作者回复: 👍。
作者回复: 👍
作者回复: tcp仅是传输层协议。如何识别应用层协议包的是应用层协议来规定的。 像你提到的,如果某个应用层请求包存在数据异常,如果异常会导致后续所有请求均处理失败,那么意味着这个连接存在的意义不大了,断连是最好的选择。后续的请求由于没有得到服务端的应答,所以client端应该选择重发。 如果数据异常的请求对后续新请求没有太大影响,服务端可以选择将请求的剩余数据读取后,回复特定的失败应答。然后继续读取和处理后续的新请求。
作者回复: 很高兴又看到lesserror回来学习了! 我来说说你提出的问题。 1. 输入:指的是我们要实现的tcp服务器的输入,就是服务器要接收的数据。这些数据符合某种应用层协议的规范。 2. 系统调用后,线程便进入内核空间执行了,即进入内核态。在内核态的系统调用代码将获得的数据从内核层的缓存中copy到用户层的内存中,执行结束后,从内核态返回用户态。用户便可以在用户层的内存中看到已经返回的数据了。可以参考一下《深入理解计算机系统3rd》这本书对计算机整体做了一个全面深入了解。 3. EAGAIN/EWOULDBLOCK 是两个系统级的错误。E是前缀,以EAGAIN为例,即Error Again,即告知调用者重试。
作者回复: 1. 是的,文中链接好像多了一个空格,导致无效了。 2. 确实。感谢提醒。我让编辑老师改一下。
作者回复: 你的业务场景中有并发写一个conn的情况么?