一般IO模型讨论

发展初

计算机的诞生定义了CPU与IO两种概念。CPU是计算数据,IO是读写数据。IO设备则是数据出入的设备。
不论是电脑外设、磁盘、内存还是网卡。都与IO密切相关,IO将数据传送给CPU计算,CPU与IO紧密合作着,在这里,CPU与IO之间类似生产者和消费者。

一般IO模型讨论_第1张图片

发展中

随着计算机的快速发展,CPU的计算速度得益于芯片设计工艺和新型材料的发展,得到了飞速的提升。远远超过了IO的速度。
此时,在这个生产者和消费者模型里,消费者的速度远远大于了生产者,CPU空闲率直线上升,IO速度不足变成了发展难题。
一般IO模型讨论_第2张图片
即使现在,IO数据传输速度也远远小于CPU计算速度。为了提高CPU使用了,产生了各种计算机架构和系统设计,使他们能够得到充分的利用。比如多级缓存架构、各种IO模型实现等。

事务处理模式

常见的事务处理模式有: 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞。
为什么这里引入事务处理模式? 因为世界上的任何问题都可以归纳为事情。
同样地,CPU与IO之间的速度关系也可以归纳为一件事情。
它们的问题也可以通过事务处理模式来处理。所以先来理解事务以及同步、异步、阻塞和非阻塞。

一:处理对象(事务)

在现实世界中,一个事务就是一件事情。假设这个事情有A、B两个流程。
在计算机世界中,一个事务可能代表了一句代码、一个方法、一个功能或者一个模块等等。假设现在是A、B两个方法。

二 : 处理者

在现实世界中,处理者可能是人、机器、动物等等有能力处理事情的对象。
在计算机世界中,处理者可能是线程、进程、程序、系统中间件等等。

二: 处理方法

1. 同步
如果用同步概念来处理事情,那就是串行处理,即处理A处理完再处理B。这里只需要一个处理者。
一般IO模型讨论_第3张图片

2. 异步
如果是用异步概念来处理,异步就是除了现在的处理者之外,还需要其他的处理者来参与。这里AB两个流程就需要两个处理者。
一般IO模型讨论_第4张图片

归纳: 同步与异步的区别在于,在当前处理者之外,是否还有其他处理者。

阻塞和非阻塞的概念是对同步与异步概念的一个补充,他们并不互斥,而是相互耦合。怎么理解呢?看我画的图,并没有连接到结束。因为有很多种可能,所以暂时保留想象。

因为阻塞与非阻塞只会发生在当前事务中,不论是A、还是B。他们指的是当前事务的一个状态。
3. 阻塞
指当前事务或者流程处于阻塞状态。
一般IO模型讨论_第5张图片

4. 非阻塞
指当前事务或者流程处于非阻塞状态。
一般IO模型讨论_第6张图片

当他们发生结合是,就产生了
同步阻塞、同步非阻塞、异步阻塞和异步非阻塞四种方案

IO模型

在计算机中,IO操作属于计算机内核操作,属于操作系统统一管理。我们平时开发的应用程序属于用户程序,操作系统的属于内核程序。我们需要做IO请求,必须让操作系统在中间帮个忙。
一般IO模型讨论_第7张图片
所以第一步,想内核发出IO请求,第二步,内核取到数据。 第三步,内核数据发送给用户程序。由于CPU速度远远大于IO速度,如果有AB两个IO请求。就能产生同步阻塞、同步非阻塞、异步阻塞和异步非阻塞四种模式。

因为阻塞和非阻塞是对某个事务而言,所以当异步处理时,不论有多少个处理者,他们都是可以被阻塞的,但是下面的阻塞和非阻塞都是站在主事务的视角上去理解的。

1. 同步阻塞
同步阻塞,就是一个处理者串行处理事务。即A处理完了处理B。
一般IO模型讨论_第8张图片

在CPU与IO的关系中,如果出现多个IO请求,那么CPU发起请求,然后等待IO传送数据,然后CPU再计算的过程。多次IO操作之间,CPU与IO一直处于串行关系。
这一模型,如果发生在CPU计算速度 = IO传输速度时,可以完全利用他们的性能。但是现在CPU远远大于IO的速度。所以同步阻塞IO浪费了CPU的性能。

2. 同步非阻塞
同步怎么还有非阻塞? 怎么理解呢。我任务这几个概念中,同步非阻塞是最不好用现实世界中的事情来描述。但是可以放在计算机世界中来理解这个概念。

由于CPU速度远远大于IO速度,如果有AB两个IO请求,那么同步阻塞的方法就是必须等一个IO请求完成后,再请求第二个IO。
但是如果采用同步非阻塞模式,那么就可以同时发送AB两个IO请求,然后用户程序阻塞等待,直到内核取回数据,并且推送通知给用户程序,然后用户程序再去内核取数据。
一般IO模型讨论_第9张图片
在IO操作上,属于同步非阻塞模式,因为参考对象是用户程序。
对于用户程序而言,只会开启一个线程,然后又是多个IO同时处理,并且CPU不会在某个IO上阻塞,所以说是同步非阻塞。
但是主流程必须阻塞等待A和B两个IO都完成了才能往下走。

3. 异步阻塞

异步阻塞,就是多个处理者。如果AB两个IO使用异步阻塞模型,则A和B各有一个处理者。但是A最终必须等到B完成后才能往下走。如果获取B的时候发现B已经完成了,则不会阻塞。
由于CPU速度远远大于IO,所以当B在处理IO时,主流程A也在处理IO,干完了再去访问B的IO数据是否已经就位,如果B的数据准备就绪则不会阻塞,如果B还在准备中,则阻塞。这样提高了主流程的办事效率。
一般IO模型讨论_第10张图片

4. 异步非阻塞
异步非阻塞,就是多个处理者,但是主流程不阻塞。
一般IO模型讨论_第11张图片

如上图,至于B任务结束还是未结束是未知的。可能正常结束、可能异常、可能死锁、也可能陷入了死循环。
所以,对于异步非阻塞模式,完全不影响A的正常流程,

Java中的IO模型

由以上概念延伸出来的几种IO模型。

同步阻塞就是Java中的BIO模型。常见的InputStream、OutputStream都是属于BIO。
一般IO模型讨论_第12张图片

BIO模型的优缺点:

未完待续…

你可能感兴趣的:(IO体系,java)