面试题答案
一键面试监听文件描述符数量限制
- select:通常有文件描述符数量限制,一般默认为1024,可通过修改宏定义等方式调整,但这种方式并不通用且可能存在兼容性问题。
- poll:理论上没有文件描述符数量限制,它基于链表存储文件描述符集合,不受类似select的固定数量限制。
- epoll:同样理论上没有文件描述符数量限制,它在内核中使用红黑树管理文件描述符,可高效处理大量文件描述符。
事件通知方式
- select:采用轮询方式,当调用select后,内核会遍历所有注册的文件描述符,检查是否有事件发生,效率随文件描述符数量增多而降低。返回时,应用程序需要再次遍历文件描述符集合来确定哪些文件描述符有事件发生。
- poll:也是轮询方式,与select类似,poll函数返回后,应用程序需要遍历整个文件描述符链表来判断哪些文件描述符发生了事件,随着文件描述符数量增加,性能也会下降。
- epoll:采用回调方式,当文件描述符状态改变时,内核通过回调函数将其加入就绪队列。应用程序调用epoll_wait时,只需要处理就绪队列中的文件描述符,不需要遍历所有注册的文件描述符,在处理大量文件描述符时效率更高。
数据结构
- select:使用数组(fd_set)来存储文件描述符集合,数组大小受限于FD_SETSIZE,这也是文件描述符数量受限的原因之一。其操作函数如FD_SET、FD_CLR等用于对数组进行设置和清除等操作。
- poll:使用链表(pollfd结构数组)来存储文件描述符集合,每个pollfd结构体包含文件描述符、事件掩码和返回事件掩码等信息,链表结构使其理论上不受文件描述符数量限制。
- epoll:在内核中使用红黑树来管理注册的文件描述符,这样能快速地插入、删除和查找文件描述符。同时使用就绪链表来保存就绪的文件描述符,epoll_wait调用时直接从就绪链表获取就绪事件,提高了效率。