5种IO模型

几个概念说明

阻塞(Block)和非阻塞(Non-Block)

阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。

阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。

非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。

同步(Synchronization)和异步(Asynchronous)

同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式。

比如同步:是应用程序要直接参与 IO 读写的操作。

异步:所有的 IO 读写交给操作系统去处理,应用程序只需要等待通知。

同步方式在处理 IO 事件的时候,必须阻塞在某个方法上面等待我们的 IO 事件完成(阻塞 IO 事件或者通过轮询 IO事件的方式),对于异步来说,所有的 IO 读写都交给了操作系统。这个时候,我们可以去做其他的事情,并不需要去完成真正的 IO 操作,当操作完成 IO 后,会给我们的应用程序一个通知。

同步 : 阻塞到 IO 事件,阻塞到 read 或则 write。这个时候我们就完全不能做自己的事情。让读写方法加入到线程里面,然后阻塞线程来实现,对线程的性能开销比较大。

5种IO模型

1.同步阻塞型IO (Block IO ,BIO)

5种IO模型_第1张图片

用户线程调用内核IO操作,需要等IO彻底完成后才返回到用户空间,因此是阻塞IO。

优点:

能够及时返回数据,无延迟;

对内核开发者来说这是省事了;

缺点:

对用户来说处于等待就要付出性能的代价了;

2.同步非阻塞IO (nonblocking IO ,NIO)

5种IO模型_第2张图片

操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,因此是非阻塞的。

非阻塞IO中需要用户线程在每个IO通路上,各自不断轮询IO状态,来判断是否有可处理的数据

优点:

能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。

缺点:

任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。

3.同步IO多路复用(IO multiplexing)

5种IO模型_第3张图片

在非阻塞IO的基础上把一个连接的可读可写事件剥离出来,使用单独的线程来对其进行管理。

多个IO通路,都复用这个管理器来管理socket状态。

多路复用在内核中提供了select,poll,epoll三种方式。

select方式

只能处理有限(不同系统参数:1024/2048)个socket
select监控socket时不能准确告诉用户是哪个socket有可用数据,需要轮询判断

5种IO模型_第4张图片

poll方式

与select没区别采用链表实现,取消了文件个数的限制

5种IO模型_第5张图片

epoll方式

epoll_wait 直接检查链表是不是空就知道是否有文件描述符准备好了;

fd 上的事件发生时,与它对应的回调函数就会被调用把fd 加入链表,其他处于“空闲的”状态的则不会被加入
epoll从上面链表中获取有事件发生的fd;

没有最大连接限制;

可以直接告诉用户程序哪一个,哪个连接有数据了。

5种IO模型_第6张图片
5种IO模型_第7张图片

4.信号驱动(signal-driven IO)

5种IO模型_第8张图片

信号驱动式I/O:首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据

5.异步非阻塞IO(asynchronous IO ,AIO)

5种IO模型_第9张图片

小结

5种IO模型_第10张图片


End.

你可能感兴趣的:(Java,博文,1024程序员节)