【架构师面试-Java编程基本功-4】-IO的区别与分类
作者:互联网
1:什么是 IO
Java 中 I/O 是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java 通过 io 流方式和外部设备进行交互。
在 Java 类库中,IO 部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据传输流,字符串流,对象流等等等。
比如程序从服务器上下载图片,就是通过流的方式从网络上以流的方式到程序中,在到硬盘中
2:同步与异步,阻塞与非阻塞的区别
同步,一个任务的完成之前不能做其他操作,必须等待(等于在打电话)
异步,一个任务的完成之前,可以进行其他操作(等于在聊 QQ)
阻塞,是相对于 CPU 来说的, 挂起当前线程,不能做其他操作只能等待
非阻塞,,无须挂起当前线程,可以去执行其他操作
3:什么是 BIO
BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,没处理完之前此线程不能做其他操作(如果是单线程的情况下,我传输的文件很大呢?),当然可以通过线程池机制改善。BIO 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序直观简单易理解。
4:什么是 NIO
NIO:同步非阻塞,服务器实现一个连接一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。
NIO 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4 之后开始支持。
5:什么是 AIO
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O 请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理,AIO 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用操作系统参与并发操作,编程比较复杂,DK1.7 之后开始支持。.
AIO 属于 NIO 包中的类实现,其实 IO 主要分为 BIO 和 NIO,AIO 只是附加品,解决 IO 不能异步的实现
在以前很少有 Linux 系统支持 AIO,Windows 的 IOCP 就是该 AIO 模型。但是现在的服务器一般都是支持 AIO 操作
6:什么 Netty
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty 是一个基于 NIO 的客户、服务器端编程框架,使用 Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty 相当简化和流线化了网络应用的编程开发过程,例如,TCP 和 UDP 的 socket 服务开发。
Netty 是由 NIO 演进而来,使用过 NIO 编程的用户就知道 NIO 编程非常繁重,Netty是能够能跟好的使用 NIO
7:BIO 和 NIO、AIO 的区别
BIO 是阻塞的,NIO 是非阻塞的.
BIO 是面向流的,只能单向读写,NIO 是面向缓冲的, 可以双向读写
使用 BIO 做 Socket 连接时,由于单向读写,当没有数据时,会挂起当前线程,阻塞等待,为防止影响其它连接,,需要为每个连接新建线程处理.,然而系统资源是有限的,,不能过多的新建线程,线程过多带来线程上下文的切换,从来带来更大的性能损耗,因此需要使用 NIO 进行 BIO 多路复用,使用一个线程来监听所有 Socket 连接,使用本线程或者其他线程处理连接
AIO 是非阻塞 以异步方式发起 I/O 操作。当 I/O 操作进行时可以去做其他操作,由操作系统内核空间提醒 IO 操作已完成(不懂的可以往下看)
8:IO 流的分类
按照读写的单位大小来分
字符流:以字符为单位,每次次读入或读出是 16 位数据。其只能读取字符类型数据。 (Java 代码接收数据为一般为 char 数组,也可以是别的)
字节流:以字节为单位,每次次读入或读出是 8 位数据。可以读任何类型数据,图片、文件、音乐视频等。 (Java 代码接收数据只能为 byte 数组)
按照实际 IO 操作来分
输出流:从内存读出到文件。只能进行写操作。
输入流:从文件读入到内存。只能进行读操作。
注意:输出流可以帮助我们创建文件,而输入流不会。
按照读写时是否直接与硬盘,内存等节点连接分
节点流:直接与数据源相连,读入或读出。
处理流:也叫包装流,是对一个对于已存在的流的连接进行封装,通过所封装的流的功能调用实现数据读写。如添加个 Buffering 缓冲区。(意思就是有个缓存区,等于软件和 mysql 中的 redis)
注意:为什么要有处理流?主要作用是在读入或写出时,对数据进行缓存,以减少I/O 的次数,以便下次更好更快的读写文件,才有了处理流。
9:什么是内核空间
我们的应用程序是不能直接访问硬盘的,我们程序没有权限直接访问,但是操作系统(Windows、Linux......)会给我们一部分权限较高的内存空间,他叫内核空间,和我们的实际硬盘空间是有区别的
标签:BIO,Java,NIO,Netty,AIO,线程,IO,架构师,连接 来源: https://blog.csdn.net/chongfa2008/article/details/121581367