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

IO总结

2 分钟· ·
后端 框架 Java
作者
Allen
一个强大、轻量级的 Hugo 主题。
目录

最近被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
Stream源码(1):如何实现去重
3 分钟
后端 框架 Java Stream
如何在Ubuntu上发布Scala Jar包到Maven中央仓库
7 分钟
后端 框架 Java
Java的char类型到底几个字节
6 分钟
后端 框架 Java
SPI破坏了双亲委派吗
4 分钟
后端 框架 Java
AOP再思考
4 分钟
后端 框架 Java