zoukankan      html  css  js  c++  java
  • 图解五种I/O模型

    原文见 http://www.quora.com/Computer-Programming/How-is-asynchronous-IO-implemented-in-programming-languages

    带下划线的部分是我的理解和译注


    有五种I/O模型

    下图针对网络I/O,但磁盘I/O等其它I/O形式都是类似


    1,阻塞I/O模型

    请求无法立即完成则保持阻塞

    整个过程分为两个阶段:

    阶段一是等待数据就绪,网络I/O的情况就是等待远端数据陆续抵达;磁盘I/O的情况就是等待磁盘数据从磁盘上读取到内核态内存中

    阶段二是数据拷贝,出于系统安全,用户态的程序没有权限直接读取内核态内存,因此内核负责把内核态内存中的数据拷贝一份到用户态内存中

    理解这两个阶段非常重要,后续I/O模型的演变都是针对这两个阶段进行不同改造


    2,非阻塞I/O模型

    请求不会阻塞, 而是立即返回错误码(EWOULDBLOCK) 
    (通过调用fcntl,参数置为O_NONBLOCK)

    阶段一频繁轮询的话,也很耗费CPU时间

    这种方式对单个I/O请求意义不大,但给I/O多路复用铺平了道路.


    3,I/O多路复用模型

    调用 select / poll  该方法由一个用户态线程负责轮询多个sockets,直到某个阶段一的数据就绪,再通知实际的用户线程执行阶段二的拷贝.

    通过一个专职的用户态线程执行非阻塞I/O轮询,模拟实现了阶段一的异步化



    4,信号驱动I/O模型

    阶段一演变为异步,由内核托管,应用程序只需告知内核,当阶段一数据就绪时向应用程序发出 SIGIO信号


    至此为止,前述4种模型的阶段二仍是处于block状态的


    5,异步I/O模型

    告知内核,当整个过程(包括阶段一和阶段二)全部完成时,通知应用程序来读数据.


    linux3.5已经有针对C的异步I/O API,细节略.


  • 相关阅读:
    Bundle 机制
    三次握手和四次挥手
    SparseArray
    ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因
    怎么去除重复代码
    ClassLoader
    android的四种线程池
    LeetCode#50 Pow(x, n)
    LeetCode#49 Anagrams
    LeetCode#48 Rotate Image
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3006058.html
Copyright © 2011-2022 走看看