网络模型——四种常见网络IO模型

网络模型——四种常见网络IO模型

文章目录

1.IO读写原理1.1 内核缓冲区和进程缓存区1.1.1 用户进程和操作系统1.1.2 缓冲区的目的

1.2 Java读写IO底层流程

2.四种主要的IO模型2.1 基本概念2.1.1 阻塞与非阻塞2.1.2 同步与异步2.1.3 四种IO模型

2.2 同步阻塞IO(Blocking IO)2.3 同步非阻塞IO(None Blocking IO)2.4 IO多路复用模型(IO Multiplexing)2.5 异步IO模型(Asynchronous IO)

3. 四种IO模型的优缺点3.1 同步阻塞IO3.2 同步非阻塞IO3.3 IO多路复用3.4 异步IO

网络IO模型一共介绍以下四种: 同步阻塞IO、同步非阻塞IO、IO多路复用和异步IO。

1.IO读写原理

文件的读写还是socket读写,在Java应用层开发,都是input或者output处理

用户程序进行IO操作,依赖于底层的IO实现,主要是**底层的 read&write两大系统调用:**

read系统调用指的是将数据从内核缓冲区复制到进程缓冲区write系统调用指的是把数据从进程缓冲区复制到内核缓冲区

这也就是说,上层程序的IO操作,实际上不是物理设备的级别的读写,而是缓存的复制。

1.1 内核缓冲区和进程缓存区

1.1.1 用户进程和操作系统

用户进程(N) -> 处于用户态(用户空间) 系统空间 -> 内核态

在用户态需要访问系统资源,借助于内核态,系统资源主要有:

1)cpu:控制一个程序的执行2)输入输出:一切都是流,所有流都是需要借助内核态3)进程管理:进程创建、销毁、阻塞、唤醒之间的调度4)内存:内存的申请、释放5)进程间通信:进程之间不能够相互访问内存,所以进程之间的交互需要通信,通信也是一种资源

以上所提到的系统资源,在用户进程中是无法被直接访问的,只有通过操作系统来访问,所以把操作系统访问这些资源的这一功能称之为系统调用

1.1.2 缓冲区的目的

为了减少频繁的系统IO调用

系统调用需要从用户态切换到内核态,切换之后保存用户进程的数据和状态等信息,结束调用之后需要回复之前的信息,为了减少这种损耗的时间,还有损耗性能的时间, 所以出现了缓冲区

有了缓冲区,操作系统使用read函数从内核缓冲区复制到进程缓冲区,write函数从进程缓冲区复制到内核缓冲区,只有缓冲区中的数据达到一定的量再IO的系统,提升性能.

用户程序的IO操作,大部分情况下,并没有进行实际的IO操作,而是进程缓冲区和内核缓冲区之间直接进行数据交换。

1.2 Java读写IO底层流程

如果是在Java服务器端,完成一个Socket请求和详情,完整的流程如下:

客户端请求:Linux通过网卡读取客户端请求数据,将数据读到内核缓冲区。获取请求数据:Java服务器通过read系统调用,从linux内核缓冲区读取数据,在送入Java进程缓冲区。服务端业务处理:Java服务器在自己的用户空间中处理客户端的请求。服务端返回数据:Java服务器完成处理后,构建好响应数据,将这些数据从用户缓冲区写入内核缓冲区。这里用到write系统调用。发送给客户端:Linux内核通过网络IO,将内核缓冲区中的数据写入网卡,网卡底层通信协议,会将数据发送给目标客户端。

2.四种主要的IO模型

2.1 基本概念

2.1.1 阻塞与非阻塞

阻塞IO:需要内核IO操作彻底完成之后,才返回到用户空间,执行用户的操作

非阻塞IO:不需要等待内核IO操作彻底完成之后,才返回到用户空间

阻塞/非阻塞指的是用户空间程序的执行状态

换句话说就是

阻塞:用户空间(调用线程)死等内核IO,这期间什么都不干。

非阻塞:用户空间(调用线程)拿到内核返回的状态就直接返回自己的空间,IO操作可以干就干,不可以干就去干别的事情。

2.1.2 同步与异步

同步IO:用户空间线程和内核空间线程的交互,用户空间线程是主动发起IO请求的一方,内核空间是被动接收的一方异步IO:与上面刚好相反,内核空间是主动发起IO请求的一方,用户空间的线程是被动接受方。

2.1.3 四种IO模型

同步阻塞IO(Blocking IO)同步非阻塞IO(Non-Blocking IO)IO多路复用(IO Multiplexing)异步IO(Asynchronous IO)

2.2 同步阻塞IO(Blocking IO)

