五种传统IO模型
五种传统I/O模型
作者:tsing
本文地址:https://www.cnblogs.com/TssiNG-Z/p/17089759.html
简介
提起I/O模型, 就会说到同步/异步/阻塞/非阻塞乱七八糟一大堆, 这里简单整理一下, 做个备忘.
正文
传统I/O模型一共有5种 : 阻塞I/O, 非阻塞I/O, 多路I/O复用, 信号驱动I/O, 异步I/O.
为了更好的理解同步和异步的区别, 这里我们引入两个概念 : 用户进程 和 内核, 通过这两个概念, 我们尝试对I/O进行一个肤浅的解释和理解: 当我们在进程中通过系统API进行系统调用,将内核中的数据读入准备好的buffer时, 由于系统调用, 进程会进入阻塞, 当所数据被成功读入了buffer后,系统调用结束, 上述这个读取的过程, 我们可以理解为一次Input(Output则反过来).
而同步和异步的区别的关键点就在于, 有没有系统调用导致进程进入了阻塞.
下面我们回到传统I/O模型, 解释一下每种模型的行为(为了便于理解, 下面用read代表从内核读取数据的系统调用):
阻塞I/O : 在需要数据时, 直接调用read, 要求从内核中读取一定量的数据, 此时进程一直阻塞在这里(等待内核数据准备就绪), 直到操作完成后, read返回读入的字节数(或者被信号打断).
非阻塞I/O : 在需要数据时, 调用read, 若此时内核中的数据没有准备好, read会直接返回一个类似false的值, 表明数据没准备好, 传统的代码结构中, 我们会不断调用read, 直至read返回类似true的值, 表明数据读取成功. 在这种调用场景下, CPU通常会处于高占用状态.
多路I/O复用 : 即通过select/poll/epoll(epoll是在linux内核2.6版本之后加入的, win32和bsd中并没有epoll这个接口, win32有性能更好IOCP, bsd中相似的接口则是kqueue)来检查一个或多个设备文件描述符是否处于可读(ready)状态, 这三种调用中select和poll采用轮询机制, epoll使用内核回调, 所以epoll(O(1))的性能会比select/poll(O(n))要好, 当上述接口成功返回后, 我们就可以直接对返回的设备文件描述符进行read, 在这种场景下, 程序则阻塞在上述三个系统调用中的某一个中, 而不是read这个系统调用.
信号驱动I/O : 顾名思义, 通过向内核注册一个特定信号的回调函数, 当I/O准备就绪时, 内核会向进程发送特定信号, 该信号会被注册好的回调函数处理, 回调函数中则包含了read系统调用等操作来将数据读入buffer.
异步I/O : 可以简单理解为对信号驱动I/O的一种升级, 在进行I/O操作之前, 先准备好buffer和回调接口, 将buffer直接通过aio_read(asynchronous I/O)接口提交给系统内核, 内核会帮忙完成数据的拷贝工作, 当数据准备完成时, 回调接口会被调用, 在该回调中可以直接对buffer进行操作来处理数据(内核帮忙read过了), 而在此期间, 程序没有因为系统调用进入过阻塞状态. win32的IOCP就是一种异步模型, boost的asio库也是如此.
总结
我们可以将I/O模型分为两类 : 同步I/O和异步I/O, 其中同步I/O的关键在于系统调用导致进程进入阻塞, 故而上述的 阻塞I/O, 非阻塞I/O, 多路复用I/O 和 信号驱动I/O都属于同步I/O, 异步I/O则可以参考win32 IOCP和boost asio.
参考文献:
- <<UNIX网络编程 卷一>>
以上, 如有错误疏漏或疑问, 欢迎指正讨论, 转载请注明.
五种传统IO模型的更多相关文章
- 五种网络IO模型以及多路复用IO中select/epoll对比
下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络 ...
- 5种网络IO模型
5种网络IO模型(有图,很清楚) 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...
- 你可以这么理解五种I/O模型
因为项目需要,接触和使用了Netty,Netty是高性能NIO通信框架,在业界拥有很好的口碑,但知其然不知其所以然. 所以本系列文章将从基础开始学起,深入细致的学习NIO.本文主要是介绍五种I/O模型 ...
- I/O模型之一:Unix的五种I/O模型
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- 第3章 文件I/O(5)_五种I/O模型
6. I/O处理方式(5种I/O模型) 6.1 几个概念的辨析 (1)同步和异步 ①是访问数据的方式,主要是针对IO(资源.数据)而言的.关键在于I/O操作完成后,有没有提供通知机制. ②同步的IO, ...
- 五种典型开发周期模型(瀑布、V、原型化、螺旋、迭代)
五种典型开发周期模型(瀑布.V.原型化.螺旋.迭代) 总结一下经常可以见到的系统开发周期模型. 在过去的几年里,可以很奇葩的碰到类似于“创业项目库”这种需求非常明确,工作量十分可控,对质量要求比 ...
- Linux五种I/O模型性能分析
转载自:http://blog.csdn.net/jay900323/article/details/18141217/ socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理 ...
- Unix下 五种 I/O模型
Unix下共有五种I/O模型: 1. 阻塞式I/O 2. 非阻塞式I/O 3. I/O复用(select和poll) 4. 信号驱动式I/O(SIGIO) 5. 异步I/O(POSIX的aio ...
- 五种I/O模型的学习
来自 http://www.52im.net/thread-1935-1-1.html 4.互联网服务端处理网络请求的原理 首先看看一个典型互联网服务端处理网络请求的典型过程:<ignore ...
- 转:Windows Socket五种I/O模型
原文转自: Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...
随机推荐
- JavaScript之数组高阶API—reduce()
一文搞懂JavaScript数组中最难的数组API--reduce() 前面我们讲了数组的一些基本方法,今天给大家讲一下数组的reduce(),它是数组里面非常重要也是比较难的函数,那么这篇文章就好好 ...
- 硬核剖析Java锁底层AQS源码,深入理解底层架构设计
我们常见的并发锁ReentrantLock.CountDownLatch.Semaphore.CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁. 上篇 ...
- <四>构造函数初始化列表
示例代码1 点击查看代码 class CDate{ public: CDate(int _year,int _month, int _day){ this->year=_year; this-& ...
- C#使用附加到进程调试
微软官网的调试进程介绍 首先运行bin下的可执行文件,然后打开源代码,选择调试--->附加到进程.
- Git+Github协作开发流程
采用合作开发者的方式进行协作开发,下面以zlcook和zlserver合作开发iqas-ios-record项目为例进行讲解,zlcook为项目创建者,zlserver为项目参与者.协作开发步骤如下: ...
- Day17.1:静态与非静态的详解
静态与非静态 静态方法--类方法 是以static为关键词,从属于类,与类共生 public class Students{//class修饰的是一个类,所以这是一个学生类 public static ...
- Devexpress 图表显示数据标签
dev的图标功能非常强大其中有一些设置可以更好的展现出数据 设置Series的标签 series.LabelsVisibility = DevExpress.Utils.DefaultBoolean. ...
- 前后端分离开发工具YAPI部署记录
之前公司说要建立起前后端分离开发模式,而我只是刚毕业,让我负责建立起这个规范 ,虽然刚毕业还没去大厂待过,对我来说是个挑战,只能按我理解和网上的方案进行建立.在 Google 和 github 搜了好 ...
- node-sass报错(Node Sass could not find a binding for your current environment)
解决方案:参考 https://stackoverflow.com/questions/37986800/node-sass-couldnt-find-a-binding-for-your-curre ...
- Velero 系列文章(一):基础
概述 Velero 是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷. 灾难恢复 Velero 可以在基础架构丢失,数据损坏和/或服务中断的情况下,减 ...