美文网首页
Unix下5种IO模型

Unix下5种IO模型

作者: 梦工厂 | 来源:发表于2018-03-24 22:33 被阅读65次

目录
一:Unix下5种IO模型
二:同步I/O和异步I/O


一:Unix下5种IO模型

  • 阻塞式IO
  • 非阻塞式IO
  • IO多路复用(select和poll)
  • 信号驱动式IO(SIGIO)
  • 异步IO

对于一个套接字上的输入操作,两个阶段:
1)等待数据从网络中到达,被复制到内核中的某个缓冲区;
2)将数据从内核缓冲区复制到应用进程缓冲区;

  1. 阻塞式IO模型

    image

    进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回。最常见的错误是系统调用被信号中断。我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据。

  2. 非阻塞式IO
    进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。下图展示了非阻塞I/O模型。

    image

    前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用 recvfrom时已有数据报准备好,它被拷贝到应用进程缓冲区,recvfrom于是成功返回。我们接着处理数据。

    当一个应用进程像这样对一个非阻塞描述字循环调用recvfrom时,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪。这么做往往耗费大量CPU时间,不过这种模型偶尔也会遇到,通常是在只专门提供某种功能的系统中才有。

  3. IO多路复用
    有了I/O复用(I/O multiplexing),我们就可以调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。下图展示了I/O复用模型。

    image

    我们阻塞于select调用,等待数据报套接口变为可读。当select返回套接口可读这一条件时,我们调用recvfrom把所读数据报拷贝到应用进程缓冲区。

    与I/O复用密切相关的另一种I/O模型是在多线程中使用阻塞I/O。这种模型与I/O复用模型极为相似,代替使用select阻塞在多个文件描述字上的是,使用多个线程(每个文件描述字一个线程),这样每个线程都可以自由地调用诸如recvfrom之类的阻塞式I/O系统调用了。

  4. 信号驱动式IO(SIGIO)
    我们也可以用信号,让内核在描述字就绪时发送SIGIO信号通知我们。

    image

    我们首先开启套接口的信号驱动I/O功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它读取数据报。

  5. 异步IO
    一般地说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到我们自己的缓冲区)完成后通知我们。
    这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知我们何时启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

    image
  6. IO模型的比较

    image

二:同步I/O和异步I/O

POSIX把这两个术语定义如下:

  • 同步I/O操作(synchronous I/O operation)导致请求进程阻塞,直到I/O操作完成。
  • 异步I/O操作(asynchronous I/O operation)不导致请求进程阻塞。

根据上述定义,我们的前4种模型——阻塞I/O模型、非阻塞I/O模型、I/O复用模型和信号驱动I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O模型与POSIX定义的异步I/O相匹配。


《UNIX网络编程-卷1》

相关文章

  • Unix下5种IO模型

    目录一:Unix下5种IO模型二:同步I/O和异步I/O 一:Unix下5种IO模型 阻塞式IO 非阻塞式IO I...

  • 【Netty开发指南】搭稳Netty开发的地基

    Linux网络编程5种IO模型 根据UNIX网络编程对于IO模型的分类,UNIX提供了5种IO模型,分别是 阻塞I...

  • linux select/epoll

    一、Unix/Linux网络IO模型在经典的Unix网络编程中,总结出了5种不同的网络IO模型,分别是阻塞式IO,...

  • Unix IO模型

    1.同步,异步,阻塞,非阻塞的概念:一般来说,一个输入操作包含两个阶段:(1)等待数据准备好(2)将数据从内核拷贝...

  • unix 下5种io模型

    文章从我的个人博客备份而来unix下有5种可用的io模型,它们分别是: 阻塞io 非阻塞io io复用 信号式驱动...

  • 2020-02-19 阻塞IO和非阻塞IO

    unix系统下常见的五种IO模型 阻塞式 非阻塞式 IO复用(select,poll) 信号驱动(SIGIO) 异...

  • IO模型

    描述 本文摘自UNIX网络编程卷1:套接字联网API,描述了UNIX中五种IO模型。阻塞IO、非阻塞IO、IO复用...

  • 彻底搞懂Java的网络IO

    IO是Input/Output的缩写。Unix网络编程中有五种IO模型: blocking IO(阻塞IO) no...

  • UNIX下的5种IO模型

    套接字的IO操作,如recvfrom,分为两个阶段: (1)等待内核中的接收缓冲区中有数据可读。 (2)将接收缓冲...

  • 四、高性能IO模型浅析

    按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO;按照PO...

网友评论

      本文标题:Unix下5种IO模型

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