- 单线程的遍历文件描述符,看看有没有内容,有内容,就直接弄过来
- 判断有没有数据是程序做的,效率比较低
1:select
- rset 有五个描述符,是运行在用户空间的,此时会拷贝到我们的内核态
- 如果没有数据,内核就会一直判断,阻塞状态
- 有数据,会把FD设置为有数据,select函数会返回
- 然后再判断哪一个fd被设置了,会将数据给读出来(可能同时几个都有数据,所以还是需要遍历)
- max + 1 = 9 + 1 = 10,给他卡住长度
select (max + 1, &rset, NULL, NULL, NULL)
我们将文件描述符收集过来,交给内核,内核帮助我们判断哪一个有数据,当一个或者是多个有数据的时候,select函数就会被返回,并且有数据的FD会被置位,返回之后,我们遍历所有的文件描述符,看看哪一个的FD被设置了,被设置的有数据的
将FD交给了内核,让内核来帮助我们判断哪一个有数据
- 缺点
- FD 需要被置位
- 需要整体的拷贝,用户态和内核态的开销
- select 返回的时候,需要再次的进行遍历
- 1980年的 API
2:poll
poll(pollfds,5,50000)
struct pollfd{
int fd;
short events;
short reevents;
}
- 我们设置的是reevents
3:epoll
- 将白板上进行写字,一个文件描述符,和一个事件
- epfd这一块内存是用户态和内核态共享的,我们的内核态还是帮我们进行判断
- 设置位置,重排,将有数据的放在最前面的位置
- 返回值 是有多少个3 ,则遍历前三个
epoll_ctl(epfd,)
- nginx 和redis 使用 epoll
- Java nio - epoll
SSD
DB对 SSD 进行了优化