关于netty:浅聊Linux的五种IO模型

43次阅读

共计 2573 个字符,预计需要花费 7 分钟才能阅读完成。

微信搜寻:码农 StayUp
主页地址:https://gozhuyinglong.github.io
源码分享:https://github.com/gozhuyinglong/blog-demos

在日常 Coding 中,多多少少都会接触到网络 IO,就会想要深刻理解一下。看了很多文章,总是云里雾里的感觉,直到读了《UNIX 网络编程 卷 1:套接字联网 API》中的介绍后,才恍然大悟。这里就给大家分享一下,如有不对,欢送指出。

1. 概念阐明

为了便于了解前面的内容,咱们先来理解一些概念。

1.1 Socket

Socket 中文翻译为套接字,是计算机网络中过程间进行双向通信的端点的形象。一个 Socket 代表了网络通信的一端,是由操作系统提供的过程间通信机制。

  • 在操作系统中,通常会为应用程序提供一组利用程序接口,称为 Socket 接口(Socket API)。应用程序能够通过 Socket 接口,来应用网络 Socket,以进行数据的传输。
  • 一个 Socket 由 IP 地址和端口组成,即:Socket 地址 = IP 地址 : 端口号。
  • 在同一台计算机上,TCP 协定与 UDP 协定能够同时应用雷同的端口(Port),而互不烦扰。
  • 要想实现网络通信,至多须要一对 Socket,其中一个运行在客户端,称之为 Client Socket;另一个运行在服务器端,称之为 Server Socket。
  • Socket 之间的连贯过程能够分为三个步骤:(1)服务器监听;(2)客户端连贯;(3)连贯确认。

1.2 Socket 缓冲区

每个 Socket 被创立后,都会在内核中调配两个缓冲区:输出缓冲区和输入缓冲区。

  • 通过 Socket 发送数据并不会立刻向网络中传输数据,而是先将数据写入到输入缓冲区中,再由 TCP 协定将数据从输入缓冲区发送到指标主机。
  • 通过 Socket 接收数据也是如此,也是从输出缓冲区中读取数据,而不是间接从网络中读取。

1.3 用户空间、内核空间、零碎调用

操作系统的过程空间能够分为用户空间(User Space)和内核空间(Kernel Space),它们须要不同的执行权限。

  • 大多数零碎交互式操作须要在内核空间中运行,比方设施 IO 操作。
  • 咱们的利用程序运行在用户空间,是不具备零碎级的间接操作权限的。如果应用程序想要拜访系统核心性能,必须通过零碎调用(System Call)来实现。比方调用 recv() 函数,会将输出缓冲区中的内容拷贝到用户缓冲区。
  • 零碎调用运行在内核空间,是操作系统为应用程序提供的接口。

上面列举了一些 Linux 操作系统中的零碎调用接口(局部函数前面章节会用到):

  • socketcall socket 零碎调用
  • socket 建设 socket
  • bind 绑定 socket 到端口
  • connect 连贯近程主机
  • accept 响应 socket 连贯申请
  • send 通过 socket 发送信息
  • sendto 发送 UDP 信息
  • recv 通过 socket 接管信息
  • recvfrom 接管 UDP 信息
  • listen 监听 socket 端口
  • select 对多路同步 IO 进行轮询
  • shutdown 敞开 socket 上的连贯
  • sigaction 设置对指定信号的解决办法

1.4 阻塞与非阻塞

阻塞与非阻塞,用于形容调用者在期待返回后果时的状态。

  • 阻塞:调用者发动申请后,会始终期待返回后果,这期间以后线程会被挂起(阻塞)。
  • 非阻塞:调用者发动申请后,会立即返回,以后线程也不会阻塞。该调用不会立即失去后果,调用者须要定时轮询查看解决状态。

1.5 同步与异步

而同步与异步,用于形容调用后果的返回机制(或者叫通信机制)。

  • 同步:调用者发动申请后,会始终期待返回后果,即由调用者被动期待这个调用后果。
  • 异步:调用者发动申请后,会立即返回,但不会立即失去这个后果,而是由被调者在执行完结后被动告诉(如 Callback)调用者。

2. 五种 IO 模型

IO 模型是指:用什么样的通道或者说是通信模式进行数据的传输,这很大程序上决定了程序通信的性能。

Linux 零碎为咱们提供五种可用的 IO 模型:阻塞式 IO 模型、非阻塞式 IO 模型、IO 多路复用模型、信号驱动 IO 模型和异步 IO 模型。

2.1 阻塞式 IO 模型

阻塞式 IO(Blocking IO):利用过程从发动 IO 零碎调用,至内核返回胜利标识,这整个期间是处于阻塞状态的。

2.2 非阻塞式 IO 模型

非阻塞式 IO(Non-Blocking IO):利用过程能够将 Socket 设置为非阻塞,这样利用过程在发动 IO 零碎调用后,会立即返回。利用过程能够轮询的发动 IO 零碎调用,直到内核返回胜利标识。

2.3 IO 多路复用模型

IO 多路复用(IO Multiplexin):能够将多个利用过程的 Socket 注册到一个 Select(多路复用器)上,而后应用一个过程来监听该 Select(该操作会阻塞),Select 会监听所有注册进来的 Socket。只有有一个 Socket 的数据筹备好,就会返回该 Socket。再由利用过程发动 IO 零碎调用,来实现数据读取。

2.4 信号驱动 IO 模型

信号驱动 IO(Signal Driven IO):能够为 Socket 开启信号驱动 IO 性能,利用过程需向内核注册一个信号处理程序,该操作并立刻返回。当内核中有数据筹备好,会发送一个信号给利用过程,利用过程便能够在信号处理程序中发动 IO 零碎调用,来实现数据读取了。

2.5 异步 IO 模型

异步 IO(Asynchronous IO):利用过程发动 IO 零碎调用后,会立刻返回。当内核中数据齐全筹备后,并且也复制到了用户空间,会产生一个信号来告诉利用过程。

3. 总结

从上述五种 IO 模型能够看出,利用过程对内核发动 IO 零碎调用后,内核会通过两个阶段来实现数据的传输:

  • 第一阶段:期待数据。即利用过程发动 IO 零碎调用后,会始终期待数据;当有数据传入服务器,会将数据放入内核空间,此时数据筹备好。
  • 第二阶段:将数据从内核空间复制到用户空间,并返回给应用程序胜利标识。

前四种模型的第二阶段是雷同的,都是处于阻塞状态,其次要区别在第一阶段。而异步 IO 模型则不同,利用过程在这两个阶段是齐全不阻塞的。

IO 模型第一阶段第二阶段
阻塞式 IO阻塞阻塞
非阻塞式 IO非阻塞阻塞
IO 多途程复用阻塞(Select)阻塞
信号驱动式 IO异步阻塞
异步 IO异步异步

参考资料

  • UNIX 网络编程 卷 1:套接字联网 API

举荐浏览

  • 36 张图详解网络基础知识
  • 75 张图带你理解网络设备、网络地址布局、动态路由、实战演练

正文完
 0