高级IO技术详解:阻塞/非阻塞IO、多路复用与内存映射

高级IO技术详解:阻塞/非阻塞IO、多路复用与内存映射

关键词:阻塞IO 非阻塞IO select/poll/epoll mmap


一、阻塞IO vs 非阻塞IO

类型行为特点设置方式
阻塞IO- 读空管道阻塞
- 写满管道阻塞
默认模式
非阻塞IO- 读空文件返回 -1errno=EAGAIN
- 写满立即返回错误
1. open() 时加 O_NONBLOCK 标志
2. 通过 fcntl() 设置:
fcntl(fd, F_SETFL, O_NONBLOCK)

二、IO多路复用(解决高并发IO问题)

1. 状态机模型

将IO任务抽象为状态流转,例如读操作的状态转换:

STATE_R → read()├── 返回值 >0STATE_W (准备写)  ├── 返回值=0STATE_T (终止)  ├── errno=EAGAIN → 保持STATE_R  └── 其他错误    → STATE_E (异常)

2. select() 函数

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
  • 核心操作
    FD_ZERO(&set);     // 清空集合
    FD_SET(fd, &set);  // 添加fd
    FD_CLR(fd, &set);  // 移除fd
    FD_ISSET(fd, &set);// 检查fd是否就绪
    
  • 特点
    • 监听读/写/异常事件
    • 文件描述符上限:FD_SETSIZE (通常1024)
    • 每次调用需重新初始化fd_set
    • 超时控制可模拟sleepselect(0, NULL, NULL, NULL, &tv)

3. poll() 函数

struct pollfd {int fd;         // 监听的文件描述符short events;   // 监听的事件(POLLIN/POLLOUT)short revents;  // 返回的事件
};
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • 优势
    • 无文件描述符数量限制
    • 监听与返回结果分离(通过eventsrevents
    • 无需每次重新初始化结构体

4. epoll(Linux专属高性能模型)

int epoll_create(int size);  // 创建epoll实例
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); // 注册fd
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); // 等待事件
  • 核心优势
    • 事件驱动,无需遍历所有fd
    • 支持边缘触发(ET)与水平触发(LT)模式
    • 百万级并发支持

三、内存映射IO(mmap)

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • 功能:将磁盘文件直接映射到内存空间
  • 应用场景
    • 零拷贝文件读写
    • 大文件高效处理
    • 进程间共享内存

四、关键总结

技术适用场景性能瓶颈
select/poll低并发兼容性需求O(n) 轮询效率低
epollLinux高并发网络服务无上限,事件驱动O(1)
mmap大文件读写/进程通信减少内核-用户态拷贝开销

扩展思考

  1. 边缘触发(ET)模式下为何必须非阻塞IO?
  2. mmap 写回磁盘的同步机制(msync())如何保证数据安全?
  3. 异步IO(aio)与多路复用的本质区别?

原创声明:本文为博主原创笔记整理,转载请注明出处!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85584.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【无标题】拓扑对偶框架的严格性补完与哲学突破

拓扑对偶框架的严格性补完与哲学突破: 一、数学严格性补完:同调类守恒的解决方案 1.1 负系数问题的几何化修正 **问题本质**:当 $a_i$ 含负数时,曲率分配 $\kappa\frac{2\pi a_i}{A_{\text{max}}}$ 导致伪黎曼流形 **解决方案…

从0开始学习R语言--Day25--A/B测试 vs 多臂老虎机

通常在比较两个不同的方案对数据的影响时,我们会各拿50%的数据去进行对照试验,这样观测到的结果会最大程度地保留统计学上的特点。但实际上,并不是所有对比不同方案都要这样做,一来,我们需要等到两组实验都完全结束后&…

功耗高?加密弱?爱普特APT32F1023H8S6单片机 2μA待机+AES硬件加密破局

爱普特APT32F1023H8S6单片机深度解析 1. 产品定位 APT32F1023H8S6 是爱普特半导体(APT)推出的 32位高性能单片机,基于 ARM Cortex-M0内核,主打 高集成度、低功耗、高性价比,面向消费电子、工业控制和物联网领域。 2. …

【MFC】绘制自定义控件-显示图片(支持放大操作)

