惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
小众软件
小众软件
有赞技术团队
有赞技术团队
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MyScale Blog
MyScale Blog
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
WordPress大学
WordPress大学
J
Java Code Geeks
罗磊的独立博客
V
Visual Studio Blog
雷峰网
雷峰网
H
Help Net Security
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
F
Fortinet All Blogs

Liu Zijian's Blog | 一个技术博客

使用Certbot自动续签HTTPS证书 使用Filebeat采集Nginx日志到ES Python的协程 Python中的异常 Python中的类和对象 Python的函数 Python的数据结构,推导式、迭代器和生成器 Spring AI集成多模态模型 LangChain4j多模态 LangChain Tools工具使用 Python中的模块和包 Python全局环境和虚拟环境(venv) LangChain Prompt提示词工程 LangChain4j Tools工具使用 基于Dify搭建AI智能体应用 LangChain4j RAG检索增强生成 Spring AI实现MCP Server Spring AI集成MCP Client LangChain4j Prompt提示词工程 Spring AI使用知识库增强对话功能 Spring AI实现一个智能客服 Spring AI实现一个简单的对话机器人 实现MinIO数据的每日备份 自己实现一个DNS服务 简单理解AI智能体 大模型和大模型应用 LangChain开篇 LangChain4j开篇 一个解析Excel2007的POI工具类 DataPermissionInterceptor源码解读
浅谈Linux(Unix)的I/O模型
Liu Zijian · 2023-03-30 · via Liu Zijian's Blog | 一个技术博客

一、引言

IO指的是输入输出,在Linux操作系统中,共有5种IO模型,分别是:

  • Blocking I/O (同步,阻塞I/O)
  • Nonblocking I/O (同步,非阻塞I/O)
  • I/O multiplexing (select and poll,多路复用,同步)
  • Signal driven I/O (SIGIO,信号驱动,同步)
  • Asynchronous IO (the POSIX aio functions,异步I/O模型)

Linux I/O的数据处理,存在两个阶段:

  1. 等待阶段:DMA控制器从磁盘或网卡等,读取数据,将数据读取到内核空间。
  2. 拷贝阶段:将数据从内核空间拷贝到用户空间。

二、五种模型

2.1 Blocking I/O

阻塞I/O模型,等待数据和拷贝数据的过程,都是阻塞的

2.2 Nonblocking I/O

非阻塞I/O模型,会采用while不断尝试数据读取,没有读到数据立刻返回false,读到了就结束while,将读到的数据从内核缓冲区拷贝到用户空间中,其中while过程非常快,因此不会阻塞

2.3 I/O multiplexing

多路复用I/O模型,类似阻塞I/O,不同的是用了两次系统调用,也是尝试读取数据,等准备好后再拷贝到用户空间,不同于Blocking I/O,I/O multiplexing基于Linux的select调用,多个线程的IO可以注册在一个管道上,统一和内核交互,哪个数据准备好了,就把哪一个的数据复制到用户空间。

2.4 Signal driven I/O

信号驱动的I/O模型,是非阻塞的,发起sigaction系统调用后,立刻返回,等数据读取完成后,Linux系统会主动发送一个sigio的信号给进程,进程监听到信号后,再去调用系统调用获取数据。

2.5 Asynchronous IO

异步I/O模型,和Signal driven I/O很像,不同的是将IO请求发送给内核后,完全由内核完成拷贝,内核完成操作后,会告诉进程拷贝已完成。