IO多路复用
相信各位小伙伴在学习JavaIO知识时会看到其底层实现是使用了操作系统中的IO多路复用。
那么IO多路复用到底是什么呢?
面试题中出现的select/poll/epoll,poll和epoll的区别又指的是什么呢?
今天我就带大家来看下:
I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作
Select:
工作步骤:
- 将fd_set(文件描述符集合)从用户空间拷贝至内核空间
- 遍历所有的fd_set判断是否有就绪的fd
- 有:将其从内核空间拷贝到用户空间进行操作
- 无:进入睡眠,等待设备驱动可读写后被唤醒
缺点:
- 每次调用select,都需要把
fd_set
集合从用户态拷贝到内核态,如果fd_set
集合很大时,那这个开销也很大。 - 同时每次调用select都需要在内核遍历传递进来的所有
fd_set
,如果fd_set
集合很大时,那这个开销也很大。 - 为了减少数据拷贝带来的性能损坏,内核对被监控的
fd_set
集合大小做了限制,并且这个是通过宏控制的,大小不可改变(限制为1024)。