目录 一、CDC类(二级缓存)二、计算视口三、放大操作代码中初始化操作(方便以后cv) 一、CDC类(二级缓存) CDC类是设备上下文的核心类,它的作用是抽象化对图形输出设备(像屏幕、打印机…

在Proteus新工程中放置基本元器件

视频教程: [最详细]Proteus新建第一个工程与快捷键设置 操作步骤 1选择这个黄色的三角,然后点击旁边的P,开始找元件。 2点开P后,呈现如下图界面,我们在Keyword栏中,输入stm32,然后他会自动出现对应的元件&…

PRUD币推动健康数据资产化,开启Web3隐私金融新时代

在全球健康科技与数据主权浪潮下,PRUD币(Prudential Utility & Data Token)正成为Web3健康金融领域中的重要通证。项目通过链上身份绑定、健康行为证明、隐私计算与NFT机制,为用户打造了“健康数据资产化”的创新路径&#xf…

Mac 安装 finalshell

1.下载 地址:FinalShell官网 第一个进入选择对应的 mac 版本下载。 下一步下一步完成安装。 2.链接虚拟机,点击图示文件夹 点击新建链接,新建 SSH 链接 3.去 vmware 中查询 Linux 系统的 IP,使用 ip addr 命令或者 ifconfig 命令皆可。 ip…

Javaweb - 2 HTML

目录 HTML 入门 1. HTML & CSS & JavaScript 的作用 2. 什么是 HTML 3. 什么是超文本 4. 什么是标记语言 5. HTML 基本结构 6. HTML 概念词汇解释 7. HTML 的一些语法规则 8. 开发工具 VsCode 安装插件: 常见设置: HTML 常见标签 …

CWGAN-GP 增强型 CAE 在非 IID 数据集中用于 5G-NR 干扰检测

抽象 在不断扩大的 5G-NR 无线蜂窝网络领域中,无线干扰攻击作为安全攻击普遍存在,损害了接收信号的质量。我们通过将加性高斯白噪声 (AWGN) 合并到真实世界的同相和正交 (I/Q) OFDM 数据集中来模拟干扰环境…

JavaEE-Spring-Web-Mvc

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC". Servlet 是⼀种实现动态⻚⾯的技术. 准确来讲Serv…

Linux从入门到入门

系统教程学习类 Ubuntu 从入门到精通 系统页面/基本操作类 Ubuntu20.04终端固定终端到左边的导航栏_ubuntu20.04设置菜单固定-CSDN博客Ubuntu 20.04 系统5分钟后老是自动锁屏_修改锁屏时间-CSDN博客 命令类 拷贝:将 下载 文件夹里的.sh文件 复制到opt目录下 sudo cp…

AI自动生成Git提交信息-git AI Commit

在现代软件开发中,编写清晰且一致的Git提交信息对于维护项目历史和促进团队协作至关重要。然而,为每次变更手动撰写描述性提交信息可能耗时,尤其是处理复杂差异或大型项目时。AI Commit 是一个利用AI分析Git差异并生成符合Conventional Commi…

【三大前端语言之一】样式:CSS详解

【三大前端语言之一】样式:CSS详解 在了解完HTML的有关知识后,我们应该知道,一个网页光有框架还不行,必须还得有装饰它的样式。就好比房子的结构搭好了,但如果没有油漆、没有窗帘、没有家具,就无法真正展现…

Spring AI 聊天记忆功能实战(一):从接口设计到生产实践

Spring AI 聊天记忆功能实战(一):从接口设计到生产实践 在构建AI对话应用时,聊天记忆管理及存储是实现连贯上下文交互的关键组件。而大模型(LLM)本质上是无状态的,这意味着它们不会保留历史交互…

Element Plus 对话框 el-dialog 和 抽屉 el-drawer 的使用注意项(使用 div 包裹)

总结:使用 div 包裹!!! 详细说明: 对话框 el-dialog 或 抽屉 el-drawer 样式的设置说明: 要想有效设置 el-dialog 或 el-drawer 的样式,需确保 el-dialog 或 el-drawer 的上层不是template&am…

【python】简单演示 gateway、service、client的工作原理

gateway 看起来主要是做协议转换的A gateway is a network node that acts as an entrance and exit point, connecting two networks that use different protocols. It allows data to flow between these networks, essentially acting as a translator between different c…

数据仓库面试题合集⑥

实时指标体系设计 + Flink 优化实战:面试高频问题 + 项目答题模板 面试中不仅会问“你做过实时处理吗?”,更会追问:“实时指标体系是怎么搭建的?”、“你们的 Flink 稳定性怎么保证?” 本篇聚焦实时指标体系设计与 Flink 优化场景,帮你答出架构设计力,也答出调优实战感…

Vue + AbortController 请求取消弹窗 hook 封装

背景 实际业务开发场景中,往往存在有些大数据请求的需求,一旦请求发起加载遮罩后用户就无法操作了,直接尬住,所以提供一个支持取消查询的功能还是很有必要的,为了在全业务接口都能使用封装一个hook。 ✋为什么要用 A…

数据结构相关

1 问题 如何辨析数据对象和数据结构?如何设计多种储存结构以及他们特性有什么?内存条和硬盘的区别? 2 方法 明晰俩者的定义数据对象是性质相同的有限个数据元素的集合,他是数据的一个子集。数据结构是指所涉及的数据元素的集合以及…

MacOS内存管理-删除冗余系统数据System Data

文章目录 一、问题复现二、解决思路三、解决流程四、附录 一、问题复现 以题主的的 Mac 为例,我们可以看到System Data所占数据高达77.08GB,远远超出系统所占内存 二、解决思路 占据大量空间的是分散在系统中各个位置Cache数据; 其中容量最…