select poll epoll 简明介绍

2018-03-12  本文已影响0人  linanwx

来源 https://cloud.tencent.com/developer/article/1005481

函数简介

select

函数原型如下:

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

fd_set是包含有文件描述符的集合,是一个位图,总共有n位。这意味这每次调用就会拷贝一次文件描述符集合到内核。

poll

函数原型如下:

int poll (struct pollfd *fds, unsigned int nfds, int timeout);

不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的数组实现。传入他的长度,以及超时。

epoll

epoll是在2.6内核中提出的,是之前的select和poll的增强版本。

int epoll_create(int size);//创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

epoll_create是用于创建epoll的句柄。size是建议内核预先分配的文件描述符数目,不会限制实际运行的数目。
epoll_ctl会控制epoll的句柄,我们可以向其中添加、删除、修改文件描述符。ctl与epoll_wait相分离的机制使得只用复制一次事件集合。
epoll_wait可以用于获得从内核得到的事件的集合。

socket 事件

在Linux 2.6内核事件中,设置了wakeup callback机制。当socket在等待事件发生时,由内核的socket睡眠队列管理。当socket事件发生时,内核会顺序遍历socket睡眠队列上的每个process,通知该进程事件发生。通知时,会依次调用该事件的回调函数。

最初的select

select最初只是一个朴素的实现,来尝试解决多个文件描述符的检查问题。

select做了什么?

select调用后,做了以下事情:

select的问题?

select的改进?

鸡肋的poll

poll只解决了第一个问题。fds的大小是1024限制的问题。仅仅是传入的参数的接口变了而已。

成熟的epoll

epoll解决了第二个和第三个问题。

最后,边缘触发与水平触发

说到Epoll就不能不说说Epoll事件的两种模式了,下面是两个模式的基本概念

上一篇下一篇

猜你喜欢

热点阅读