2023年6月8日

IO操作面试50题

作者 codecafe

以下是 50 道关于 I/O 操作的高频面试题,涵盖文件 I/O、网络 I/O、数据库 I/O、设备 I/O、异步 I/O 和内存映射 I/O 等主题。每道题包含问题、答案、解释、追问及追问答案,内容由浅入深,基于标准实践整理,确保准确性和全面性,适合系统管理员、开发者和 DevOps 工程师的面试准备。

基础问题

1. 什么是 I/O 操作?

答案
I/O(输入/输出)操作是计算机与外部设备(如磁盘、网络、键盘)之间数据传输的过程。输入操作从设备读取数据到内存,输出操作将数据从内存写入设备。

解释
I/O 操作是计算机系统的核心,涉及文件读写、网络通信、数据库查询等。操作系统通过驱动程序和系统调用管理 I/O,确保数据高效传输。

追问:I/O 操作有哪些常见类型?
追问答案
文件 I/O:读写文件,如文本或二进制文件。
网络 I/O:通过套接字传输数据,如 HTTP 请求。
设备 I/O:与硬件设备交互,如打印机或 USB 设备。
数据库 I/O:执行数据库查询和更新。


2. 什么是二进制文件和文本文件的区别?

答案
文本文件:包含人类可读字符,使用字符编码(如 ASCII、UTF-8),以换行符分隔行,可用文本编辑器打开。
二进制文件:包含非人类可读数据(如图像、视频),以字节序列存储,无特定编码,不能直接用文本编辑器编辑。

解释
文本文件适合存储可读数据,二进制文件适合存储复杂数据结构。错误处理文件类型可能导致数据损坏。

追问:如何在 Python 中打开二进制文件?
追问答案
使用 open() 函数的 ‘b’ 模式:

with open('file.bin', 'rb') as f:
    data = f.read()

‘rb’ 表示读取二进制模式,’wb’ 用于写入。


3. 如何读取一个非常大的文件而不加载到内存?

答案
使用流式读取,逐块处理文件。例如,在 Python 中:

with open('large_file.txt', 'r') as f:
    chunk_size = 1024
    while True:
        chunk = f.read(chunk_size)
        if not chunk:
            break
        print(chunk)

解释
分块读取只加载文件的一部分到内存,避免内存溢出,适合处理大文件。

追问:最佳块大小如何选择?
追问答案
通常选择 2 的幂(如 1024、4096),与磁盘块大小对齐。实际大小需根据文件类型和系统资源测试确定。


4. 什么是文件描述符?

答案
文件描述符是一个非负整数,用于标识打开的文件或其他 I/O 资源(如套接字、管道)。标准文件描述符为 0(标准输入)、1(标准输出)、2(标准错误)。

解释
文件描述符是操作系统管理 I/O 的核心,统一表示文件、网络连接等资源,便于读写操作。

追问:如何在 Linux 中获取文件描述符?
追问答案
使用 open() 系统调用:

int fd = open("file.txt", O_RDONLY);

返回的 fd 是文件描述符。


5. 什么是同步 I/O 和异步 I/O?

答案
同步 I/O:操作阻塞程序,直到完成。例如,read() 等待数据可用。
异步 I/O:操作不阻塞,程序可继续执行,通过回调或事件通知处理结果。

解释
异步 I/O 适合高并发场景,如网络服务器,同步 I/O 更简单但效率较低。

追问:在 Node.js 中如何实现异步 I/O?
追问答案
使用 fs.readFile()

fs.readFile('file.txt', (err, data) => {
    if (err) throw err;
    console.log(data);
});

6. 什么是缓冲区?它在 I/O 操作中有什么作用?

答案
缓冲区是内存中的一块区域,用于临时存储 I/O 数据,减少对慢速设备的直接访问。

作用
提高性能:批量读写数据,减少系统调用。
减少开销:降低磁盘或网络访问频率。

解释
缓冲区是优化 I/O 的关键技术,广泛用于文件和网络操作。

追问:什么是双缓冲?
追问答案
双缓冲使用两个缓冲区,一个用于读,一个用于写,提高并发性,常见于图形处理和流媒体。


7. 什么是中断?它与 I/O 操作的关系是什么?

答案
中断是硬件或软件向 CPU 发送的信号,请求暂停当前任务处理特定事件。I/O 设备完成操作时通过中断通知 CPU。

