io 是什么
是以流为基础进行数据的输入输出。通俗点说就是java通过数据流方式和外部进行通讯
I/O中数据的操作是通过流的方式,我们可以把数据流看成水流一样,他可以从一个源头端流入到另一个目的端,且水流不是一次全部到达,而且连续的流入目的端。I是指从外部设备的数据流流入java程序的流。o是指从java程序中把数据流输出到其他设备中的流
IO操作的2个步骤:
1、准备数据
2、把数据从内核中拷贝到程序进程
io的四种模型
阻塞IO、非阻塞IO、多路复用IO、异步IO
首先先了解同步和阻塞的概念
阻塞与非阻塞
主要表现再一个IO操作的过程中,列入读操作时需要准备数据,那么当前IO进程是否等待操作完成,还是得知暂时不能操作后先去做别的事情,一直等待下去,什么事也不做直到完成,这就是阻塞。抽空做些别的事情,只是非阻塞
比较:从CPU角度可以看出非阻塞明显提高了CPU的利用率,进程不会一直在那等待。但是同样也带来了线程切换的增加。增加的 CPU 使用时间能不能补偿系统的切换成本需要好好评估。
示例
A 小明和小刚两个人都很耿直内向,一天小明来找小刚借书:“小刚啊,你那本XXX借我看看”。 于是小刚就去找书,小明就等着,找了半天找到了,把书给了小明。
B 小明和小刚两个人都很活泼外向,一天小明来找小刚借书:“嘿小刚,你那本XXX借我看看”。 小刚说:“我得找一会”,小明就去打球去了。过会又来,这次书找到了,把书给了小明。
结论:A是阻塞的,B是非阻塞的。
同步与{非同步 ==>异步}
可以看出,判断同步和异步的标准在于:一个IO操作直到完成,是否导致程序进程的阻塞。如果阻塞就是同步的,没有阻塞就是异步的。这里的IO操作指的是真实的IO操作,也就是数据从内核拷贝到系统进程(读)的过程。
继续前面借书的例子,异步借书是这样的:
C 小明很懒,一天小明来找小刚借书:“嘿小刚,你那本XXX借我看看”。 小刚说:“我得找一会”,小明就出去打球了并且让小刚如果找到了就把书拿给他。小刚是个负责任的人,找到了书送到了小明手上。
A和B的借书方式都是同步的,有人要问了B不是非阻塞嘛,怎么还是同步?
前面说了IO操作的2个步骤:准备数据和把数据从内核中拷贝到程序进程。映射到这个例子,书即是准备的数据,小刚是内核,小明是程序进程,小刚把书给小明这是拷贝数据。在B方式中,小刚找书这段时间小明的确是没闲着,该干嘛干嘛,但是小刚找到书把书给小明的这个过程也就是拷贝数据这个步骤,小明还是得乖乖的回来候着小刚把书递手上。所以这里就阻塞了,根据上面的定义,所以是同步。
IO模型
IO 模型可分为以几种
同步阻塞IO (BIO)
同步非阻塞IO(NIO)
IO多路复用
异步IO
- 同步阻塞IO blocking I/O 即 BIO
线程发起一个请求,直到有结果返回,否则则一直阻塞等待,比如我们平常常见的阻塞数据库操作,网络IO等。
总结:就是程序种就是一直阻塞,而一个IO请求需要一个线程,可想而知当有大量的io请求,线程的创建和销毁,线程间的切换,线程所占用的资源等等要消耗多少时间和资源 - 同步非阻塞IO nonBlockin I/O 即 NIO
非阻塞IO和阻塞IO的最大区别就在与线程发起一个IO请求,不会一直阻塞直到有数据,而是不断的检查是否已有数据,若有数据则读取数据 - IO 多路复用
其实和nio很相似,但是多路复用io要比nio 多一个选择器,即当某个请求需要等待数据返回时,并不是当前这个线程去隔一段时间去轮询一次,而是统一交给一个管理者由这个管理者去管理这个请求是否可以去接收数据了。
关键部分:
小明领号后委托给了小a,小a观察到由空位后带回小明:非阻塞,领号后可以安心去做自己的事,不用担心错过
等待上菜:一直阻塞,直到由菜
总结:非阻塞IO和阻塞IO的最大区别就在与线程发起一个IO请求,不会一直阻塞直到有数据,而是不断的检查是否已有数据,若有数据则读取数据