【IO专题】select, poll, epoll
本问题对应的项目链接:高频题回答模版训练
PS:这几个属于问的挺多的高频题,如果有条件,select, epoll 可以深入了解一下
1、I/O多路复用讲一下,有什么优缺点?
2、介绍一下select,poll和epoll,他们区别知道嘛?讲一下,它们算同步还是异步io?
3、关于 select, epoll 的应用,你了解哪些?(就是哪些工具用了这些机制)
本问题对应的项目链接:高频题回答模版训练
PS:这几个属于问的挺多的高频题,如果有条件,select, epoll 可以深入了解一下
1、I/O多路复用讲一下,有什么优缺点?
2、介绍一下select,poll和epoll,他们区别知道嘛?讲一下,它们算同步还是异步io?
3、关于 select, epoll 的应用,你了解哪些?(就是哪些工具用了这些机制)
共以下 1 个回答
1、I/O多路复用讲一下,有什么优缺点?
I/O 多路复用是指,用一个线程同时监听多个文件描述符。它的主要思想是将多个 I/O 事件注册到一个统一的事件循环中,然后通过调用系统调用,常见的有 select,poll,epoll,等待其中任意一个事件发生。一旦有事件发生,系统调用就会返回并告诉应用程序哪些事件已经就绪,应用程序可以根据返回的结果进行相应的处理。
它的优点很明显,使用单线程就可以监听多个 IO 事件,避免了线程切换的开销。同时利用了操作系统提供的系统调用,效率很高。但它不能充分利用多核处理器,并且使用不同的系统调用,优缺点也不同。
2、介绍一下select,poll和epoll,他们区别知道嘛?讲一下,它们算同步还是异步io?
select 就是将在用户态对文件描述符数组的遍历操作,交给操作系统在内核态去进行。操作系统会筛选出可以进行读写的文件描述符并做个标记,然后将其「个数」通过函数返回值告知用户层,用户层此时再遍历这个文件描述符数组,找出做过标记的文件描述符即可。
select 最早实现了一个线程处理多个文件描述符的功能,减少了系统调用的开销。但是整个过程会发生文件描述符数组从用户态到内核态的来回拷贝,高并发场景下资源消耗多。并且 select 最多只能监听 1024 个文件描述符。
poll 相较于 select,主要是取消了 select 只能监听 1024 个文件描述符的限制,也就是无限制。
epoll 针对 select,poll 的缺点做了相对应的改进。比如 epoll 会在内核态中保存文件描述符的集合,避免每次调用时都拷贝;并且 epoll 只会将发生 IO 事件的文件描述符返回给用户,省去了用户层的遍历操作;除此之外,epoll 将原先对文件描述符集合的轮询优化为了基于 IO 事件的回调,整体效率不会随着文件描述符的增多而降低,效率远高于 select 和 poll。不过 epoll 只能在 linux 下使用。
它们都算是同步 IO,因为程序在执行这三种系统调用函数时,都需要阻塞等待直到 I/O 操作完成。
3、关于 select, epoll 的应用,你了解哪些?(就是哪些工具用了这些机制)
比如 Redis 是单线程却还那么快,原因就是 Redis 借用了 Linux 的 IO 多路复用机制。该机制中的内核会有多个监听套接字和已连接套接字,同时内核会一直监听这些套接字的连接请求或数据请求,一旦有请求到达,就会将其交给 Redis 线程处理。
其它的比如 Nginx,Netty 这种高性能网络应用框架,底层都会用到 IO 多路复用来提高性能。
4、demo