一、数据到用户需要经历:
1:磁盘或者网络数据到内核空间,这个过程可以叫“数据准备”2:数据从内核空间到用户空间,这个过程可以叫“数据读取”
二、io 的四种模型
1: 阻塞io 需要经历:“数据准备”,“数据读取”,其中准备到读取之间,需要阻塞,浪费大量时间。
2:非阻塞io 进程询问内核是否准备好数据,准备好数据的时候,内核空间到用户空间,读的过程中进程阻塞,如果没准备好则做其他业务。
3:多路复用io 循环监控一批fd 是否准备好,如果有准备好的,则可以通知其他进程处理准备好的fd;
4:异步io 异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成;这种效率最高,但不常用。
三、io多路复用
多路复用包括三种方式:select、poll、epoll,他们都是都是阻塞io,挑选出准备好的fd。
进程主进程循环调用者三个方法,获取准备好的fd,并通知其他工作进程,然后sleep 一段时间,继续循环。
select 最大监控fd:1024 fd列表每次调用都需要空间切换 查找可用df需要遍历所有fdpoll 最大监控fd:超过1024 fd列表每次调用都需要空间切换 查找可用df需要遍历所有fd
epoll 最大监控fd:超过1024 fd列表只需要一次空间切换 查找可用df不用遍历(可以返回准备好的fd 集合,也就是通知)
java 的epoll 存在bug,一般设置最大循环次数,达到后重新初始化。