在描述IO模型之前,需要先搞清楚两个概念
同步:调用者(用户线程)需要主动等待被调用者(系统内核或者IO设备)返回消息或者操作完成后,才能执行后续的代码。
阻塞:调用者在等待结果返回过程中所处的状态。如果是阻塞IO,当调用者发起IO请求后,会一致等待该请求完成(数据读取或者写入完毕),在这个过程中,什么都不做。
BIO 模型
调用者在等待IO操作完成的时候,都是出于阻塞的状态。
NIO
调用者发起IO请求之后,不会产生阻塞,会立即返回,但是没有读取到数据
这个时候调用者会不断发起IO请求,直到数据达到
这种方式避免了阻塞,但是其实在数据准备好之前,什么都做不了,还会消耗大量的cpu资源。
I/O多路复用技术
是对NIO的一种优化,允许单个线程(Selector)同时处理多个请求,通过监视多个文件描述符(如socket)的就绪状态,当某个描述符就绪的时候,再进行处理。
在操作系统底层使用了,select、poll和epoll等技术进行实现。
epoll和其他几个技术的区别是
select/poll:我知道在需要处理的多个请求中,有请求已经准备好了,但是我不知道是谁,我需要去遍历。
epoll:我知道谁已经准备好了