越秀网站建设公司,app下载汅api免费下载大全视频,网站建设论坛,设计师网站十大网站推荐IO基本概述
IO的分类 IO以不同的维度划分#xff0c;可以被分为多种类型#xff1b;从工作层面划分成磁盘IO#xff08;本地IO#xff09;和网络IO#xff1b; 也从工作模式上划分#xff1a;BIO、NIO、AIO#xff1b;从工作性质上分为阻塞式IO与非阻塞式IO#xff1b…IO基本概述
IO的分类
IO以不同的维度划分可以被分为多种类型从工作层面划分成磁盘IO本地IO和网络IO 也从工作模式上划分BIO、NIO、AIO从工作性质上分为阻塞式IO与非阻塞式IO从多线程角度也可被分为同步IO与异步IO。Java中IO的介绍
传统的 java.io 包它基于流模型实现提供了最熟知的一些 IO 功能比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式。 也把 java.net 下面提供的部分网络 API比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库因为网络通信同样是 IO 行为。 在 Java 1.4 中引入了 NIO 框架java.nio 包提供了 Channel、Selector、Buffer 等新的抽象可以构建多路复用的、同步非阻塞 IO 程序同时提供了更接近操作系统底层的高性能数据操作方式。在实际面试中从传统 IO 到 NIO、NIO 2其中有很多地方可以扩展开来考察点涉及方方面面比如基础 API 功能与设计 InputStream/OutputStream 和 Reader/Writer 的关系和区别。 NIO、NIO 2 的基本组成。 给定场景分别用不同模型实现分析 BIO、NIO 等模式的设计和实现原理。 NIO 提供的高性能数据操作方式是基于什么原理如何使用
java IO概念 IO 不仅仅是对文件的操作网络编程中比如 Socket 通信都是典型的 IO 操作目标。 输入流、输出流InputStream/OutputStream是用于读取或写入字节的例如操作图片文件。 而 Reader/Writer 则是用于操作字符增加了字符编解码等功能适用于类似从文件中读取或者写入文本信息。本质上计算机操作的都是字节不管是网络通信还是文件读取Reader/Writer 相当于构建了应用逻辑和原始数据之间的桥梁 BufferedOutputStream 等带缓冲区的实现可以避免频繁的磁盘读写进而提高 IO 处理效率。这种设计利用了缓冲区将批量数据进行一次操作但在使用中千万别忘了 flush。
Java中的BIO、NIO、AIO
BIO 是一个同步阻塞 IO 阻塞 I/O 难以支持高并发的场景。NIO是一个非阻塞 I/O非阻塞的原因就是基于多路复用机制实现高并发场景下效率非常高。 AIO是一个异步非阻塞IO理论上讲 AIO的吞吐量肯定比NIO的要大但是实际上AIO的底层实现仍使用epoll没有很好实现AIO因此在性能上没有明显的优势而且被JDK封装了一层不容易深度优化。Java BIO
BIO就是Java的传统IO模型与其相关的实现都位于java.io包下其通信原理是客户端、服务端之间通过Socket套接字建立管道连接然后从管道中获取对应的输入/输出流最后利用输入/输出流对象实现发送/接收信息。在基本的 Socket 编程模型中accept 函数只能在一个监听套接字上监听客户端的连接recv 函数也只能在一个已连接套接字上等待客户端发送的请求只能处理一个客户端连接。Java NIO
Java-NIO则是JDK1.4中新引入的APINIO是一种基于通道、面向缓冲区的IO操作相较BIO而言它能够更为高效的对数据进行读写操作同时与原先的BIO使用方式也大有不同。Java-NIO是基于多路复用模型实现的其中存在三大核心组成部分Buffer缓冲区、Channel通道、Selector选择器。NIO 利用单线程轮询事件的机制通过高效地定位就绪的 Channel来决定做什么仅仅 select 阶段是阻塞的就可以有效避免大量客户端连接时频繁线程切换带来的问题应用的扩展能力有了非常大的提高。NIO 的主要组成部分 Buffer高效的数据容器除了布尔类型所有原始数据类型都有相应的 Buffer 实现。 Channel类似在 Linux 之类操作系统上看到的文件描述符是 NIO 中被用来支持批量式 IO 操作的一种抽象。File 或 Socket通常被认为是比较高层次的抽象而 Channel 则是更加操作系统底层的一种抽象这也使得 NIO 得以充分利用现代操作系统底层机制获得特定场景的性能优化例如DMADirect Memory Access等。不同层次的抽象是相互关联的可以通过 Socket 获取 Channel反之亦然。 Selector是 NIO 实现多路复用的基础它提供了一种高效的机制可以检测到注册在 Selector 上的多个 Channel 中是否有 Channel 处于就绪状态进而实现了单线程对多 Channel 的高效管理。Selector 同样是基于底层操作系统机制不同模式、不同版本都存在区别。
缓冲区、通道、选择器三者关系简单而言在这三者之间Buffer负责存取数据Channel负责传输数据而Selector则会决定操作那个通道中的数据。Java AIO
Java 7 引入 NIO 2 增添了一种额外的异步 IO 模式利用事件和回调处理 Accept、Read 等操作。Java-AIO与Java-NIO的主要区别在于使用异步通道去进行IO操作时所有操作都为异步非阻塞的当调用read()/write()/accept()/connect()方法时本质上都会交由操作系统去完成比如要接收一个客户端的数据时操作系统会先将通道中可读的数据先传入read()回调方法指定的缓冲区中然后再主动通知Java程序去处理。Redis的网络通信模型
通常系统实现网络通信的基本方法是使用 Socket 编程模型包括创建 Socket、监听端口、处理连接请求和读写请求。但是由于基本的 Socket 编程模型一次只能处理一个客户端连接上的请求所以当要处理高并发请求时一种方案就是使用多线程让每个线程负责处理一个客户端的请求。 而 Redis 负责客户端请求解析和处理的线程只有一个那么如果直接采用基本 Socket 模型就会影响 Redis 支持高并发的客户端访问。 为了实现高并发的网络通信Linux提供了 select、poll 和 epoll 三种函数实现多路复用机制而在 Linux 上运行的 Redis通常采用 epoll 函数实现多路复用机制进行网络通信。使用 select 和 poll 机制实现 IO 多路复用 select 函数存在两个设计上的不足1select 函数对单个进程能监听的文件描述符数量是有限制的它能监听的文件描述符个数由 __FD_SETSIZE 决定默认值是 1024。2 当 select 函数返回后需要遍历描述符集合才能找到具体是哪些描述符就绪了。这个遍历过程会产生一定开销从而降低程序的性能。为了解决 select 函数受限于 1024 个文件描述符的不足poll 函数对此做了改进。和 select 函数相比poll 函数的改进之处主要就在于它允许一次监听超过 1024 个文件描述符。但是当调用了 poll 函数后仍然需要遍历每个文件描述符检测该描述符是否就绪然后再进行处理。那么有没有办法可以避免遍历每个描述符呢就是接下来 目录 IO基本概述 IO的分类 Java中IO的介绍 java IO概念 Java中的BIO、NIO、AIO Java BIO Java NIO NIO 的主要组成部分 Java AIO Redis的网络通信模型 使用 select 和 poll 机制实现 IO 多路复用 使用 epoll 机制实现 IO 多路复用 的 epoll 机制。使用 epoll 机制实现 IO 多路复用 正是因为 epoll 能自定义监听的描述符数量以及可以直接返回就绪的描述符Redis 在设计和实现网络通信框架时就基于 epoll 机制中的 epoll_create、epoll_ctl 和 epoll_wait 等函数和读写事件进行了封装开发实现了用于网络通信的事件驱动框架从而使得 Redis 虽然是单线程运行但是仍然能高效应对高并发的客户端访问。