美文网首页
Linux5种I/O模型

Linux5种I/O模型

作者: JaJIng | 来源:发表于2019-03-30 11:40 被阅读0次

    Linux的5种I/O模型分别为:

    1)阻塞I/O(blocking I/O)

    2)非阻塞I/O (nonblocking I/O)

    3) I/O多路复用(select 和poll) (I/O multiplexing)

    4)信号驱动I/O (signal driven I/O (SIGIO))

    5)异步I/O (asynchronous I/O (the POSIX aio_functions))

    I/O模型可以拆成两段,1.内核数据准备(对应阻塞非阻塞),2.进程数据拷贝(是否由进程自我完成,否则异步)

    两段都阻塞 我们把一个SOCKET接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。但是在数据拷贝的过程中,进程是阻塞的 I/O复用模型会用到select(数组)、poll(链表)、epoll(回调)函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。我觉得java的NIO其实是多路复用,但是取的名字non-blocking I/O(同步非阻塞I/O)有点奇怪。多路复用本质还是阻塞的只是没有阻塞在recvfrom函数,而是阻塞在轮询(select,epoll)这种上。虽然第一阶段都是阻塞,但是阻塞式I/O如果要接收更多的连接,就必须创建更多的线程。I/O复用模式下在第一个阶段大量的连接统统都可以过来直接注册到Selector复用器上面,同时只要单个或者少量的线程来循环处理这些连接事件就可以了,一旦达到“就绪”的条件,就可以立即执行真正的I/O操作。这就是I/O复用与传统的阻塞式I/O最大的不同。 首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。第二段数据拷贝任然要进程自己去做。 相比于信号驱动I/O,第二段数据拷贝也是由内核帮我们完成,是真正的“异步”I/O

    相关文章

      网友评论

          本文标题:Linux5种I/O模型

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