【I/O】Unix IO 介绍

IO 模型(一)

Unix IO

一个输入操作共包含两个阶段:

  • 等待数据准备好
  • 从内核将数据复制到进程

对于一个套接字上的输入操作,通常第一步是等待数据从网络中到达,当数据到达时,先将数据复制到内核缓冲区中,第二步就是将数据从内核缓冲区中复制到应用进程的缓冲区中

Unix IO 有五个模型:

  • 阻塞式 IO
  • 非阻塞式 IO
  • IO 多路复用(select 和 poll)
  • 信号驱动 IO
  • 异步 IO(AIO)

阻塞式 IO

阻塞式 IO 的阻塞说的是,在进行 IO 操作时,应用进程将会阻塞,直到数据被复制到进程缓冲区中才返回。

在阻塞式 IO 中,应用进程阻塞时并不意味着其他程序也被阻塞,其他的程序依旧可以运行,因此阻塞式 IO 在阻塞过程中不消耗 CPU 资源,这种模型的效率会比较高。

下面的代码中,recvfrom 用于接收 Socket 传来的数据,并复制到应用进程缓冲区。这里的 recvfrom 当做系统调用

c 复制代码
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

非阻塞式 IO

非阻塞式 IO 的非阻塞是,在进行 IO 操作时,应用进程不会阻塞,会系统调用定时轮询检查数据是否准备好,若没准备好内核会返回一个错误码,这种方式 CPU 会处理更多的系统调用,因此效率会比较低

IO 多路复用

使用 select 或是 poll 等待数据,并且可以等待多个套接字中任何一个变为可读,这个过程会进行阻塞,当某个套接字可读时返回,在使用 recvfrom 进行复制

IO 多路复用可以让单个进程有处理多个 IO 事件的能力,例如,一个 Web 服务器没有多路复用,每一个 Socket 连接都要创建一个线程去处理,如果同时有几万个连接,那么就需要创建相同数量的线程。

信号驱动 IO

应用进程使用 sigaction 进行系统调用,内核立即返回,应用进程可以继续执行,也就是说,在内核等待数据到达阶段应用进程是非阻塞的,可以继续执行。内核在数据到达后,会向应用进程发送 信号 ,应用进程在收到信号后,会在信号处理程序中调用 recvfrom 进行系统调用将数据复制到应用进程。

异步 IO

应用程序进行 aio_read 系统调用,立即返回,应用进程继续执行不会阻塞,内核在完成所有操作之后,向进程发送信号,异步 IO 的信号通知应用进程 IO 完成,而信号驱动 IO 的信号是通知应用进程可以开始 IO

同步 IO 与 异步 IO

  • 同步 IO:应用进程在调用 recvfrom 时会阻塞

  • 异步 IO:不会阻塞

阻塞式 IO、非阻塞式IO、IO多路复用、信号驱动 IO 都是同步 IO,虽然非阻塞式 I/O 和信号驱动 I/O 在等待数据阶段不会阻塞,但是在之后的将数据从内核复制到应用进程这个操作会阻塞。

相关推荐
小突突突2 小时前
模拟实现Java中的计时器
java·开发语言·后端·java-ee
web137656076432 小时前
Scala的宝藏库:探索常用的第三方库及其应用
开发语言·后端·scala
闲猫2 小时前
go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值
开发语言·后端·golang·反射
LUCIAZZZ3 小时前
EasyExcel快速入门
java·数据库·后端·mysql·spring·spring cloud·easyexcel
Asthenia04123 小时前
依托IOC容器提供的Bean生命周期,我们能在Bean中做些什么?又能测些什么?
后端
Ase5gqe3 小时前
Spring中的IOC详解
java·后端·spring
小万编程3 小时前
基于SpringBoot+Vue奖学金评比系统(高质量源码,可定制,提供文档,免费部署到本地)
java·spring boot·后端·毕业设计·计算机毕业设计·项目源码
南雨北斗4 小时前
ThinkPHP6控制器方法返回的 Content-Type类型
后端
CryptoRzz4 小时前
springboot接入方式对接股票数据源API接口
后端
Json_4 小时前
4. 使用springboot做一个音乐播放器软件项目【数据库表的创建】
java·后端·产品