面试题答案
一键面试阻塞I/O在处理多个客户端连接时的性能表现
- 表现:
- 假设服务器使用阻塞I/O,在处理一个客户端连接时,当执行如
recv
或send
操作时,如果没有数据可读或可写,线程会被阻塞,直到有数据到来或可写空间出现。这意味着在处理第一个客户端连接的I/O操作期间,其他客户端的连接请求只能等待,无法被及时处理。 - 例如,有三个客户端A、B、C先后连接服务器。服务器先与客户端A建立连接,当执行
recv
操作等待A发送数据时,线程阻塞。此时B和C发起连接请求,由于服务器线程被A的I/O操作阻塞,B和C的连接请求只能在队列中等待,直到服务器处理完A的I/O操作,才会去处理B和C的连接。这就导致B和C的响应延迟较大。
- 假设服务器使用阻塞I/O,在处理一个客户端连接时,当执行如
- 原因:
- 阻塞I/O的本质特性决定了它在执行I/O操作时会阻塞当前线程。这是因为操作系统的I/O模型,在阻塞模式下,系统调用(如
recv
、send
)会一直等待,直到操作完成或出现错误。在单线程服务器中,这就使得整个服务器在处理一个客户端I/O时无法同时处理其他客户端的请求,极大地限制了服务器的并发处理能力。
- 阻塞I/O的本质特性决定了它在执行I/O操作时会阻塞当前线程。这是因为操作系统的I/O模型,在阻塞模式下,系统调用(如
非阻塞I/O在处理多个客户端连接时的性能表现
- 表现:
- 采用非阻塞I/O时,服务器在执行
recv
或send
操作时,如果没有数据可读或可写,系统调用不会阻塞线程,而是立即返回一个错误码(如EWOULDBLOCK
)。服务器可以继续处理其他客户端的连接和I/O操作。 - 例如,同样是客户端A、B、C连接服务器。服务器与A建立连接后,执行
recv
操作,若此时A没有数据发送,recv
立即返回错误码,服务器可以接着去处理B和C的连接请求,为它们建立连接并进行相应处理。之后服务器可以通过轮询(如select
、poll
、epoll
等多路复用技术)方式再次检查A是否有数据可读,这样可以在短时间内处理多个客户端的连接和I/O操作,减少客户端的响应延迟。
- 采用非阻塞I/O时,服务器在执行
- 原因:
- 非阻塞I/O允许应用程序在I/O操作暂时无法完成时,不阻塞当前线程,继续执行其他任务。通过结合多路复用技术,服务器可以同时监控多个文件描述符(对应多个客户端连接)的状态变化,一旦某个文件描述符有数据可读或可写,就可以及时处理相应的I/O操作。这种机制充分利用了CPU的时间,提高了服务器的并发处理能力,从而在处理多个客户端连接时表现出更好的性能。