NIO 非阻塞IO
BIO 阻塞IO
stream vs channel
1.stream不会自动缓冲数据;channel会利用系统提供的发送缓冲区,接受缓冲区,更为底层。
2.stream仅支持阻塞API;channel同时支持阻塞、非阻塞API,网络channel可配合selector实现多路复用。
3.二者均为全双工,即读写可以同时进行。
当调用一次channel.read或stream.read后,会切换至操作系统内核态来完成真正数据读取,读取又分为两个阶段:
1.等待数据阶段。读取的时候不一定有数据,没有数据就会等待。
2.复制数据阶段。会把网卡上的数据复制到操作系统内存中。
IO模型
1.阻塞IO(同步),用户线程发起一次read操作,会由用户空间切换到内核空间去真正读取数据,但是网络上可能没有数据,这时read方法就会阻塞住,就是线程停止等数据,这期间什么也干不了,用户和内核都要等待。等待数据到了,进行数据的复制,从网卡复制到内存中,再由内核空间切换到用户空间,返回数据,read方法调用就结束了。缺点:做一件事的时候就做不了另一件事。
2.非阻塞IO(同步), 用户线程发起一次read操作,会由用户空间切换到内核空间去真正读取数据,但是网络上可