IO的分类有哪些

目录

一:BIO,NIO,AIO有什么区别

二:BIO,NIO,AIO有哪些适用场景

三:BIO的编程流程

四:NIO的三大核心部分

五:NIO中buffer的属性有哪些

六:BIO与NIO的对比

七:简述一下Selector选择器


一:BIO,NIO,AIO有什么区别

BIO:同步阻塞IO

JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。线程发起IO 请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善。

NIO:同步非阻塞IO

NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。线程发起IO 请求,立即返回;内核在做好IO操作准备之后,通过调用注册回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。服务器实现模式为一个请求一个线程,即客户端发送连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O 请求时才启动一个线程进行处理。

AIO:异步非阻塞IO

JDK1.7开始支持AIO,适用于连接数目多且连接长的结构。线程发起IO 请求,立即返回;内存做好IO操作准备之后,做IO操作,直到操作完成或者失败,通过调用注册回调函数通知线程做IO操作完成或者失败。服务器实现模式为一个有效请求一个线程,客户端IO 请求都由OS先完成了再通知服务器应用去启动线程进行处理。

二:BIO,NIO,AIO有哪些适用场景

1.BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择但程序简单易理解。

2.NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂JDK1.4开始支持。

3.AIO方式使用于连接数目多且连接比较长重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂JDK7开始支持

三:BIO的编程流程

1.服务器端启动一个ServerSocket;

2.客户端启动Socket对服务器进行通信,默认情况下服务器端需要对每 个客户 建立一个线程与之通讯;

3.客户端发出请求后,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝

4.如果有响应,客户端线程会等待请 求结束后,在继续执行;

四:NIO的三大核心部分

Selector(选择器)、Channel(通道)、Buffer(缓冲区)。

1.Selector 对应一个线程,一个线程对应多个channel(连接);

2.该图反应了有三个channel注册到该selector程序;

3.每个channel都会对应一个Buffer;

4.程序切换到哪个channel是有事件决定的,Event 就是一个重要的概念:

5.Selector 会根据不同的事件,在各个通道上切换;

6.Buffer 就是一个内存块,底层是有一个数组

7.数据的读取写入是通过Buffer,这个和BIO 中要么是输入流,或者是输出流,不能双向,但是NIO的Buffer 是可以读也可以写需要 flip 方法切换

8.channel是双向的,可以返回底层操作系统的情况,比如Linux,底层的操作系统 通道就是双向的;

NIO是面向缓冲区,或者说面向块编程,数据读取到一个数据后,会向缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络。

HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个 容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer。

五:NIO中buffer的属性有哪些

1.mark:标记

2.position:位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备。

3.limmit:表示缓冲区的当前终点,不能对缓冲区 超过极限的位置进行读写操作。且极限 是可以修改的

4.capacity:容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变

六:BIO与NIO的对比

1.BIO 以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/0 的效率比流 I/0 高很多;

2.BIO 是阻塞的,NIO 则是非阻塞的;

3.BIO基于字节流和字符流进行操作,而NIO基于 Channcl(通道)和 Buffcr(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器用于监听多个通道的事件(比如:连接请求,数据到达等),因 此使用单个线程就可以监听多个客户端通道。

七:简述一下Selector选择器

1.Java的NIO、用非阻塞的IO方式。可以用一个线程,处理多个的客户端连接,就会使用到Selector()选择器)。

  1. Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接和请求:

3.只有在 连接/通道真正有读写事件发生时,才会进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程。

4.避免了多线程之间的上下文切换导致的开销。

相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht1 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20242 小时前
Swift 数组
开发语言
吾日三省吾码2 小时前
JVM 性能调优
java
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi774 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器