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

IO模型有哪些?

什么是IO,IO就是输入输出,拿谁是输入谁是输出呢?

计算机的IO
计算机的主体分为输入设备和输出设备,输入设备是向计算机输入数据和信息的设备,键盘和鼠标都属于输入设备;输出设备是计算机硬件系统的终端设备,用于接收计算机数据的输出显示,一般显示器和打印机都属于输出设备。
例如鼠标敲几下键盘,把指令数据传给主机,主机通过运算后,把返回的数据信息输出到显示器。
鼠标,显示器这只是直观表面的输入输出。只要是涉及计算机核心与其他设备间数据迁移的过程就是IO

一、阻塞IO
它的特点是在内核将数据准备好之前,系统调用会一直等待着。
二、非阻塞IO
非阻塞IO:如果内核还未将数据准备好,系统调用仍然会直接返回,并返回错误码EWOULDBLOCK
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询。这对CPU来说是较大的浪费,一般只有特定场景才使用。

  • 阻塞调用是指用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。
    非阻塞调用是指在不能立刻得到结果之前,该调用不会阻塞当前线程。

三、信号驱动IO
内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。
工作流程:
1.注册信号处理程序;应用进程首先使用sinaction系统调用,建立针对特定信号的信号处理程序。这一步进程会告知内核,当特定的IO事件发生时,应该触发哪个信号处理函数。(就像提前告知你哪把锁用哪把钥匙开
2.设置文件描述符:应用进程需要将相关文件描述符设置为信号驱动IO模式,并指定该文件描述符的属主。这一步确保内核知道当IO事件就绪时,应该向哪个进程发送信号。(告诉内核这个IO资源归我管了,事件就绪后把SIGIO信号发给我这个进程)
3.内核等待数据:完成上述设置后,应用进程可以干别的事情了,内核开始等待数据到达。当数据准备好时,内核会向应用进程发送预先设置好的信号。
4.信号处理:应用进程接收到信号后,会暂停当前正在执行的任务,转而执行之前注册的信号处理程序。在信号处理程序中,通常会调用函数来读取数据。在数据从内核拷贝到用户空间的应用到应用缓冲区期间,进程会阻塞,直到数据拷贝完成
5.处理数据:数据读取完成后,信号处理程序执行结束,进程恢复之前被暂停的任务,或者开始对读取到的数据进行处理。

四、多路复用
IO多路复用允许单个线程/进程同时监控多个文件描述符的IO事件,并在任一描述符就绪时进行读写操作。是高并发的核心技术之一。是真正的高校IO处理机制,它在单位事件内增加了传输效率,而其他四个只是在利用等待事件而已,并没有提高IO效率。
核心思想
1.统一监控:通过系统调用一次性注册多个文件描述符,由内核通知哪些描述符已就绪。
2.避免阻塞轮询:无需为每个描述符创建独立线程,节省资源。
3.单线程高并发:一个线程可以处理成千上万的连接(如Nginx,Redis的底层模型)

五、异步IO
核心思想是发起IO请求后立即返回,由内核完成所有操作,并通过回调或信号通知进程结果。不需要等待IO完成即可继续执行其他任务

http://www.jsqmd.com/news/570736/

相关文章:

  • WinDiskWriter:突破macOS环境限制的Windows启动盘制作工具
  • 苹果设备iCloud激活锁绕过终极指南:applera1n工具全解析
  • Ubuntu启动缓慢的深度诊断:从swap分区到systemd优化
  • FPGA开发者的HDL Coder速成课:5个Simulink技巧让你的Verilog代码更高效
  • 深度解析:高性能MoE代码智能模型部署与优化实践
  • 实战指南|OpenWrt磁盘扩容全流程解析与避坑技巧
  • 手把手教你用AI搞定独立游戏美术:从DeepSeek写方案到Unity导入模型的完整流程
  • 3大核心技术揭秘:OpenCore Legacy Patcher如何让老旧Mac焕发新生
  • CT三维重建实战:从原理到Feldkamp算法实现(附Python代码)
  • 实战:基于uiautomator2的拼多多APP商品数据自动化采集方案
  • 别再手动扩容了!用K8s Horizontal Pod Autoscaler (HPA) 自动伸缩你的Spring Boot微服务(实战配置+避坑)
  • Innovus低功耗设计验证:从电源完整性到功能仿真的全流程解析
  • ChatGPT_JCM前端加密方案:保护敏感数据的安全措施
  • Vue项目里用宇视插件播放海康大华摄像头,一个插件搞定三家(附完整代码)
  • OpenShamrock终极指南:基于Xposed的高效QQ机器人框架
  • Vue3大文件分片上传实战:从MD5计算到断点续传完整实现
  • Qt项目整合SARibbon库避坑指南:从源码复制到高分屏适配的全流程解析
  • 别再只盯着H.265了!手把手教你用FFmpeg 6.x + SVT-AV1编码你的第一个AV1视频(附性能对比)
  • 告别电量焦虑:EnergyStarX如何让你的Windows笔记本续航提升40%
  • C#的单继承限制下实现派生类ChildClass既继承BaseClass又成为单例的方法
  • MicroPython混合编程实战:ESP32如何优雅调用C模块(LED案例详解)
  • 三步掌握BilibiliDown:打造你的B站视频离线收藏库
  • 别再死记硬背了!用MATLAB rlocus函数5分钟搞定自动控制根轨迹图(附实战代码)
  • HY-MT1.5翻译效果实测:33种语言互译,效果惊艳
  • HsMod炉石传说插件全攻略:从入门到精通的个性化游戏体验
  • 猫抓插件:资源嗅探技术如何重塑浏览器媒体捕获体验
  • 别再死磕傅里叶了!用Python+PyWavelets搞定信号突变检测(附实战代码)
  • 手把手教你用Xilinx FPGA搭建100G RDMA测试环境(从IP配置到PC互联)
  • 从MCP2515发送邮箱满到总线错误:一次CAN通信故障的深度排查实录
  • OpenCore Legacy Patcher架构深度解析:老设备macOS升级的工程实践