java中的io复用_从 Java 中的零拷贝到五种IO模型

在之前的文章中,我们聊过了 Java 中的零拷贝,零拷贝就是指数据不会在内核空间和用户空间之间相互拷贝。这样就减少了内核态与用户态的切换,自然就很高效。

拷贝文件只是 IO 操作中一个特殊的情况,大多数的 IO 操作还是需要将数据从内核空间移到用户空间,这往往是一个比较耗时的操作。

IO 操作不仅仅指对文件的读写,网络的通信同样也是 IO 操作。

如今很多系统的瓶颈就在于 IO 上,比如经典的 C10K,C10M 问题本质上就是在解决 IO 问题。

这篇文章将介绍经典的 IO 模型的实现原理,以及说明 Java IO 与这几种 IO 模型的关系。

💡本文讨论的环境为 Linux

IO 操作是怎么实现的

IO 操作是一个很复杂的过程,远远不止调用一个函数那么简单,因为每一次的 IO 操作都会涉及到操作系统的内核空间和用户空间的转换,真正执行的 IO 操作实际上是在操作系统的内核空间进行。

这是一个很耗资源的操作。计算机中内存和 CPU 都是非常稀有的资源,应该尽可能提高这些资源的使用效率。

IO 操作经常需要与磁盘就行交互,所以IO 操作相比于 CPU 的速度要慢好几个数量级。利用这两者之间的速度差异,就可以实现不同种类的 IO 方式,也就是俗称的 IO 模型。

当然,这些 IO 操作的都在操作系统层面上实现好了,编程语言可以利用这些能力去实现 IO 相关的 API。

五种 IO 模型

在 操作系统中,IO 模型有如下五种:

136ffa1c9dc78c3fedd960fe956818fc.png

在上文已经说到,其实 IO 操作就是将数据在用户空间与内核空间进行相互转换,这个过程是通过系统调用来完成的。 IO 技术的发展目标就是如何使用尽可能少的资源来完成数据的传输,这里资源主要就是指 CPU 资源。

无论是文件 IO,还是网络 IO,最后都可以统一为用户空间和内核空间数据的交换。

BIO

BIO 是最经典的一种 IO 方式,也是最简单粗暴的方式,在发起 IO 操作之后,当前调用线程就会处在阻塞状态,直到数据传输完成。

b8533ccb27af53614a1ad4754c2e612a.png

NIO

NIO 是在 BIO 基础之上的一个改进,NIO 在数据还未准备好的情况下,不会阻塞进程,而是通过轮询的方式,不断的去查询数据时候准备好,当数据可以被读取时,当前线程就会处在阻塞状态,直到数据读取完成。

cd4de647d74cbf3d7293af3c80d58199.png

所以 NIO 中的非阻塞指的是在等待数据的阶段,实际进行数据传输时,还是阻塞的,这点需要注意。

IO 多路复用

IO 多路复用是对 NIO 的一个改进,在 NIO 中,需要不断轮询查看数据是否准备好,IO 多路复用的改进是不再主动去查询数据状态是否准备完成,而是等数据准备好的通知,当数据准备完成之后,才会开始传输数据。

c43fc47b108ef248a175196388120d15.png

与 NIO 一样,在数据的传输阶段,当前线程依然是阻塞的。

在 Linux 系统中,IO 多路复用的方式有多种:

select

poll

epoll

信号驱动 IO

信号驱动 IO 通过 sigaction 系统调用,向内核发送一个信号,当内核中数据准备好之后,当前线程也会接收到一个信号,在这个过程中,当前线程也是非阻塞的。在接收到信号之后,就可以开始传输数据。

5fef3eaa011402826c31d9415e1f1b78.png

AIO

上面的这些 IO 模型虽然有些号称是不阻塞的,那是指在等待数据就绪的过程中是不阻塞的,但是在接收数据的时候,依然还是阻塞的。

AIO 是这些 IO 模型中真正实现完全不阻塞,AIO 在被调用之后直接返回,连接收数据的阶段也是非阻塞的,等到数据接收完成之后,内核才会返回一个通知,也就是说当用户进程接收到通知时,数据已经接收完成。

5a1f626c99bb1a97ff16a065b1f75035.png

在 Linux 中提供了 AIO 的实现,但是实际上使用的并不多,更多还是使用独立的异步 IO 库,比如libevent、libev、libuv。

五种 IO 模式的总结如下:

c6a61e94948aff5998807f2f4b1906c4.png

Java 中 IO 的实现

Java 中的 IO 也不例外,实际的 IO 是调用了系统的能力来完成,在用户态通过系统调转到内核态,最终实现文件的读写或者通信。

Java 中 IO 就是典型的 BIO,而且 NIO 则不是对应五种 IO 模型中的 NIO,Java 中的 NIO 实际上是使用 IO 多路复用来实现的。

Java 中的 NIO2 也称之为 AIO,正是对应操作系统中的 AIO,当然具体的实现可能是其他的库。

文 / Rayjun

REF

[1] Unix 网络编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 图像梯度检测_数字图像处理-边缘检测

梯度介绍首先介绍边缘检测中用到的高等数学原理---梯度。介绍梯度,离不开方向导数。方向导数顾名思义,方向导数就是某个方向上的导数。什么是方向:函数在这个方向上的图像:我们知道:函数的点在这个方向上也是有切线的&…

java 查找排序_查找与排序算法(Java实现)

1、二分查找算法package other;public class BinarySearch {/** 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据*/public static int binarySearch(int[] arr, int x) {int low 0;int high arr.length-1;while(low < high) {int middle (low hig…

java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令

学习java之电脑的常用快捷键和DOS窗口下的常用命令电脑一些常用的快捷键win快捷键&#xff1a;单独按Windows&#xff1a;显示或隐藏 “开始”功能表WindowsBREAK&#xff1a;显示“系统属性” 对话框WindowsD&#xff1a;显示桌面或恢复桌面WindowsM&#xff1a;最小化所有窗口…

java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

前言众所周知&#xff0c;《剑指offer》是一本“好书”。为什么这么说&#xff1f;因为在技术面试中&#xff0c;它里面罗列的算法题在面试中出现的频率是非常非常高的。有多高&#xff0c;以我目前不多的面试来看&#xff0c;在所有遇到的面试算法题中&#xff0c;出现原题的概…

java jvm 加载类的顺序_由经典面试题看java中类的加载机制

原标题&#xff1a;由经典面试题看java中类的加载机制1.概述类加载是Java程序运行的第一步&#xff0c;研究类的加载有助于了解JVM执行过程&#xff0c;并指导开发者采取更有效的措施配合程序执行&#xff0c;对理解java虚拟机的连接模型和java语言的动态性都有很大帮助。由于J…

php数据库可转java数据库,php转java 系列2 Spring boo 链接数据库jdbc

php转java 系列2 Spring boo 链接数据库jdbcJDBC首先创建一个新项目&#xff0c;在创建项目时要注意导入依赖&#xff0c;在项目创建成功后就会看到在 pom.xml 文件中找到&#xff0c;但是如果在创建项目的时候没有导入&#xff0c;就要在pom.xml中手动的添加依赖&#xff1b;o…

php连接excel表格数据类型,TP5 中使用PHPExcel 导出导入数据到excel表格

将下载好的PHPExcel文件夹放置在框架中的Vendor目录下&#xff0c;注意目录的结构&#xff0c;按照我的代码来基本上直接引用就能使用&#xff0c;如下图&#xff1a;导出数据代码如下//导出数据表 开始public function product(){$listdb(product)->select();vendor("…

oracle导致的负载高,Oracle 11g 数据库服务器CPU、IO负载高的故障排除流程

使用top查看负载高的进程~ [OSMSRDB]$ toptop - 11:02:43 up 12 days, 17:15, 4 users, load average: 1.50, 0.93, 0.36Tasks: 363 total, 1 running, 362 sleeping, 0 stopped, 0 zombieCpu(s): 1.2%us, 0.3%sy, 0.0%ni, 68.4%id,30.1%wa, 0.0%hi, 0.0%si, 0.0…

清理linux 服务器的命令行,使用Linux上的Magic SysRq键修复冻结的X服务器,清理重新启动并运行其他低级命令 | MOS86...

在Linux中&#xff0c;魔术SysRq键可以直接发送命令到Linux内核。您可以使用它来恢复冻结或干净地重新启动系统&#xff0c;即使没有任何反应。魔术SysRq键是作为Linux键盘驱动程序的一部分实现的 - 只要Linux内核仍在运行&#xff0c;它将会工作。只有内核崩溃才能禁用此组合键…

上海电力大学c语言程序设计章测试,上海电力学院c语言报告:实验8 指针.doc

上海电力学院c语言报告&#xff1a;实验8 指针.doc下载提示(请认真阅读)1.请仔细阅读文档&#xff0c;确保文档完整性&#xff0c;对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档&#xff0c;不会出现我们的网址水印。3、该文档所得收入(下载内容预览)…

python c语言 数据类型转换,Python类型转换,数据类型转换函数大全

虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点类型 heigh…

新闻发布系统C语言,资讯 | 助力期末之c语言专场圆满结束!

原标题&#xff1a;资讯 | "助力期末"之c语言专场圆满结束&#xff01;大一生活如白驹过隙&#xff0c;一转眼便来到了期末&#xff0c;相信很多同学都对c语言期末考很在意&#xff0c;但是又不知道考点在哪里&#xff0c;感觉很多知识点都还不太清楚。确实&#xff…

android创建空文件,ADT 更新 eclipse srclayout 文件夹创建时候为空

今天是14-3-9&#xff0c;发现SDK Manager有更新&#xff0c;手贱点了一下。。。然后新建项目src和layout文件夹就成空的了。。。虽然可以手动建立内容&#xff0c;但是感觉很不爽&#xff0c;到处找解决方法&#xff0c;最后在贴吧找到了&#xff0c;内容链接到了eoe&#xff…

html语言循环语句,Scala @功能/语言的HTML文档 - for循环,如果语句等

我正在一个控制器的视图(HTML页面)中&#xff0c;我试图匹配复选框中的“选中”值的列表中。Scala 功能/语言的HTML文档 - for循环&#xff0c;如果语句等我从模型中抓取选定的复选框值(列表A)&#xff0c;将它们在控制器中抓取并发送到视图。我还从模型中获取复选框选择/选项/…

百度自动推送html5,百度暂停 JS 代码自动推送功能,代码是否需要删除?

本月上旬末的时候百度站长平台就推送了一则关于&#xff1a;搜索资源平台自动推送暂停使用通知。说到由于升级维护&#xff0c;搜索资源平台链接提交-自动提交-自动推送(JS 代码推送)功能暂时停止使用。并且会在恢复使用时再次通知。由于这条通知是百度通过搜索资源平台发送的站…

html中表格布局还是div布局,Table布局 VS Div+CSS布局,选哪个?

Table布局 和 DivCSS布局的争论&#xff0c;过了7-8年了&#xff0c;今天看到一篇文章《为什么我们不建议用Table布局》&#xff0c;又想发表下自己的见解&#xff0c;供初学《为什么我们不建议用Table布局》节选&#xff1a;Table要比其它html标记占更多的字节。(延迟下载时间…

计算机桌面锁写快捷,电脑如何锁屏幕 锁屏快捷键是什么

锁屏幕是用户们日常生活中的必备玩法,很多玩家们却不知道游戏中应该如何锁屏幕,那么具体应该如何锁屏幕呢?下面小编带大家一起来看下电脑如何锁屏幕吧!电脑怎么锁屏幕?电脑如何锁屏幕?1、首先自然是需要为电脑创建一个密码。点击开始按钮&#xff0c;然后找到控制面板&#…

计算机在军事的应用论文,信息技术论文3000字【军事信息技术论文】

信息技术是20世纪科学技术发展最重大&#xff0c;最辉煌的成就之一&#xff0c;下面是小编为大家精心推荐的军事信息技术论文&#xff0c;希望能够对您有所帮助。军事信息技术论文篇一漫谈信息技术【摘 要】本文研究了信息技术的发展历程&#xff0c;阐述了信息技术的涵义及研究…

计算机组成原理环境配置,计算机组成原理课程设计

《计算机组成原理》实验大纲适用专业&#xff1a;计算机科学与技术(本科)、网络工程(本科)实验学时&#xff1a;16学时学分&#xff1a;0.5学分一、实验课程目的与要求(1) 进一步融会贯通教材内容&#xff0c;掌握计算机各功能模块的工作原理、相互联系和来龙去脉&#xff0c;完…

计算机学业水平测试初中生操作题,初中学业水平考试信息技术考试操作题常见题型及作答方法...

初中信息技术考试操作题常见题型及作答方法牛角寨乡初级中学信息技术考试已经有两年了&#xff0c;通过这两年的考试情况来看&#xff0c;我认为&#xff0c;要想在信息技术考试中取得一个好的成绩&#xff0c;操作题是一个很重要的环节&#xff0c;从这两年的情况来看&#xf…