关系
通知完成:设备完成 I/O 后触发中断。
提高效率:避免 CPU 轮询设备状态。

解释
中断是高效 I/O 的核心机制,广泛用于设备通信。

追问:什么是中断服务程序(ISR)?
追问答案
ISR 是中断发生时 CPU 执行的程序,处理设备数据或状态更新。


8. 什么是 RAID?它在 I/O 操作中有什么作用?

答案
RAID(独立磁盘冗余阵列)通过组合多个磁盘提高存储性能和可靠性。常见级别包括:
RAID 0:条带化,性能高,无冗余。
RAID 1:镜像,冗余高,性能不变。
RAID 5:条带化 + 奇偶校验,兼顾性能和冗余。

作用
性能:并行读写提高 I/O 速度。
可靠性:冗余防止数据丢失。

解释
RAID 是服务器和数据中心的关键技术,优化 I/O 性能。

追问:如何在 Linux 中配置 RAID?
追问答案
使用 mdadm

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

9. 什么是 DMA(直接内存访问)?

答案
DMA 是一种硬件机制,允许设备直接访问内存,无需 CPU 介入。

作用
减少 CPU 负载:CPU 只需初始化 DMA 操作。
提高效率:直接传输数据,速度更快。

解释
DMA 是高性能 I/O 的关键,广泛用于网络和存储设备。

追问:DMA 控制器的工作流程是什么?
追问答案
1. CPU 设置 DMA 控制器的寄存器(源、目标、传输大小)。
2. DMA 控制器直接传输数据。
3. 完成后中断 CPU。


10. 什么是 I/O 调度?它有什么作用?

答案
I/O 调度是操作系统管理 I/O 请求的顺序和优先级的过程。常见算法包括 FCFS、SSTF、SCAN。

作用
优化性能:减少磁盘寻道时间。
公平性:确保多个进程的 I/O 请求得到处理。

解释
I/O 调度直接影响系统性能,尤其在高负载环境中。

追问:Linux 默认的 I/O 调度算法是什么?
追问答案
Linux 默认使用 CFQ(完全公平队列),可通过 /sys/block/<device>/queue/scheduler 修改。


中级问题

11. 什么是文件锁?它有什么作用?

答案
文件锁是防止多个进程同时访问文件的机制,分为共享锁(多读)和独占锁(单写)。

作用
防止冲突:避免数据不一致。
同步访问:确保操作顺序。

解释
文件锁是多进程环境中确保数据一致性的关键。

追问:如何在 Linux 中实现文件锁?
追问答案
使用 flock()

flock(fd, LOCK_EX); // 独占锁

12. 什么是管道(Pipe)?它在 I/O 操作中有什么作用?

答案
管道是进程间通信的机制,允许一个进程的输出作为另一个进程的输入。

作用
进程通信:实现数据传输。
简化 I/O:在内存中传输数据,无需文件。

解释
管道是 Unix/Linux 的核心 IPC 机制,广泛用于 Shell 脚本。

追问:匿名管道和命名管道的区别是什么?
追问答案
匿名管道:仅限父子进程,无名称。
命名管道:有名称,任意进程可使用。


13. 什么是网络 I/O?它包括哪些主要操作?

答案
网络 I/O 是通过网络设备传输数据的过程,主要包括:
连接:建立 TCP/UDP 连接。
发送/接收:传输数据。
关闭:断开连接。

解释
网络 I/O 是分布式系统的核心,涉及套接字和协议。

追问:TCP 和 UDP 的区别是什么?
追问答案
TCP:可靠、面向连接,适合数据完整性要求高的场景。
UDP:无连接、不保证可靠性,适合实时通信。


14. 什么是数据库 I/O?它有什么特点?

答案
数据库 I/O 是数据库系统与存储设备之间的数据读写操作,包括查询、更新和事务。

特点
高效性:通过索引和缓存优化。
可靠性:通过事务和日志确保一致性。
并发性:支持多用户访问。

解释
数据库 I/O 是企业级应用性能的关键。

追问:如何优化数据库 I/O?
追问答案
索引:减少全表扫描。
缓存:存储频繁访问的数据。
分区:将大表分成小表。


15. 什么是内存映射 I/O?它有什么好处?

答案
内存映射 I/O 将文件或设备映射到进程的虚拟内存,访问文件如同访问内存。

