Linux的IO模型
2024-09-12 10:09:29
在输入输出系统一文中介绍了系统内核操作IO设备的机制。 我们了解到内核可以直接访问IO设备, 用户进程无法IO设备。
就是说IO操作需要分为两个过程, 内核从IO设备读取数据保存到内核空间, 将数据由内核空间拷贝到用户空间。
IO调用可以分为同步调用和异步调用。同步调用要求主线程采用轮询等机制主动检查IO状态; 异步调用下主线程发出IO调用并立即返回, 在IO完成后通过回调函数等通知机制通知主线程.
阻塞IO与非阻塞IO的区别在于等待内核从外部设备读取数据时主线程是否阻塞。
由此可见, 同步和异步调用关心的是消息通信机制,阻塞和非阻塞IO关心的是IO操作过程中主线程的状态。
Linux的IO模型中Non-Blocking, Multiplexing IO, Signal Driven IO通过同步调用实现了非阻塞调用.
Blocking IO
应用程序执行一次IO调用, 导致应用程序阻塞, 直到内核准备好数据报并完成拷贝后返回.
是最容易理解的一种IO模型.
Non-Blocking IO
主线程执行IO调用, 内核开始准备数据, 用户通过轮询检查数据是否就绪. 若未就绪则继续立即返回继续执行主线程, 若就绪则开始进行拷贝, 拷贝过程中用户线程被堵塞.
主线程在执行轮询后立即返回,说明这是非阻塞IO。但需要主线程主动轮询获得IO操作状态, 所以仍属于同步IO。
Multiplexing IO
select和epoll即是此IO模型的典型实现,一次IO操作中包含两次调用两次返回
多路IO复用可以实现对多个IO端口的监听, 内核一旦发现主线程指定的一个或者多个IO数据拷贝就绪, 它就通知主线程将数据拷贝到用户空间.
该模型中select或epoll等系统调用在内核态轮询IO状态。
Signal Driven IO (SIGIO)
信号驱动IO在等待数据阶段采用了不同的等待方式.
Asynchronous IO
最新文章
- C和指针 第四章 习题
- 创建与使用Web API
- 给SHP文件定义投影
- php头像上传并裁剪支持3个尺寸
- 通达OA 公共文件柜二次开发添加管理信息(图文)
- Where is Vasya?
- 【ASP.NET】从服务器端注册客户端脚本
- Delpoyment assembly
- ANTS Performance Profiler 破解使用
- js数组、对象、正则
- 笔记整理--Http-Cookie
- 网站与域名知识扫盲-DNS
- [转]JAVA自动装箱和拆箱
- 201521123019 《Java程序设计》第5周学习总结
- F1赛道 - Bahrain International Circuit | 巴林国际赛道
- MySQL基础概述
- 【亲测有效】Kali Linux无法安装网易云音乐的解决方案
- Python 使用pymysql连接MySQL
- C#特性文章学习
- Python + Robotframework + Appium 之APP自动化测试小试牛刀(Android)
热门文章
- delphi编写与调用DLL(delphi7下测试通过)
- Android-WebView与本地HTML (Java调用--->;HTML的方法)
- Android-Kotlin-抽象类与多态的表现
- Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 问题分析
- 利用github搭建个人maven仓库
- JS学习笔记4_BOM
- dbcp和druid(数据库连接池)
- Lerning Entity Framework 6 ------ Using a commandInterceptor
- 全球第一开源ERP Odoo操作手册 数据库简介
- Mac下如何安装配置Homebrew