1.IO的概念

  • IO简单来讲就是对输入输出设备的简化表达形式

    • 单片机中各种接口,进行数据流的传输
    • 从磁盘中读取数据至内存,又或者从内存中写入磁盘
  • 编程中的IO
    • 此时的IO其应用程序的运行态,即进程---》IO调用
    • 特别强调的是我们的应用程序其实并不存在实质的IO过程,真正的IO过程是操作系统的事情,
    • 这里把应用程序的IO操作分为两种动作:IO调用和IO执行
    • 因此所有的IO操作算作IO调用,之后由内核进行执行

2.Linux中的5种IO模型

  • 5种IO模型

    • 同步IO:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型

    • 异步IO

  • 阻塞IO模型--bio---blockIO--》

    • fd默认是阻塞的,网络编程中accept(),listen(),recv()等这些函数
    • 阻塞IO不适合工程代码,网络IO
    • 一旦阻塞,线程会被挂起
  • 非阻塞IO模型

    • 流程不变,继续执行
    • 比如recv()只会返回一个–1,然后接着执行
    • 阻塞---要进行读写,没有数据,线程会被挂起

    注:阻塞和非阻塞的属性,是属于fd本身,默认为阻塞,可以通过

    fcntl( fd,flag | O_NONBLOCK )进行非阻塞设置

  • IO复用模型 :IO多路复用

  • 信号驱动的IO模型

    • 注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程
  • 异步IO

    通过使用fdset(fd,cb),一旦检测到数据调用callback,也不会被阻塞,但是也不会返回-1,因为会自动调用cb

  • reactor---反应堆模型

    • reactor是对epoll进行的封装,让用户只需要关注读什么和写什么和相应的回调函数即可
    • 而不是关注epoll的使用

一些概念

  • 阻塞和非阻塞---》针对于线程状态,

    • 一旦阻塞,线程被挂起,不能做其它事情)
    • 非阻塞可以做其他事情:在等待的过程中可以做其它事情
  • 同步和异步---》线程的做事顺序,异步和同步是相对的
    • 同步为一个线程必须做完一件之后,通知再做下一件
    • 异步为不必做完一件之后,再做下一件,可以一次性做多个,做完通知一下
  • 同步和互斥--》两者的角度不同
    • 同步按照一定的顺序执行,访问者对资源的有序访问。
    • 互斥:同一个资源同一时间只有一个访问者可以进行访问,其他访问者需要等前一个访问者访问结束才可以开始访问该资源。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
    • 总结:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。

3.常用使用形式----》用途

  • 阻塞IO模型:阻塞socket

    • 进程阻塞挂起不消耗CPU资源,及时响应每个操作;
    • 实现难度低、开发应用较容易;
    • 适用并发量小的网络应用开发;
  • 非阻塞IO模型:socket是非阻塞的方式,超时处理
    • 进程轮询(重复)调用,消耗CPU的资源;
    • 实现难度低、开发应用相对阻塞IO模式较难;
    • 适用并发量较小、且不需要及时响应的网络应用开发;
  • IO复用模型 :select、poll、epoll三种方案,nginx都可以选择使用这三个方案
    • 专一进程解决多个进程IO的阻塞问题,性能好;Reactor模式;
    • 实现、开发应用难度较大;
    • 适用高并发服务应用开发:一个进程(线程)响应多个请求
  • 信号驱动的IO模型:信号机制不可控,不建议应用于服务层(业务层)
    • 回调机制,实现、开发应用难度大;
  • 异步IO:高性能服务器应用
    • 不阻塞,数据一步到位;Proactor模式;
    • 需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;
    • 实现、开发应用难度大;
    • 非常适合高性能高并发应用;

4.拓展

  • 在网络编程中,为什么使用IO多路复用,而不是异步IO?

    1.异步IO处于内核空间中,回调函数在用户空间中,从系统空间回调到用户空间

    2.内核和用户空间之间会触发0x80中断,系统调用过程,用户空间经过80中断进入系统空间代码,比如open()

    3.网络编程中的fd数量有NN多个,会有NN多个callback,因此会频繁触发80中断

    4.这会导致80中断队列崩溃

    5.aio的缺陷,但是仍然好用,可以用在磁盘文件读写,即不需要大量IO使用,几十个等

5.相关联的,相对比的技术

6.参考资料

看一遍就理解:IO模型详解 - 掘金 (juejin.cn)

最新文章

  1. label标签跳出循环
  2. ADO.NET完整增删改
  3. std::list
  4. [js]变量声明、函数声明、函数定义式、形参之间的执行顺序
  5. jquery与checkbox的checked属性的问题
  6. spring是怎样面向接口编程的?
  7. vijosP1194 Domino
  8. GBK编码和UTF-8编码互转的大坑
  9. Creating a settings table that can handle almost any type of value
  10. android ScrollView中嵌套listview listview可点击处理,可展开
  11. C语言进制转换的一个小错误
  12. python之路1
  13. Jpush极光推送的一些心得
  14. file_name[:-4]
  15. JavaScript中的方法事件和函数的方法的三种方法
  16. MySQL多实例.md
  17. IBDAP-CMSIS-DAP
  18. 【Unity】2.2 Unity编辑器中的常用菜单项
  19. A server is already running. Check /home/peter/stock/tmp/pids/server.pid. Exiting【Xshell 运行rails s 报错】
  20. 使用UIScreenEdgePanGestureRecognizer写iOS7侧边栏

热门文章

  1. 更改jenkins的工作目录
  2. 2、Java封装、继承与多态
  3. 【转载】SQL SERVER 通过对汉字、字母和数字的Unicode码区间的判断来识别字符串
  4. [seaborn] seaborn学习笔记0-seaborn学习笔记章节
  5. 使用C语言编程的7个步骤
  6. CF1744B Even-Odd Increments
  7. dfs 返回值用bool相对void会快一点
  8. Cert Manager 申请SSL证书流程及相关概念-三
  9. idea正则替换
  10. .Net6 微服务之Polly入门看这篇就够了