好处
高效:减少系统调用开销。
简单:使用内存操作接口。
共享:支持多进程共享。

解释
内存映射 I/O 是高性能应用的常用技术。

追问:如何在 Linux 中实现内存映射 I/O?
追问答案
使用 mmap()

void* ptr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);

16. 什么是 I/O 多路复用?它有什么好处?

答案
I/O 多路复用是一个进程监控多个 I/O 事件,并在事件发生时处理。常见实现包括 select()poll()epoll()

好处
高效:单进程处理多连接。
可扩展:适合高并发场景。

解释
I/O 多路复用是高性能网络服务器的基础。

追问select()epoll() 的区别是什么?
追问答案
select():扫描所有文件描述符,效率低。
epoll():事件通知机制,效率高。


17. 什么是设备驱动程序?它在 I/O 操作中有什么作用?

答案
设备驱动程序是操作系统与硬件设备的接口,管理设备操作。

作用
抽象硬件:统一设备访问接口。
管理 I/O:处理读写请求和中断。

解释
驱动程序是操作系统与硬件通信的桥梁。

追问:如何在 Linux 中加载设备驱动程序?
追问答案
使用 modprobe

modprobe driver_name

18. 什么是缓冲区溢出?它与 I/O 操作的关系是什么?

答案
缓冲区溢出是向缓冲区写入超过其容量的数据,可能导致程序崩溃或安全漏洞。

关系
输入处理:不安全的输入可能导致溢出。
数据验证:需要检查输入大小。

解释
缓冲区溢出是 I/O 操作中的常见安全问题。

追问:如何防止缓冲区溢出?
追问答案
– 使用安全函数(如 strncpy())。
– 检查输入大小。
– 使用编译器保护(如 -fstack-protect)。


19. 什么是序列化?它在 I/O 操作中有什么作用?

答案
序列化是将对象转换为字节流以存储或传输,反序列化是相反过程。

作用
持久化:保存对象到文件或数据库。
网络传输:通过网络发送对象。

解释
序列化是分布式系统和持久化存储的基础。

追问:在 Java 中如何实现序列化?
追问答案
实现 Serializable 接口:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.ser"));
oos.writeObject(obj);

20. 什么是虚拟文件系统(VFS)?

答案
VFS 是操作系统提供的抽象层,统一不同文件系统的访问接口。

作用
屏蔽差异:支持 ext4、NTFS 等文件系统。
统一接口:提供一致的文件操作。

解释
VFS 提高了文件系统的灵活性和兼容性。

追问:VFS 的主要组件有哪些?
追问答案
超级块:存储文件系统元数据。
inode:存储文件属性。
dentry:缓存目录结构。


高级问题

21. 什么是零拷贝?它有什么好处?

答案
零拷贝是减少数据传输中内存拷贝的技术,如 sendfile()

好处
减少 CPU 开销:避免用户空间和内核空间的拷贝。
降低延迟:减少数据传输时间。

解释
零拷贝是高性能网络编程的关键。

追问:如何在 Linux 中实现零拷贝?
追问答案
使用 sendfile()

sendfile(client_fd, file_fd, NULL, file_size);

22. 什么是缓存一致性?它与 I/O 操作的关系是什么?

答案
缓存一致性确保多处理器系统中缓存与主内存数据一致。

关系
I/O 更新:设备写入数据时需更新缓存。
多核处理:确保核心间数据一致。

解释
缓存一致性是多核系统 I/O 的关键问题。

追问:如何实现缓存一致性?
追问答案
使用总线嗅探或目录协议检测和更新缓存。


23. 什么是日志?它在 I/O 操作中有什么作用?

答案
日志记录系统或应用程序的运行状态和事件。

作用
调试:定位问题。
监控:记录系统状态。
审计:记录用户操作。

解释
日志是系统管理和故障排查的关键。

追问:如何在 Linux 中查看日志?
追问答案
使用 journalctl

journalctl -u service_name

24. 什么是信号量?它在 I/O 操作中有什么作用?

答案
信号量是控制多进程访问共享资源的同步机制。

作用
互斥访问:确保单一进程访问资源。
同步协作:协调进程执行顺序。

解释
信号量是多进程 I/O 的关键。

追问:信号量和锁的区别是什么?
追问答案
信号量:允许多个进程访问(值 > 1)。
:仅允许一个进程访问。


25. 什么是内存泄漏?它与 I/O 操作的关系是什么?

