面试题答案
一键面试1. 处理多个客户端连接问题
- 阻塞式 I/O:BIO 是阻塞式 I/O 模型,当一个线程执行
read()
或write()
操作时,该线程会被阻塞,直到有数据可读或可写。在处理多个客户端连接时,每个客户端连接都需要一个独立的线程来处理 I/O 操作。如果有大量客户端连接,就需要创建大量线程,这会导致线程资源耗尽。例如,在一个简单的服务器端应用中,为每个客户端连接创建一个新线程,当客户端连接数达到数千甚至上万时,系统的线程资源将不堪重负。 - 线程上下文切换开销:大量线程会增加 CPU 的线程上下文切换开销。因为 CPU 在多个线程间频繁切换,会消耗大量时间在保存和恢复线程的运行环境上,从而降低了实际用于处理业务逻辑的时间,严重影响系统性能。
2. 对系统资源的影响
- 内存消耗:每个线程都需要占用一定的内存空间来保存其运行状态和栈信息等。随着客户端连接数增加,创建的线程增多,内存消耗也会急剧上升。假设每个线程占用几百 KB 的内存,当有大量客户端连接时,内存可能很快被耗尽,导致系统性能下降甚至崩溃。
- 文件描述符限制:操作系统对每个进程能够打开的文件描述符数量是有限制的。在 BIO 模型中,每个客户端连接都会占用一个文件描述符。当客户端连接数过多,达到系统文件描述符限制时,新的客户端连接将无法建立。