在同步阻塞IO模型中,程序用IO调用开始,直到系统调用返回,在这段时间内,进程是阻塞的。直到返回成功后,应用程序开始处理用户空间的缓存区数据.主要分为两个阶段:

等待数据就绪:网络IO就是等待远端数据陆续到达;磁盘IO就是等到磁盘数据从磁盘读取到内核缓冲区。数据复制: 用户空间的程序没有权限直接读取内核缓冲区的数据(操作系统处于安全的考虑),因此内核与需要把内核缓冲区的数据复制一份到进程缓冲区。

同步阻塞IO模型如下图所示:

阻塞IO的特点是:在内核进行IO执行的两个阶段,用户线程都被阻塞了。

2.3 同步非阻塞IO(None Blocking IO)

将Socket设置为non-blocking,当前连接就变成了非阻塞IO。使用非阻塞模式的IO读写,叫做同步非阻塞IO(None Blocking IO),简称NIO模型。

在同步非阻塞IO模型中,会出现下面几种情况:

在内核缓冲区没有数据的情况下,系统调用会立即返回,返回一个调用失败的信息。这样请求就不会阻塞。用户线程需要不断的发起IO系统调用,测试内核数据是否准备好。在内核缓冲区有数据的情况下,是阻塞的。直到内核缓冲区的数据全部复制到进程缓冲区,系统调用成功。

同步非阻塞IO模型如下图所示: 同步非阻塞IO特点:程序需要不断的进行IO系统调用,轮询数据是否准备好,如果没有准备好,就继续轮询。

2.4 IO多路复用模型(IO Multiplexing)

在IO多路复用模型中,引入了一种新的系统调用select/epoll,查询IO的就绪状态。通过该系统调用可以监视多个文件描述符,一旦某个描述符就绪(一般是内核缓存区可读/可写),内核能够将就绪的状态返回给应用程序。随后,应用程序根据就绪的状态,进行相应的IO系统调用。

在IO多路复用模型中通过select/epoll系统调用,单个应用程序的线程,可以不断轮询成百上千的socket连接,当某个或者某些socket网络连接有IO就绪的状态,就返回对应的可以执行的读写操作。

IO多路复用模型如下图所示:

IO多路复用模型的特点:IO多路复用模型涉及两种系统调用,一种是就绪查询(select/epoll),一种是IO操作。

多路复用IO也需要轮询。负责就绪状态查询系统调用的线程,需要不断的进行select/epoll轮询,查找出达到IO操作就绪的socket连接。

2.5 异步IO模型(Asynchronous IO)

异步IO模型(Asynchronous IO)简称AIO,其基本流程为:用户线程通过系统调用,向内核注册某个IO操作。内核在整个IO操作(包括数据准备、数据复制)完成后,通知用户程序,执行后续的业务操作。

在异步IO模型中,整个内核的数据处理过程中,包括内核将数据从网络物理设备(网卡)读取到内核缓存区、将内核缓冲区的数据复制到用户缓冲区,用户程序都不需要阻塞。

异步IO模型如下图所示:

异步IO模型的特点:在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的。当内核的IO操作(等待数据和复制数据)全部完成后,内核会通知应用程序读数据。

3. 四种IO模型的优缺点

3.1 同步阻塞IO

优点:程序开发简单;在阻塞等待数据期间,用户线程挂起,不占用CPU资源。缺点:一个线程维护一个IO流的读写,在高并发应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会十分巨大,BIO模型在高并发场景下是不可用的。

3.2 同步非阻塞IO

优点:内核缓冲区没有数据的情况下,发起的系统调用不会阻塞,用户程序不会阻塞,实时性较好。缺点:需要不断地重复地发起IO调用,这种不断轮询,不断询问内核的方式,会占用CPU大量的时间,资源利用率比较低;在内核缓冲区有数据的情况下,也是阻塞的。NIO模型在高并发场景下是不可用的。

3.3 IO多路复用

优点:select/epoll可以同时处理成百上千的连接,与之前的一个线程维护一个连接相比,IO多路复用则不需要创建线程,也就不需要维护,从而减少系统开销.缺点: select/epoll系统调用,属于阻塞的模式。读写事件就绪之后,用户自己进行读写,这个读写过程也是阻塞的。

3.4 异步IO

优点:在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的。缺点:需要事件的注册,就需要操作系统。

🌸 相关推荐

到底帅不帅?关于陈冠希的颜值争议
bt365投注

到底帅不帅?关于陈冠希的颜值争议

📅 08-13 👀 6536
excel表格里减法怎么算
365足球

excel表格里减法怎么算

📅 08-24 👀 4095
蓝月传奇辅助
365足球

蓝月传奇辅助

📅 07-08 👀 618