面试题答案
一键面试poll机制在移动网络通信中的基本工作原理
- 数据结构:
- poll使用
pollfd
结构体数组来管理文件描述符集合。pollfd
结构体定义如下:
struct pollfd { int fd; /* 文件描述符 */ short events; /* 等待的事件 */ short revents; /* 发生的事件 */ };
- 每个
pollfd
结构体实例代表一个文件描述符及其相关的事件设置和返回的实际事件。
- poll使用
- 注册事件:
- 应用程序通过填充
pollfd
数组中的events
字段来指定对每个文件描述符感兴趣的事件,如POLLIN
(可读事件)、POLLOUT
(可写事件)、POLLERR
(错误事件)等。 - 然后将这个
pollfd
数组传递给poll
函数。
- 应用程序通过填充
- 内核监测:
poll
函数调用进入内核后,内核会为每个文件描述符注册事件的回调函数。当文件描述符对应的设备状态发生变化,满足注册的事件条件时,内核会将相应pollfd
结构体的revents
字段设置为实际发生的事件。
- 返回结果:
poll
函数在等待一段时间(可以设置为阻塞等待,也可以设置超时时间)后返回。返回值表示发生事件的文件描述符的数量。- 应用程序通过检查
pollfd
数组中每个元素的revents
字段,来确定哪些文件描述符上发生了感兴趣的事件,进而进行相应的处理。
与select机制相比,poll机制在移动网络场景下的优势
- 可管理文件描述符数量:
- select:在很多系统中,
select
所能管理的文件描述符数量受到FD_SETSIZE
的限制,通常这个值比较小(例如1024)。在移动网络场景下,如果需要同时处理大量的网络连接(如移动设备作为服务器时),select
可能无法满足需求。 - poll:
poll
使用pollfd
数组来管理文件描述符,理论上对文件描述符数量没有限制(仅受限于系统资源,如内存等)。这使得在移动网络中处理更多的连接成为可能,例如移动设备可能同时与多个周边设备进行蓝牙连接或与多个Wi - Fi客户端进行通信等场景。
- select:在很多系统中,
- 数据结构与效率:
- select:
select
使用fd_set
这种位图结构来管理文件描述符集合。每次调用select
时,需要将整个fd_set
从用户空间拷贝到内核空间,返回时又要从内核空间拷贝回用户空间。随着文件描述符数量的增加,这种拷贝操作的开销会变得很大。而且,select
返回后,应用程序需要遍历整个fd_set
来找出哪些文件描述符发生了事件。 - poll:
poll
使用pollfd
数组,在传递给内核和从内核返回时,数据结构相对简单,拷贝开销相对较小。并且poll
返回后,应用程序只需要检查pollfd
数组中发生事件的元素,不需要像select
那样遍历整个集合,提高了查找发生事件的文件描述符的效率。这在移动网络环境下,资源相对有限(如CPU性能、内存等)的情况下,poll
的效率优势更为明显。
- select:
- 事件处理灵活性:
- select:
select
对事件的处理相对简单,主要通过FD_READ
、FD_WRITE
等宏来检查读写等事件。 - poll:
poll
可以支持更多类型的事件,如POLLPRI
(高优先级可读数据)、POLLHUP
(挂起)等。在移动网络中,不同类型的事件可能需要更细致的处理,poll
的这种灵活性可以更好地满足移动网络通信中多样化的事件处理需求。例如,当移动网络信号突然中断(类似POLLHUP
事件)时,应用程序可以利用poll
提供的这种事件处理能力进行更合理的处理,如重新连接等操作。
- select: