当前位置: 首页 > backend >正文

应用程序 I/O 接口

        应用程序 I/O 接口是用户/应用与操作系统 I/O 子系统交互的桥梁,根据设备类型(字符、块、网络)提供不同接口,并支持阻塞/非阻塞模式。

一、I/O接口分类

1、字符设备接口

  • 特点:以字符为单位传输数据(如键盘、打印机),传输速率低、不可寻址,采用中断驱动方式 。
  • 操作
    • get/put:通过缓冲区顺序存取字符。
    • in-control:通用指令处理设备差异(参数对应具体功能)。
  • 独占性:需通过打开/关闭操作实现互斥访问 。

 

2、块设备接口

  • 特点:以数据块为单位(如磁盘),传输速率高、可寻址,常用DMA方式 。
  • 功能
    • 抽象命令映射:将读/写等命令转换为设备操作。
    • 线性编址:隐藏磁盘二维结构(磁道号+扇区号→线性序列) 。
  • 内存映射:通过虚拟内存地址访问磁盘文件,简化编程(如mmap系统调用) 。

 

3、网络设备接口

  • 特点:通过套接字(Socket)实现网络通信,支持远程连接和数据传输 69。
  • 操作:创建套接字、绑定地址、监听/连接、发送/接收数据

4、块设备 vs 字符设备接口

  • 块:支持随机读写、内存映射(适合文件、数据库)。
  • 字符:顺序读写、ioctl 配置(适合终端、串口)。

 

 二、阻塞 vs 非阻塞 I/O

模式

工作原理

优点

缺点

适用场景

阻塞 I/O

调用 read/write

后,进程挂起,直至 I/O 完成(如磁盘读数据到内存)。

简单(编程容易),无 CPU 空转。

进程阻塞期间不工作(浪费 CPU 时间,并发低)。

单任务、低速设备(如串口读取)。

非阻塞 I/O

调用后立即返回,进程轮询 fd

状态(通过 select/poll/epoll

高效查询)。

进程不阻塞,可同时处理多 fd

(高并发)。

需额外轮询逻辑,复杂度高。

网络服务器(同时处理多客户端连接)。

 


三、补充

1、同步与异步I/O

  • 同步I/O:包括阻塞和非阻塞,需等待I/O操作完成(如read/write) 。
  • 异步I/O:内核完成操作后通知进程,无需等待(如aio_read) 。

2、I/O多路复用

  • 机制:通过select/poll/epoll监控多个I/O事件,避免轮询开销

 


核心考点 📌

1、ioctl 作用

  • 字符设备定制功能(如设置终端密码输入模式、获取网卡 MAC 地址)。

 

2、内存映射优势

  • 减少 read/write 系统调用开销(数据直接在内存,例:数据库读页映射后直接操作内存)。

 

3、非阻塞实现

  • O_NONBLOCK 标志 + select/poll/epoll(Linux epoll 高性能原因:内核事件通知,无需用户层轮询所有 fd)。

总结

        应用程序 I/O 接口是“设备特性”与“编程便利”的平衡:字符/块/网络接口适配设备差异,阻塞/非阻塞模式满足不同并发需求。理解这些接口,能解释为何 read() 对文件和网络套接字行为不同(底层接口逻辑差异),以及如何优化高并发系统(选非阻塞 + epoll)。

一句话记忆:字符按序块随机,网络套接连远程,阻塞简单非阻塞忙,模式选择看场景! ✨

 

http://www.xdnf.cn/news/16348.html

相关文章:

  • 【MySQL 数据库】MySQL基本查询(第二节)
  • 系统性学习C语言-第二十三讲-文件操作
  • 谷歌无法安装扩展程序解决方法(也许成功)
  • Kubernetes 与 Docker的爱恨情仇
  • STM32-定时器的基本定时/计数功能实现配置教程(寄存器版)
  • 【工具】好用的浏览器AI助手
  • 用unity开发教学辅助软件---幼儿绘本英语拼读
  • 【深度学习新浪潮】什么是GUI Agent?
  • java面试复习(spring相关系列)
  • 【机器学习-2】 | 决策树算法基础/信息熵
  • 【RocketMQ】一分钟了解RocketMQ
  • Earth靶机攻略
  • linux线程概念和控制
  • 字符串缓冲区和正则表达式
  • Mingw 与MSYS2 与Cygwin区别
  • Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
  • 基于深度学习的胸部 X 光图像肺炎分类系统(七)
  • 凝思系统6.0.80安装chorme,亲测可用
  • 如何创建或查看具有 repo 权限的 GitHub 个人访问令牌(PAT)
  • mount: /mnt/sd: wrong fs type, bad option, bad superblock on /dev/mmcblk1
  • FitCoach AI:基于React+CloudBase的智能健身教练应用开发全解析
  • 缓存一致性:从单核到异构多核的演进之路
  • Android Jetpack 组件库 ->WorkManager
  • Linux系统架构核心全景详解
  • Unity 实现帧率(FPS)显示功能
  • 11Linux文件压缩与链接实战技巧
  • 深入解析YARN中的FairScheduler与CapacityScheduler:资源分配策略的核心区别
  • Python 数据分析(二):Matplotlib 绘图
  • 小白成长之路-部署Zabbix7(二)
  • 【GoLang#3】:数据结构(切片 | map 映射)