2、NIO vs BIO

烟雨 4年前 (2021-09-06) 阅读数 544 #NIO
文章标签 NIO

一、stream vs channel

  • stream不会自动缓冲数据,channel会利用系统提供的发送缓冲区、接收缓冲区(更为底层)。

  • stream仅支持阻塞API,channel同时支持阻塞、非阻塞 API,网络channel可配合selector实现多路复用。

  • 二者均为全双工,即读写可以同时进行。

二、IO 模型

image.png

  • 同步:线程自己去获取结果(一个线程)。

  • 异步:线程自己不去获取结果,而是由其它线程送结果(至少两个线程)。

当调用一次channel.read()或stream.read()后,会切换至操作系统内核态来完成真正数据读取,而读取又分为两个阶段,分别为:

  • 等待数据阶段。

  • 复制数据阶段。

image.png

2.1、阻塞IO模型

image.png

阻塞IO模型是指从应用程序发起从获取数据那一刻起,如果内核里没有准备好数据,则直接阻塞用户线程,导致用户线程无法去做别的任何事情,直到数据准备好,被阻塞的程序才会被唤醒,继续处理拿到的数据。

阻塞IO模型只允许一个线程处理一个连接请求,因此当并发量大的时候,会创建大量线程,线程切换开销很大,导致程序处理性能低下

2.2、非阻塞IO模型

image.png

对于非阻塞IO模型,在发送获取数据的请求时会将对应套接口设置为非阻塞(serverSocketChannel.configureBlocking(false);),用户线程通过轮询的方式进行询问,数据是否已经准备好,当准备好后停止轮询,接下来的逻辑跟阻塞IO一致。
对比可以发现,阻塞与非阻塞都是以调用方的角度看的,而且阻塞与否全在第一个阶段,第二个阶段都是一致的。非阻塞IO虽然不会阻塞应用程序,但是因为需要长时间的轮询,对于CPU来说,将会进行大量无意义的上下文切换,资源利用率较低

2.3、多路复用

image.png

IO多路复用,利用了一个个代理select,帮助监听多个IO通道的状态,某个通道有新状态产生(触发事件),没有新的状态产生,则select会阻塞。
注意这里的阻塞,与阻塞IO模型里的不同,阻塞IO模型是指一个IO操作时发生的阻塞行为,而这里select可以同时阻塞多个IO通道,也就是说select可能会监听到一个以上的IO通道的状态,直到有数据可读、可写时,才真正触发IO操作的函数。

2.4、异步IO

image.png

异步IO,通过线程1注册一个回调方法,当数据准备完毕后通过另外的线程返回数据,进行处理。

三、一次网络请求的流程

image.png

内核空间&用户空间

操作系统采用虚拟存储器,操作系统核心是内核,独立于普通应用程序,它既可以访问受保护的内存空间,又有访问底层硬件设备的所有权限。
为了保证内核安全,使得用户进程不直接操作内核,因此操作系统将虚拟存储器分为两个部分:内核空间、用户空间。

内核空间:指操作系统运行时用于程序调度、虚拟内存的使用或者连接硬件资源的程序逻辑的空间。

用户空间:应用程序能够申请使用的空间。


版权声明

非特殊说明,本文由Zender原创或收集发布,欢迎转载。

上一篇:1、NIO基础 下一篇:3、Reactor线程模型

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

作者文章
热门