以读取socket接收缓冲区数据为例
数据状态
a-数据未就绪(网络数据未到tcp缓冲区)-》b-数据已就绪(数据已到tcp缓冲区)-》c-读取数据(从tcp缓冲区到用户缓冲区)-》d-数据读取完成(数据已到用户缓冲区)
几个概念
1、阻塞io:线程t1发起read操作时,上述四个阶段线程会一直等待,直到数据读取完成
2、非阻塞io:线程t1发起read操作,发现数据处于a阶段,不会等待,会立刻返回个错误,过段时间再read,直到数据处于b阶段,然后阻塞完成c和d阶段
3、同步io:线程t1等待完成b-c-d阶段
4、异步io:线程t1发现数据已就绪,发起read操作后,马上返回,由操作系统或另外的线程t2完成c和d阶段,通知t1直接使用数据
5、io多路复用:线程t1通过扫描或者监听事件机制发现多个socket通道中哪些数据可以读取,然后由t1或者其他线程有针对性的读取数据
6、nio:使用了selector,所以肯定是非阻塞,而且必须设置为非阻塞,至于是同步还是异步读取数据,取决于框架或者怎么使用nio,一般使用同步非阻塞比较多
7、select:当channel有感兴趣的事件发生,select函数需要把fd集合从用户态拷贝到内核态,需要遍历内核所有的fd,连接数限制1024
8、poll: 对于连接数没有了限制,其他和select一样
9、epoll:每次调用select,只会拷贝新的事件注册,不会像select一样全部fd拷贝一遍,为每个fd指定一个回调函数,当有事件发生,会触发对应的回调函数,不会像select一样遍历所有fd,当然对连接数没有限制
10、channel和buffer:channel支持异步读写、支持双向读写,必须结合buffer使用,支持阻塞和非阻塞,减少数据拷贝次数,减少内核空间和用户空间的上下文切换次数,buffer使用起来非常灵活
先记录一些概念,后面会更新nio和netty相关文章