作者回复: TCP三次握手建立连接的过程中,内核通常会为每一个LISTEN状态的Socket维护两个队列:
SYN队列(半连接队列):这些连接已经接到客户端SYN;
ACCEPT队列(全连接队列):这些连接已经接到客户端的ACK,完成了三次握手,等待被accept系统调用取走。
Acceptor负责从ACCEPT队列中取出连接,当Acceptor处理不过来时,连接就堆积在ACCEPT队列中,这个队列长度也可以通过参数设置。
作者回复: 不是一个概念,线程的同步一般指对共享变量的互斥访问。IO模型的同步是指应用和内核的交互方式。
作者回复: 同步异步可以理解为谁主动,同步就是A问B要东西,总是A主动”伸手“问B要。异步就是A向B注册一个需求,货到了B主动“伸手”把货交给A。
阻塞队列在阻塞一个线程时,会有系统调用,有系统调用内核就要参与,只是这里的阻塞跟IO的阻塞是两回事。
其实不要迷茫,理解上面那几张图就行了。😑
作者回复: 是用户进程主动发起read调用,这个是一个系统调用,CPU由用户态切换到内核态,执行内核代码,内核发现这个socket上的数据已经到到了内核空间,将用户线程挂起,然后把数据从内核空间拷贝到用户空间,再唤醒用户线程,read调用返回。
作者回复: 可以把信号驱动io理解为“半异步”,非阻塞模式是应用不断发起read调用查询数据到了内核没有,而信号驱动把这个过程异步化了,应用发起read调用时注册了一个信号处理函数,其实是个回调函数,数据到了内核后,内核触发这个回调函数,应用在回调函数里再发起一次read调用去读内核的数据。所以是半异步。
作者回复: 1,理解的很准确
2,对的
3,Selector发出的select调用就是一个I/O操作。
作者回复: NIO API可以不用Selector,就是同步非阻塞。使用了Selector就是IO多路复用
作者回复: 可能是Semaphore的实现比较复杂,LimitLatch简单明了够用。
作者回复: 对的
作者回复: 阻塞方法实现简单一点,跟多个Acceptor没有关系。
作者回复: 1. 首先是LimitLatch限制,应用层处理不过来了,连接才会堆积在操作系统的queue,而queue的大小由acceptCount控制
2,可以同时有过个Acceptor调用accept方法,accept是线程安全的
3,对的
作者回复: pollerThreadCount
作者回复: eventCache是对象池
作者回复: 对的
作者回复: Acceptor接收到一个新的连接(channel)只注册到一个poller上,只是下一个新连接会注册到另一个poller上