答案
内存泄漏是程序分配内存后未释放,导致内存占用增加。

关系
缓冲区:未释放的缓冲区可能导致泄漏。
文件句柄:未关闭的文件描述符占用资源。

解释
内存泄漏影响 I/O 程序的稳定性。

追问:如何检测内存泄漏?
追问答案
使用工具如 Valgrind 或手动检查资源释放。


26. 什么是阻塞 I/O 和非阻塞 I/O?

答案
阻塞 I/O:操作阻塞程序,直到完成。
非阻塞 I/O:操作立即返回,无数据时返回错误。

解释
非阻塞 I/O 适合高并发场景。

追问:如何在 Linux 中设置非阻塞 I/O?
追问答案
使用 fcntl()

fcntl(fd, F_SETFL, O_NONBLOCK);

27. 什么是磁盘调度算法?它有什么作用?

答案
磁盘调度算法决定磁盘头访问数据块的顺序,如 FCFS、SSTF、SCAN。

作用
减少寻道时间:优化磁盘头移动。
提高吞吐量:增加 I/O 操作效率。

解释
磁盘调度是优化存储性能的关键。

追问:SCAN 算法的工作原理是什么?
追问答案
SCAN(电梯算法)按方向移动磁盘头,依次处理请求。


28. 什么是异步文件 I/O?它有什么好处?

答案
异步文件 I/O 不阻塞程序,通过回调处理结果。

好处
高并发:同时处理多个请求。
低延迟:提高响应速度。

解释
异步 I/O 是高性能应用的基础。

追问:在 Java 中如何实现异步文件 I/O?
追问答案
使用 AsynchronousFileChannel

AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);
Future<Integer> result = channel.read(ByteBuffer.allocate(1024), 0);

29. 什么是网络缓冲区?它有什么作用?

答案
网络缓冲区是存储网络数据包的内存区域。

作用
提高性能:批量处理数据包。
减少丢包:吸收网络波动。

解释
网络缓冲区是网络编程的关键。

追问:如何在 Linux 中查看网络缓冲区大小?
追问答案
使用 sysctl

sysctl net.core.rmem_max

30. 什么是数据库索引?它在 I/O 操作中有什么作用?

答案
数据库索引是加速查询的数据结构,如 B+树。

作用
加速查询:减少全表扫描。
优化排序:支持快速排序。

解释
索引是数据库性能优化的核心。

追问:聚簇索引和非聚簇索引的区别是什么?
追问答案
聚簇索引:数据和索引一起存储,一次 I/O。
非聚簇索引:索引和数据分开存储,两次 I/O。


31. 什么是虚拟化 I/O?它有什么好处?

答案
虚拟化 I/O 是虚拟机环境中管理 I/O 的技术,通过虚拟机监控器(VMM)实现。

好处
资源共享:多虚拟机共享设备。
隔离性:独立 I/O 环境。

解释
虚拟化 I/O 是云计算的基础。

追问:如何优化虚拟化 I/O?
追问答案
使用 VirtIO 驱动或直接 I/O。


32. 什么是流(Stream)?它在 I/O 操作中有什么作用?

答案
流是将数据视为字节或字符序列的抽象模型。

作用
抽象化 I/O:统一文件和网络操作。
简化操作:提供一致接口。

解释
流是现代编程语言 I/O 的基础。

追问:字节流和字符流的区别是什么?
追问答案
字节流:处理二进制数据。
字符流:处理文本数据,支持编码。


33. 什么是 I/O 错误处理?它为什么重要?

答案
I/O 错误处理是捕获和处理 I/O 操作中的错误,如文件不存在。

重要性
防止崩溃:确保程序健壮。
用户体验:提供友好错误信息。

解释
错误处理是编写可靠 I/O 代码的关键。

追问:在 Java 中如何处理 I/O 异常?
追问答案
使用 try-catch:

try {
    FileInputStream fis = new FileInputStream("file.txt");
} catch (IOException e) {
    System.out.println("I/O 错误: " + e.getMessage());
}

34. 什么是设备文件?它在 I/O 操作中有什么作用?

答案
设备文件是 Unix/Linux 中表示硬件设备的特殊文件。

作用
统一接口:将设备视为文件。
简化操作:使用文件操作接口。

解释
设备文件是 Unix 系统的核心设计。

