vlambda博客
学习文章列表

你知道网络中4类IO模型是什么吗?我的朋友如此优秀回答!

备战春招,校招实习面经分享,信手拈来,拿Java开发工程师offer~~

本系列文章包括Java、算法、计算机网络、数据库、操作系统等等,本篇介绍面试中常见的网络IO模型,也是实际工作设计中值得考虑的问题。

传送门:

1.2.

1、IO基础

为了更好了解网络IO模型,肯定要知道什么是IO呀,为啥会有许多模型,那就先来瞧瞧。

IO,实际就是Input/Output的合并简称。输入输出也就是程序必备的基础工作,如何输入输出呢,通常是读、写两种操作。

用户程序进行IO的读写,则依赖底层的IO读写,这个底层就是操作系统,读写由read&write两大系统调用负责。不同操作系统中IO读写的系统调用名称不完全相同,但原理是一致的。

网络IO实际就是Socket连接的通信,数据传输的操作。整个IO的过程通常会有几个角色参与:设备(网卡)、操作系统内核空间、缓冲区(buffer)、用户空间。

有了这些知识铺垫,接下来就可以来看看网络IO模型就简单许多了。

2、阻塞IO(Bloking IO)

一图胜万字,话不多说,先上图!

这张图很直观,也是我找了许久才找到的最合适的,这篇博客[4]写得很详细!

阻塞IO,顾名思义,指调用了read后,必须等待数据到达,并且复制到了用户空间,才能返回,否则整个线程一直在等待。

所以阻塞IO的问题就是,线程在读写IO的时候不能干其它的事情。

Java中默认创建的Socket都是阻塞的。

阻塞IO具体流程图:

你知道网络中4类IO模型是什么吗?我的朋友如此优秀回答!

优点:应用程序开发简单;阻塞期间用户线程挂起,不占用CPU资源。

缺点:每个线程都维护一个连接IO的操作。在高并发的应用场景下,需要大量的线程维护大量的网络连接,内存和线程切换开销巨大。

3、非阻塞IO(Non-blocking IO)

非阻塞IO,指的是用户的程序不需要等待内核IO的操作完成,就可以立即返回用户空间执行用户的操作。

你知道网络中4类IO模型是什么吗?我的朋友如此优秀回答!

用户线程为了读取数据,线程发起IO请求,在内核等待数据的过程中可以立即返回,所以IO会不断轮询,直到获得数据。

你知道网络中4类IO模型是什么吗?我的朋友如此优秀回答!

具体流程如上图。

优点:每次发起IO系统调用,在内核等待数据过程可以立即返回,用户线程不阻塞,实时性好。

缺点:线程需要不断进行系统调用,轮询数据是否准备好,占用大量的CPU资源,效率低。高并发不可用,Java开发中不用该模型。

4、多路复用IO(Multiplexing IO)

多路复用IO也称为异步阻塞IO,Java中的Selector和Linux的epoll都是这种模型,算是应用广泛的一种网络IO模型。

你知道网络中4类IO模型是什么吗?我的朋友如此优秀回答!

IO多路复用的优势,主要在于引入新的系统调用,同样会轮询数据状态,但通过选择器查询IO的就绪状态,这会很大地减少系统开销。内核将就绪状态返回给该系统调用的线程,应用程序根据就绪状态进行相应的IO系统调用。

这种新的系统调用的特点,涉及两种系统调用:select/epoll就绪查询和IO操作

优点:通过select查询线程可以处理大量的连接,系统不需要创建大量的线程,减少了系统开销。Java中New IO使用该模型,Linux使用epoll系统调用。

缺点:select/epoll就绪状态查询线程是阻塞式的,因此IO读写过程是阻塞的。

5、异步IO(Asynchronous IO)

真正地解决线程阻塞问题,就需要异步方式了。

**异步IO**,是指在整个内核的数据处理过程中,用户程序不需要等待数据到达,未到达这段时间不用阻塞,可以做其他事情。

异步IO特点:

与之前不同,用户空间与内核空间的调用方式反过来,用户空间的线程变成被动接受者,而内核成为主动调用者。有点难理解,为何如此说?

我们看看之前的IO模型,都是用户线程主动获取状态,然后完成各种操作。而这里的被动就是用户线程通过系统调用,只是向内核注册某个IO操作,然后就不管了。接下来所有事情交给内核,它完成整个IO操作后,再通知用户程序(变为主动通知),用户再执行后续的操作。


优点:可以实现比多路复用IO更高的吞吐量。

缺点:需要操作系统底层内核提供支持,而目前操作系统的这个功能并不完善。


逛了一圈网络IO的世界,才发现这里的老大还是多路复用IO。实际上IO模型的选择也是根据应用场景确定的,没有绝对的好,只有合适才好!



欢迎“一键三连”哦,点赞加关注,收藏不迷路!

每天进步亿点点,距离Java工程师更近一步啦,我们下篇见!(⊙ᗜ⊙)


本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/123184466