快速了解多路复用器 {Select、poll、epoll}
1.select
上一篇已经讲过什么是select了,可以把它比做是一个大管家。
2.poll
poll其实和select是一类的,都是内核提供的,poll是select的一个升级版本。
两者区别在于:
1.select 提供1024个文件描述符,传递的是一个linklist
2.poll 是没有限制的 ,但是传递的是一个array数组。
但是两者都存在问题,那问题是什么呢?
-
就是每次循环都有和内核数据的传输
有些fd传给内核一次,内核保存。但是怎么做呢?
1)首先内核要创建一个空间,然后把fd增加进去,即便循环1万次,也就是第一次的时候放进去了。
2)循环,等待通知哪些fd可以读和写。
-
内核每次都帮你遍历这些fd
3.epoll
什么是epoll呢?也是个多路复用器、说明见如下图所示:
epoll会在内核里开辟一个空间7fd,然后把server4fd放进去,然后把连接上的客户端8fd也放进去,左边是对应的Java代码。
epoll_create=7是表示创建了一个文件描述符为7的空间。
总结:
select、poll和epoll的区别如下图:
select 和poll 是在程序那维护一个空间fd,会把收到的文件描述符都收集起来,每次调内核的时候都是调select或者poll()把fd作为参数传过去看看有没有。
epoll在内核那里会有一个空间fd,每多一个fd就往里放一个,还有一个调用wait(),哪个有结果了,会返回一个,然后程序拿走就行。
但是select、poll和epoll都是多路复用器.