1.select函数
函数定义
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout);
优点:
用户可以在一个线程内同时处理多个 socket 的 IO 请求。用户可以注册多个 socket,然后调用 select 函数读取被激活的 socket,从而实现在同一个线程内同时处理多个 IO 请求,在这点上select 函数与同步阻塞模型不同,因为在同步阻塞模型中需要通过多线程才能达到这个目的。
缺点:
-
每次调用 select 都需要将进程加入到所有监视 fd 的等待队列,每次唤醒都需要从每个队列中移除。 这里涉及了两次遍历,而且每次都要将整个 fd_set 列表传递给内核,有一定的开销。
-
当函数返回时,系统会将就绪描述符写入 fd_set 中,并将其拷贝到用户空间。进程被唤醒后,用户线程并不知道哪些 fd 收到数据,还需要遍历一次。
-
受 fd_set 的大小限制,32 位系统最多能监听 1024 个 fd,64 位最多监听 2048 个。
2.poll函数
函数定义
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
/*
struct pollfd{
int fd; // 感兴趣fd
short events; // 监听事件
short revents; // 就绪事件
};
*/
// return:表示此时有多少个监控的描述符就绪,若超时则为0,出错为-1。
poll 函数与 select 原理相似,都需要来回拷贝全部监听的文件描述符,不同的是:
-
1)poll 函数采用链表的方式

最低0.47元/天 解锁文章
2224

被折叠的 条评论
为什么被折叠?



