从Linux五种IO模型到JAVA NIO,一文理解IO模型的本质
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了从Linux五种IO模型到JAVA NIO,一文理解IO模型的本质,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3945字,纯文字阅读大概需要6分钟。
内容图文
BIO,NIO
2020年12月25日
15:01
目录 |
- - 引言 - Linux中五种IO模型 - 预备知识 - 阻塞式I/O - 非阻塞IO模型 - IO复用模型 - 信号驱动的IO模型 - 异步IO模型 - JAVA中的IO模型 - BIO - NIO - 三大模块: - 区别与缺陷 - ref:
|
引言
从数据的角度来看,应用的交互都离不开数据的读写申请,不管是os应用还是网络应用。模块之间发生的读写等待,直接关系到整体系统的整体并发性能。所以在强调高并发的今天,显得尤为重要。
Linux中五种IO模型
IO模型并不新鲜,操作系统(linux为例)就为IO发展了五种模型。
预备知识
- 内存会被划分为内核空间和用户空间,用户对于内核空间的访问需要通过系统调用执行,此外,内核空间还负责管理设备,例如IO设备,所以用户操作IO设备同样是通过系统调用
- 在linux看来,一切设备都是文件,IO设备会有自己缓冲区用户读写数据。
- 用户通过系统调用,申请读写IO设备缓冲区,但是读,写的过程都需要时机,在这两段时间里,使用不同的策略作等待则形成了不同的IO模型
阻塞式I/O
Block I/O,即BIO。非常简单,用户申请读写,然后等待数据准备,准备好则开始处理IO,将数据复制到用户空间中。
非阻塞IO模型
Non Block IO, 即NIO。BIO的问题在于,数据准备期间,用户进程一直在空等。NIO的特点是,用户在数据准备时并不阻塞,继续运行自己的工作,但是时不时来看看数据准备好了没有,也就是轮询。
轮询是该类型IO模型的瓶颈关键。
IO复用模型
NIO模型还有一个点,即一个用户进程申请了IO,数据准备过程中,其他用户进程是不能申请的。能不能同时进行多个申请呢?这就是IO复用模型。
用户进程通过select函数来发起申请,select函数可以被复用,即被多个进程调用,select视为一个单独的进程,负责管理所有进程的申请。
相比于NIO,它相当于抽象出一个申请管理中心。不过需要注意的是,进入select的进程会阻塞掉,select则负责监听所有进行IO的进程,由select发起轮询,一旦有数据准备好则返回。
信号驱动的IO模型
上述几种模型都需要进程轮询或阻塞,等待数据准备,为了避免这种过程,我们很自然地想要一个报警器,在数据准备好的时候通知对应线程进行IO。这就是信号驱动的IO模型。
异步IO模型
这是AIO,也是最后一个IO模型。有意思的是,除了AIO,其他四种IO模型,其实都是同步IO,因为事实上它们数据IO的过程都是同步的——即数据准备好之后,真正读写都是由发起IO请求的用户进程来管理的,在IO发生期间,用户进程仍需要同步阻塞。
这是最后一层影响高并发性能的障碍。在Linux中,AIO模型让IO实际过程交给系统内核完成,即系统内核接收到IO请求后,用户进程就不管了,系统内核接手,准备数据好了以后,系统内核负责将数据从IO缓冲区中复制到用户空间。最后通知用户。
JAVA中的IO模型
事实上,有了上述知识,就能很好地理解java中的三种IO模式,BIO, NIO, AIO。
BIO
JAVA中所有基本IO操作的方法都是阻塞的,例如调用.read之后就开始阻塞等待。
该机制有两方面的问题:
- 用户自己必须在数据准备过程中阻塞
- 服务器(数据准备方)可以通过多线程的方式为多个用户提供服务,但问题在于,线程开销非常大,这种方式会造成大量申请的情况下,线程太多,各个线程都阻塞,造成极大的开销
解决上面第二个问题的方式是线程池。用户申请则进入等待队列,等线程池中的线程调用。
NIO
JAVA中NIO为了解决BIO的用户阻塞问题。JAVA中的NIO比起Linux中的NIO来说要复杂一些,我猜测它应该是linux中NIO,IO复用模式的混合。
如果仔细理解linux中的NIO和IO复用模式,就能很快理解JAVA NIO的设计思想。
三大模块:
- Buffer,BIO面向流,NIO面向缓冲区,用户线程只能通过Channel访问Buffer,IO设备的数据最终也只写向Buffer。
- Channel,多种Channel,读,读写或其他,负责抽象用户进程提出的申请。
- Selector,多个Channel由selector负责管理,注意selector需要监控所有channels,由selector负责所有请求的轮询——这正是IO复用模式的内容。
区别与缺陷
JAVA中BIO和NIO的区别有如下:
- BIO是阻塞的,NIO非阻塞
- BIO面向流,NIO面向Buffer
缺点:
- selector是基于epoll或轮询方式实现的,这会带来很大的开销
- NIO很难使用,所以后来Netty是对NIO的改进封装
ps,java中AIO模型还用的不多,主流仍是Netty。
ref:
内容总结
以上是互联网集市为您收集整理的从Linux五种IO模型到JAVA NIO,一文理解IO模型的本质全部内容,希望文章能够帮你解决从Linux五种IO模型到JAVA NIO,一文理解IO模型的本质所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。