美文网首页Linux各种姿势程序员
I/O 的五大模型:阻塞、非阻塞、复用、信号驱动、异步

I/O 的五大模型:阻塞、非阻塞、复用、信号驱动、异步

作者: 字母数字或汉字 | 来源:发表于2016-04-20 21:53 被阅读289次

    网络 I/O 要经过两个阶段:

    1. 等待数据就绪
    2. 从内核复制数据到用户进程

    这两个阶段上阻塞与否,就出现了本文所讲的各种 I/O 模型的不同。

    以 read() 为例。

    阻塞式 I/O

    Blocking I/O model

    在等待数据就绪和复制数据阶段均阻塞。

    非阻塞 I/O

    Non-blocking I/O model

    在等待数据就绪阶段,如果数据未就绪 read 会立刻返回 error,不阻塞;用户需要轮询以确认数据就绪;当就绪后则复制数据,该过程阻塞。

    I/O 复用

    I/O multiplexing model

    以 select() 为例。

    这个概念稍有不同,它是在执行 select() 的时候,同时阻塞多个 fd 然后等到监测到某些 fd 就绪时返回。此时进程两阶段均被阻塞,但等待数据就绪阶段由 select() 阻塞,复制数据阶段由 read() 阻塞。

    信号驱动 I/O

    等待数据就绪阶段不阻塞,数据就绪后内核给进程发 signal,复制数据阶段阻塞。

    异步 I/O

    Paste_Image.png

    异步-回调模型。两阶段均不阻塞,数据复制完后内核给进程发 signal。

    也就是说,同步 I/O 也包括非阻塞 I/O,因为非阻塞 I/O 也会在数据复制时阻塞进程。

    总结

    Compare

    相关文章

      网友评论

        本文标题:I/O 的五大模型:阻塞、非阻塞、复用、信号驱动、异步

        本文链接:https://www.haomeiwen.com/subject/vsyblttx.html