追问:如何在 Linux 中查看设备文件?
追问答案
设备文件位于 /dev,如 /dev/sda


35. 什么是伪终端(Pseudo-Terminal)?

答案
伪终端是模拟终端的设备,用于非交互式环境,如 SSH。

作用
远程访问:提供终端接口。
脚本执行:模拟用户输入。

解释
伪终端是远程管理和自动化测试的关键。

追问:如何创建伪终端?
追问答案
使用 openpty()

int master, slave;
openpty(&master, &slave, NULL, NULL, NULL);

36. 什么是内存泄漏?它与 I/O 操作的关系是什么?

答案
内存泄漏是分配的内存未释放,导致占用增加。

关系
缓冲区:未释放的缓冲区导致泄漏。
文件句柄:未关闭的文件描述符占用资源。

解释
内存泄漏影响 I/O 程序的稳定性。

追问:如何检测内存泄漏?
追问答案
使用 Valgrind 或手动检查资源释放。


37. 什么是垃圾回收?它与 I/O 操作的关系是什么?

答案
垃圾回收是自动释放不再使用的内存。

关系
资源管理:关闭未使用的文件描述符。
性能影响:可能暂停 I/O 操作。

解释
垃圾回收简化了 I/O 资源管理。

追问:如何在 Java 中触发垃圾回收?
追问答案
使用 System.gc(),但不保证立即执行。


38. 什么是死锁?它与 I/O 操作的关系是什么?

答案
死锁是多个进程相互等待资源,导致无法继续执行。

关系
I/O 资源:文件锁、网络连接可能导致死锁。
并发访问:多进程访问资源时需注意。

解释
死锁是并发 I/O 的常见问题。

追问:如何避免死锁?
追问答案
– 按固定顺序分配资源。
– 使用超时机制。


39. 什么是分页?它在 I/O 操作中有什么作用?

答案
分页是将内存分成固定大小的页,用于虚拟内存管理。

作用
虚拟内存:实现内存和磁盘交换。
内存保护:隔离进程。

解释
分页是 I/O 和内存管理的核心。

追问:什么是页表?
追问答案
页表记录虚拟地址到物理地址的映射。


40. 什么是交换空间?它在 I/O 操作中有什么作用?

答案
交换空间(Swap Space)是磁盘上用于虚拟内存的区域,当物理内存不足时,操作系统将不活跃的内存页换出到交换空间。

作用
扩展内存:提供额外的内存容量。
缓解压力:处理内存不足的情况,确保系统稳定性。

解释
交换空间通过磁盘 I/O 扩展内存,但因磁盘速度慢,过度使用会降低性能。优化 swappiness 参数可平衡内存和交换空间使用。

追问:如何在 Linux 中查看交换空间使用情况?
追问答案
使用 free -m 显示内存和交换空间使用情况,或 swapon -s 查看交换分区详情。


41. 什么是文件系统日志(Journaling)?它在 I/O 操作中有什么作用?

答案
文件系统日志是一种记录文件系统操作的技术(如 ext3、ext4),在写入数据前记录元数据或数据更改。

作用
一致性:系统崩溃后恢复数据,防止损坏。
快速恢复:减少检查和修复时间。

解释
日志通过额外的 I/O 操作记录更改,提高文件系统可靠性,广泛用于现代文件系统。

追问:日志模式有哪些?
追问答案
数据日志:记录数据和元数据,最高安全性。
写回日志:仅记录元数据,性能较好。
有序日志:元数据在数据后写入,平衡性能和安全。


42. 什么是 I/O 重定向?它在 Linux 中如何实现?

答案
I/O 重定向是将程序的标准输入、输出或错误流重定向到文件或其他设备。

实现
输出重定向command > file(覆盖)或 command >> file(追加)。
输入重定向command < file
错误重定向command 2> file

解释
重定向允许灵活控制数据流,广泛用于脚本和日志记录。

追问:如何将标准输出和错误输出重定向到同一个文件?
追问答案
使用 command > file 2>&1command &> file


43. 什么是异步 I/O 框架?常见框架有哪些?

答案
异步 I/O 框架提供非阻塞 I/O 操作,支持高并发处理。常见框架包括:
libuv:Node.js 的异步 I/O 库。
libevent:跨平台事件处理库。
Boost.Asio:C++ 的异步 I/O 框架。

解释
这些框架通过事件循环和回调处理 I/O 事件,适合高性能服务器。

