面试题答案
一键面试缓冲区设置
- 发送缓冲区:增大发送缓冲区可以减少因缓冲区满而导致的发送阻塞,提高数据发送效率。在高并发场景下,多个连接的数据可以暂存在较大的发送缓冲区中等待发送。
- 优点:减少发送阻塞,提升整体发送效率,对于大量数据突发发送的场景效果显著。
- 缺点:占用更多内存,如果设置过大可能导致内存浪费,并且在网络拥塞时可能加剧拥塞情况。
- 接收缓冲区:增大接收缓冲区可避免因来不及处理数据而导致数据丢失,能容纳更多客户端发送过来的数据。
- 优点:降低数据丢失风险,保证数据完整性,适应不同客户端发送数据的节奏。
- 缺点:同样会占用更多内存,并且如果处理速度跟不上接收速度,缓冲区一直满,可能导致网络资源浪费。
多线程/多进程模型
- 多线程模型:为每个客户端连接创建一个线程来处理数据读写等操作。
- 优点:线程创建和销毁开销相对较小,能快速响应客户端请求,线程间共享进程资源,数据交互方便。
- 缺点:线程安全问题复杂,如多个线程同时访问共享资源需要加锁,可能导致死锁;并且线程过多时,线程上下文切换开销增大,影响性能。
- 多进程模型:为每个客户端连接创建一个进程来处理业务逻辑。
- 优点:进程间相互独立,一个进程崩溃不会影响其他进程,稳定性高。
- 缺点:进程创建和销毁开销大,占用系统资源多,进程间通信相对复杂,效率比线程间通信低。
I/O复用机制
- select:监控多个文件描述符的可读、可写和异常事件。
- 优点:跨平台性好,几乎所有操作系统都支持。
- 缺点:单个进程能监控的文件描述符数量有限(通常为1024),每次调用select都需要将文件描述符集合从用户态拷贝到内核态,性能随着文件描述符数量增加而下降。
- poll:和select类似,但改进了对文件描述符数量的限制。
- 优点:理论上对文件描述符数量无限制,性能比select有所提升。
- 缺点:仍然需要将文件描述符集合从用户态拷贝到内核态,随着文件描述符增多性能下降明显,并且在一些系统上性能不如epoll。
- epoll:基于事件驱动,Linux特有的I/O复用机制。
- 优点:支持大量文件描述符,内核使用红黑树管理文件描述符,效率高;事件通知采用回调机制,不需要每次遍历所有文件描述符,性能优异。
- 缺点:只在Linux系统可用,编程复杂度相对较高。