跳过正文
  1. 博客/
  2. 后端/
  3. 框架/

IO总结

·2 分钟· ·
后端 框架 Java
目录

最近被NIO这个概念弄得有点晕,一会是Linux的NIO一会是Java 的NewIO也叫NIO,然后Linux又有一个AIO的概念,但是Java里面好像没有,所以就好好理理IO到底是个啥东西

IO模型
#

我们都知道IO就是Input Output,但是IO模型其实是给读取也就是Input来做的模型,因为Output非常简单就是往网卡写数据,但是读数据就有点不一样了

为了高效的从socket里面读数据,Linux给IO创建了5种模型

第一种最简单,就是同步模型,执行一个系统调用,然后等内核从网卡读取完,最后讲数据从内核复制到用户空间就完成了一次IO读取,这种方式对内核来说最简单了,但是对于用户来说就很低效了

一个线程基本上都卡在IO上面了,即使有多线程技术,但是万一用户量很大,线程是有限的,而且有的时候万一用户网络很卡数据包很大,网卡读数据就花了几个小时,几个小时都耗在一个链接上了

所以提出来第二种IO,同步非阻塞 IO,也就是NIO,这个IO和上面区别在于,执行系统调用之后里面就返回了,不会等待内核堵塞用户了,但是假如内核没准备好,则会返回为空,但是这个也有个缺点就是
假如一直没准备好,你就得用个队列把这些没准备好的存贮起来进行轮询,假如队列里面多了,你会耗很多时间在无效轮询上面

所以在NIO的基础上,操作系统提出一个多路复用的概念,其实就是相当于操作系统给你维护了一套消息队列,当有IO准备好了,就返回给客户端,所以其实对于客户端来说,现在的IO还是一个堵塞的,
只有当IO准备好了才会返回,操作系统在维护这个队列上面也做了很多升级,从最初的selectpoll到最后的epoll,操作系统一直在优化,以达到一个完全消息驱动,节省不必要的CPU浪费

当然前面的NIO的需要轮询的缺点可以通过信号来解决,所以又引出了第三个模型,就是信号模型,不幸的信号模型在大量IO的情况下会丢数据,导致不可靠,所以这个模型其实用的也少

Java New IO
#

异步到底是什么
#

异步优缺点
#

异步的替代方案
#

总结
#

引用
#

https://www.linuxidc.com/Linux/2017-09/146682.htm

相关文章

Bean复制真的那么慢吗
·3 分钟
后端 框架 Java
引言 # 最近在业务代码中经常用到的BeanUtils.copyProperties,有的时候在想,这个东西在Java里面真方便,但是性能怎么样呢,然后找了一篇博文 https://www.cnblogs.com/kancy/p/12089126.html
Stream源码(1):如何实现去重
·3 分钟
后端 框架 Java Stream
本篇博客是在看代码的时候看到使用Java8使用Stream去重的妙用,从而对Java如何使用Stream实现几行代码 完成一个可支持并行化的流式计算程序
如何在Ubuntu上发布Scala Jar包到Maven中央仓库
·7 分钟
后端 框架 Java
由于网上的教程大多数是Windows下的,而且都是介绍怎么打包Java的Jar包,关于Scala相关的比较少,因此我踩了不少坑才成功的把包发布到Maven中央仓库,你们可以才中央仓库里面搜到我的包
Java的char类型到底几个字节
·6 分钟
后端 框架 Java
引言 # 之所以有这个疑问,是上次阅读Java基础书时碰到讲解char类型没有看明白,并且在代码验证过程中错误的理解了代码的意思,导致我对这么个简单问题产生疑惑并且“恶意揣测”Java内部的黑魔法,这里就把我如何走上歪路,并且最终找到“正确”的道路的故事讲出来
SPI破坏了双亲委派吗
·4 分钟
后端 框架 Java
最近在学JVM的时候,把ClassLoader部分给过了一遍,谈到ClassLoader少不了双亲委派,谈到双亲委派少不了说破坏双亲委派的SPI,也看到了知乎上一些观点 ,这个时候我就疑惑了,有两个问题围绕在我头上,什么是双亲委派,为什么说SPI破坏了双亲委派,这篇博客就从源码出发,讲一讲我的理解
AOP再思考
·4 分钟
后端 框架 Java
我记得之前写过Spring AOP相关的文章,但是最近在观看Cat源代码的时候发现 @Aspect 这个注解与AspectJ这个项目,查阅了不少博客,感觉还是云里雾里,这篇博客就是基于博客以及自己实际实验与测试搞懂 Spring AOP和 AspectJ之间的关系