追问:Node.js 如何实现异步 I/O?
追问答案
Node.js 使用 libuv,通过事件循环处理异步 I/O,例如 fs.readFile()


44. 什么是 I/O 性能瓶颈?如何识别?

答案
I/O 性能瓶颈是 I/O 操作速度限制系统性能的情况,如慢速磁盘或网络延迟。

识别方法
iostat:监控磁盘 I/O 性能。
netstatss:检查网络 I/O 延迟。
topvmstat:查看系统资源使用情况。

解释
识别瓶颈需要综合分析 CPU、内存和 I/O 指标。

追问:如何缓解 I/O 瓶颈?
追问答案
增加缓存:减少直接 I/O 操作。
优化调度:调整 I/O 调度算法。
升级硬件:使用 SSD 或更快的网络。


45. 什么是零拷贝技术?它如何优化 I/O 操作?

答案
零拷贝技术减少数据在用户空间和内核空间之间的拷贝,如 sendfile()splice()

优化
减少 CPU 开销:避免数据复制。
降低延迟:加速数据传输。

解释
零拷贝是高性能网络和文件 I/O 的关键技术,常见于 Nginx 和 Kafka。

追问:在 Java 中如何实现零拷贝?
追问答案
使用 FileChannel.transferTo()

FileChannel src = new FileInputStream("source.txt").getChannel();
FileChannel dst = new FileOutputStream("dest.txt").getChannel();
src.transferTo(0, src.size(), dst);

46. 什么是 NIO(New I/O)?它与传统 I/O 的区别是什么?

答案
NIO 是 Java 提供的高性能 I/O 框架,支持非阻塞 I/O、通道和缓冲区。

区别
传统 I/O:阻塞、基于流,适合简单操作。
NIO:非阻塞、基于通道和缓冲区,适合高并发。

解释
NIO 提高了 Java 的 I/O 性能,广泛用于服务器开发。

追问:NIO 的主要组件有哪些?
追问答案
Channel:数据传输通道。
Buffer:数据缓冲区。
Selector:多路复用器。


47. 什么是 I/O 优先级?如何在 Linux 中设置?

答案
I/O 优先级控制进程访问 I/O 资源的优先级,影响调度顺序。

设置
使用 ionice

ionice -c2 -n0 command

-c2 表示最佳努力类,-n0 表示最高优先级。

解释
I/O 优先级优化资源分配,适合多任务环境。

追问:I/O 优先级有哪些类别?
追问答案
实时(-c1):最高优先级。
最佳努力(-c2):普通优先级。
空闲(-c3):仅在无其他任务时执行。


48. 什么是 I/O 等待(I/O Wait)?它如何影响系统性能?

答案
I/O 等待是 CPU 等待 I/O 操作完成的时间,通常由慢速设备引起。

影响
降低吞吐量:CPU 空闲时间增加。
增加延迟:任务响应变慢。

解释
I/O 等待是性能瓶颈的常见原因,需通过监控工具识别。

追问:如何在 Linux 中查看 I/O 等待?
追问答案
使用 iostattop,查看 %iowait 指标。


49. 什么是分布式文件系统?它如何优化 I/O 操作?

答案
分布式文件系统(如 HDFS、Ceph)将数据分布在多台服务器上,提供高可用性和扩展性。

优化
并行 I/O:多节点同时读写。
数据冗余:提高可靠性。

解释
分布式文件系统适合大数据和高并发场景。

追问:HDFS 的 I/O 优化策略有哪些?
追问答案
数据本地化:计算靠近数据。
块存储:分块存储和读取。


50. 什么是 I/O 多路复用的优缺点?

答案
优点
高效:单线程处理多连接。
可扩展:支持高并发。

缺点
复杂性:编程模型复杂。
延迟:事件处理可能延迟。

解释
I/O 多路复用(如 epoll)是高性能服务器的核心技术。

追问:如何在 Python 中使用 select 实现 I/O 多路复用?
追问答案
使用 select 模块:

import select
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8080))
server.listen(5)
inputs = [server]
while True:
    readable, _, _ = select.select(inputs, [], [])
    for sock in readable:
        if sock is server:
            client, _ = sock.accept()
            inputs.append(client)
        else:
            data = sock.recv(1024)
            if data:
                sock.send(data)
            else:
                inputs.remove(sock)
                sock.close()

关键引用