linux五种网络模型

1. Unix网络编程中的五种IO模型

  • 阻塞IO(Blocking IO )
  • 非阻塞IO(NoneBlocking IO )
  • IO多路复用(IO multiplexing )
  • 信号驱动IO(signal driven IO)
  • 异步IO(asynchronous IO)

由于信号驱动IO不常见,因此主要学习其他的四种。

2. IO事件

2.1 IO发生的关联对象

  • 应用程序(app)
  • 系统内核(kernel)

2.2 发生的过程

  1. 内核等待数据,并准备收集数据
  2. 将数据从内核中拷贝到用户进程中

3. 网络模型

3.1 阻塞IO

在linux中,默认情况下所有的socket都是blocking模型,一个典型的读操作大致的流程如下:

在这里插入图片描述
当用户进程调用了recvfrom这个系统函数后,内核就开始了IO的第一阶段——准备数据。对于网络IO来说,很多时候数据在一开始是没有到达的(比如说一个udp数据包),内核等待收集完一个完整的udp数据包。而在用户进程测,这个进程会被阻塞。当内核在一直等待数据并且准备好数据了,内核就会把数据从内核态拷贝到用户进程的内存中,然后内核返回结果,用户进程才能解除block状态,重新运行起来。

所以说,阻塞IO就是在IO执行的两个阶段都被阻塞。

3.2 非阻塞IO

linux下可以通过设置socket使其变成非阻塞socket,当对一个非阻塞socket执行读操作时,大致流程如下:
在这里插入图片描述
从图中可以看出,当用户进程发出recvfrom这个系统调用后,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个结果(no datagram ready)。从用户进程角度讲 ,它发起一个操作后,并没有等待,而是马上就得到了一个结果。用户进程得知数据还没有准备好后,它可以每隔一段时间再次发送recvfrom操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

所以,用户进程其实是需要不断的主动询问kernel数据好了没有。

3.3 IO多路复用

I/O多路复用(multiplexing)是网络编程中最常用的模型,像我们最常用的select、epoll都属于这种模型。以select为例:
在这里插入图片描述
看起来它与blocking I/O很相似,两个阶段都阻塞。但它与blocking I/O的一个重要区别就是它可以等待多个数据报就绪(datagram ready),即可以处理多个连接。这里的select相当于一个“代理”,调用select以后进程会被select阻塞,这时候在内核空间内select会监听指定的多个datagram (如socket连接),如果其中任意一个数据就绪了就返回。此时程序再进行数据读取操作,将数据拷贝至当前进程内。由于select可以监听多个socket,我们可以用它来处理多个连接。

在select模型中每个socket一般都设置成non-blocking,虽然等待数据阶段仍然是阻塞状态,但是它是被select调用阻塞的,而不是直接被I/O阻塞的。select底层通过轮询机制来判断每个socket读写是否就绪。

当然select也有一些缺点,比如底层轮询机制会增加开销、支持的文件描述符数量过少等。为此,Linux引入了epoll作为select的改进版本。

3.4 异步IO

异步I/O在网络编程中几乎用不到,在File I/O中可能会用到。

在这里插入图片描述
这里面的读取操作的语义与上面的几种模型都不同。这里的读取操作(aio_read)会通知内核进行读取操作并将数据拷贝至进程中,完事后通知进程整个操作全部完成(绑定一个回调函数处理数据)。读取操作会立刻返回,程序可以进行其它的操作,所有的读取、拷贝工作都由内核去做,做完以后通知进程,进程调用绑定的回调函数来处理数据。

4. 总结

4.1 阻塞和非阻塞

  1. 阻塞调用会一直等待远程数据就绪再返回,即阶段1阻塞调用,直到读取结束
  2. 非阻塞无论在什么情况下都会立即返回,通过频繁的主动询问拷贝内核中的数据

4.2 同步和异步

  1. 同步方法会一直阻塞进程,直到IO操作完成,相当于阶段1,阶段2都会阻塞调用者。
  2. 异步方法不会阻塞调用者进程,阶段1和阶段2都不会阻塞进程

4.3 五种IO模型小结

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值