- 连接的建立比较简单,server端通过socket(),bind(),listen(),并使用 epoll ET 模式监听 listenfd 的 读请求,当 TCP 连接完成 3 次握手后,会触发 listenfd 的读事件,应用程序调用 accept(),会检查已完 成的连接队列,如果队列里有连接,就返回这个连接,出错或连接为空时返回 -1。此时,已经可以进行正 常的读写操作了。 当然,因为是 ET 模式,accept() 要一直循环到就绪连接为空
- 服务启动,服务器连接建立完成后,开启一个主线程、多个工作线程,主线程负责响应 client 的连接请求,并建立 连接,在连接建立完成后使用特定的方式将 fd 分配给某个工作线程
- 当主线程把新连接分配给了某个特定的 subreactor 之后,该线程可能正阻塞在多路选择器当中,
- 如何得知新连接的到来呢,这里使用了 eventfd 进行异步唤醒,线程会从 epoll_wait 中醒来,从 epoll 的就绪队列中拿到活跃事件进行处理
- 在 epoll 触发模式上使用了 ET,它与 LT 在 IO 处理上有着很大的区别,ET 模式要比 LT 模式复杂许多,它对用户提出更高的要求,即 每次读,必须读到不能再读,每次写,写到不能再写的时候
- ET 和 LT 的区别