• 网络 IO 演变过程


    在互联网中提起网络,我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现,脱离不了网络 IO 的选择,因此本文作为一篇个人学习的笔记,特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型

    1.网络 IO 的发展

    在本节内容中,我们将一步一步介绍网络 IO 的演变发展过程。介绍完发展过程后,再对网络 IO 中几组容易混淆的概念进行对比、分析。

    1.1 网络 IO 的各个发展阶段

    通常,我们在此讨论的网络 IO 一般都是针对 linux 操作系统而言。网络 IO 的发展过程是随着 linux 的内核演变而变化,因此网络 IO 大致可以分为如下几个阶段:

    1. 阻塞 IO(BIO)
    2. 非阻塞 IO(NIO)
    3. IO 多路复用第一版(select/poll)
    4. IO 多路复用第二版(epoll)
    5. 异步 IO(AIO)

    而每一个阶段,都是因为当前的网络有一些缺陷,因此又在不断改进该缺陷。这是网络 IO 一直演变过程中的本质。下面将对上述几个阶段进行介绍,并对每个阶段的网络 IO 解决了哪些问题、优点、缺点进行剖析。

    1.2 网络的两个阶段

    在网络中,我们通常可以将其广义上划分为以下两个阶段:

    第一阶段:硬件接口到内核态
    第二阶段:内核态到用户态

    本人理解:我们通常上网,大部分数据都是通过网线传递的。因此对于两台计算机而言,要进行网络通信,其数据都是先从应用程序传递到传输层(TCP/UDP)到达内核态,然后再到网络层、数据链路层、物理层,接着数据传递到硬件网卡,最后通过网络传输介质传递到对端机器的网卡,然后再一步一步数据从网卡传递到内核态,最后再拷贝到用户态。

    1.3 阻塞 IO 和非阻塞 IO 的区别

    根据 1.2 节的内容,我们可以知道,网络中的数据传输从网络传输介质到达目的机器,需要如上两个阶段。此处我们把从硬件到内核态这一阶段,是否发生阻塞等待,可以将网络分为阻塞 IO非阻塞 IO。如果用户发起了读写请求,但内核态数据还未准备就绪,该阶段不会阻塞用户操作,内核立马返回,则称为非阻塞 IO。如果该阶段一直阻塞用户操作。直到内核态数据准备就绪,才返回。这种方式称为阻塞 IO。

    因此,区分阻塞 IO 和非阻塞 IO 主要看第一阶段是否阻塞用户操作。

    1.4 同步 IO 和异步 IO 的区别

    从前面我们知道了,数据的传递需要两个阶段,在此处只要任何一个阶段会阻塞用户请求,都将其称为同步 IO,两个阶段都不阻塞,则称为异步 IO。

    在目前所有的操作系统中,linux 中的 epoll、mac 的 kqueue 都属于同步 IO,因为其在第二阶段(数据从内核态到用户态)都会发生拷贝阻塞。 而只有 windows 中的 IOCP 才真正属于异步 IO,即 AIO。

    2.阻塞 IO

    在本节,我们将介绍最初的阻塞 IO,阻塞 IO 英文为 blocking IO,又称为 BIO。根据前面的介绍,阻塞 IO 主要指的是第一阶段(硬件网卡到内核态)。

    2.1 阻塞 IO 的概念

    阻塞 IO,顾名思义当用户发生了系统调用后,如果数据未从网卡到达内核态,内核态数据未准备好,此时会一直阻塞。直到数据就绪,然后从内核态拷贝到用户态再返回。具体过程可以参考 2.2 的图示。

    2.2 阻塞 IO 的过程

    2.3 阻塞 IO 的缺点

    在一般使用阻塞 IO 时,都需要配置多线程来使用,最常见的模型

  • 相关阅读:
    软考高级系统架构设计师系列论文真题五:论软件架构评估
    java之《图书管理系统》庖丁解牛
    Pickle反序列化学习
    Scala技术与架构-1
    QT实现截屏
    css制作瀑布流布局
    W6_二叉树
    linux 下使用 sar -n 命令查看Kbps、bps的带宽速率
    Spring Cloud Alibaba 概述
    拓扑关系如何管理?
  • 原文地址:https://blog.csdn.net/weixin_52183917/article/details/127907088