2、NIO vs BIO
一、stream vs channel
-
stream不会自动缓冲数据,channel会利用系统提供的发送缓冲区、接收缓冲区(更为底层)。
-
stream仅支持阻塞API,channel同时支持阻塞、非阻塞 API,网络channel可配合selector实现多路复用。
-
-
同步:线程自己去获取结果(一个线程)。
-
异步:线程自己不去获取结果,而是由其它线程送结果(至少两个线程)。
当调用一次channel.read()或stream.read()后,会切换至操作系统内核态来完成真正数据读取,而读取又分为两个阶段,分别为:
-
等待数据阶段。
-
复制数据阶段。
2.1、阻塞IO模型
阻塞IO模型是指从应用程序发起从获取数据那一刻起,如果内核里没有准备好数据,则直接阻塞用户线程,导致用户线程无法去做别的任何事情,直到数据准备好,被阻塞的程序才会被唤醒,继续处理拿到的数据。
阻塞IO模型只允许一个线程处理一个连接请求,因此当并发量大的时候,会创建大量线程,线程切换开销很大,导致程序处理性能低下。
2.2、非阻塞IO模型
对于非阻塞IO模型,在发送获取数据的请求时会将对应套接口设置为非阻塞(serverSocketChannel.configureBlocking(false);),用户线程通过轮询的方式进行询问,数据是否已经准备好,当准备好后停止轮询,接下来的逻辑跟阻塞IO一致。
对比可以发现,阻塞与非阻塞都是以调用方的角度看的,而且阻塞与否全在第一个阶段,第二个阶段都是一致的。非阻塞IO虽然不会阻塞应用程序,但是因为需要长时间的轮询,对于CPU来说,将会进行大量无意义的上下文切换,资源利用率较低。
2.3、多路复用
IO多路复用,利用了一个个代理select,帮助监听多个IO通道的状态,某个通道有新状态产生(触发事件),没有新的状态产生,则select会阻塞。
注意这里的阻塞,与阻塞IO模型里的不同,阻塞IO模型是指一个IO操作时发生的阻塞行为,而这里select可以同时阻塞多个IO通道,也就是说select可能会监听到一个以上的IO通道的状态,直到有数据可读、可写时,才真正触发IO操作的函数。
2.4、异步IO
异步IO,通过线程1注册一个回调方法,当数据准备完毕后通过另外的线程返回数据,进行处理。
三、一次网络请求的流程
内核空间&用户空间
操作系统采用虚拟存储器,操作系统核心是内核,独立于普通应用程序,它既可以访问受保护的内存空间,又有访问底层硬件设备的所有权限。
为了保证内核安全,使得用户进程不直接操作内核,因此操作系统将虚拟存储器分为两个部分:内核空间、用户空间。
内核空间:指操作系统运行时用于程序调度、虚拟内存的使用或者连接硬件资源的程序逻辑的空间。
用户空间:应用程序能够申请使用的空间。
版权声明
非特殊说明,本文由Zender原创或收集发布,欢迎转载。
上一篇:1、NIO基础 下一篇:3、Reactor线程模型
ZENDER
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。