堵塞I/O(blocking I/O)

非堵塞I/O (nonblocking I/O)

I/O复用(select 和poll) (I/O multiplexing)

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

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

前四种都是同步。仅仅有最后一种才是异步IO。

I/O过程分为两个过程,数据准备和数据拷贝



堵塞I/O模型:

该模型在两个过程中一直处于堵塞状态,直到数据拷贝完毕,系统调用返回.

堵塞I/O模型图:

当调用recv()函数时,系统首先查是否有准备好的数据。

假设数据没有准备好,那么系统就处于等待状态。

当数据准备好后。将数据从系统缓冲区拷贝到用户空间。然后该函数返回。

在套接应用程序中。当调用recv()函数时。未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。

非堵塞IO模型

非堵塞I/O在第一个过程中会进行多次调用系统调用(假设数据没有准备好的话)并马上返回.在数据拷贝过程中,仍然处于堵塞状态.       

我们把一个SOCKET接口设置为非堵塞就是告诉内核,当所请求的I/O操作无法完毕时,不要将进程睡眠。而是返回一个错误。

这样我们的I/O操作函数将不断的測试数据是否已经准备好。假设没有准备好。继续測试,直到数据准备好为止。在这个不断測试的过程中。会耗费大量的占用CPU的时间。

有点类似于轮询

堵塞I/O模型图:

IO复用模型:

I/O复用模型经常使用的函数有select、poll和epoll,详细的差别请查阅相关文档。

这几个函数也会使进程堵塞(请注意和I/O堵塞进行区分)该函数能够监听多个socket,看是否有socket就绪。假设就绪就返回就绪的socket数(或者超时返回)。然后对就绪的socket依照相应的就绪事件进行相关的操作(读数据或者写数据)

I/O复用模型图:

信号驱动IO

首先我们同意套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续执行并不堵塞。

当数据准备好时。进程会收到一个SIGIO信号,我们能够在信号处理函数中调用I/O操作函数处理数据。

异步IO模型

在两个过程中都不会发生堵塞,直到数据拷贝完毕后收到通知。

当一个异步过程调用发出后,调用者不能立马得到结果。实际处理这个调用的模块在完毕I/O操作后。通过状态或者回调来通知调用者

同步IO和异步IO的差别:数据拷贝的过程中,进程是否堵塞!

堵塞IO和非堵塞IO的差别:数据准备的过程中,进程是否堵塞!

5种I/O模型的比較:

Linux下的五种I/O模型的更多相关文章

  1. []转帖] 浅谈Linux下的五种I/O模型

    浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html  一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...

  2. 浅谈Linux下的五种I/O模型 两篇别人的博客

     http://blog.csdn.net/sinat_34990639/article/details/52778562  http://www.cnblogs.com/chy2055/p/5220 ...

  3. 浅谈Linux下的五种I/O模型

     一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所 ...

  4. Linux下的5种I/O模型(转)

    Linux下的五种I/O模型: l         阻塞I/O l         非阻塞I/O l         I/O复用(select.poll.epoll) l         信号驱动I/ ...

  5. Linux 下的五种 IO 模型

    概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...

  6. Linux下的5种I/O模型与3组I/O复用

    引言 上一篇文章中介绍了一些无缓冲文件I/O函数,但应该什么时机调用这些函数,调用这些I/O函数时进程和内核的行为如何,如何高效率地实现I/O?这篇文章就来谈一谈Linux下的5种I/O模型,以及高性 ...

  7. Linux五种I/O模型性能分析

    转载自:http://blog.csdn.net/jay900323/article/details/18141217/ socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理 ...

  8. Unix下 五种 I/O模型

    Unix下共有五种I/O模型: 1. 阻塞式I/O  2. 非阻塞式I/O  3. I/O复用(select和poll)  4. 信号驱动式I/O(SIGIO)  5. 异步I/O(POSIX的aio ...

  9. Linux 中的五种 IO 模型

    Linux 中的五种 IO 模型 在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一 ...

随机推荐

  1. BZOJ 4488/4052 gcd

    思路: 一开始 我是想 对于固定的左端点 从左到右 最多有 log种取值  且单调递减  那不妨倍增预处理+二分GCD在哪变了.. 复杂度O(nlog^2n) gcd最多log种取值.. 好了我们可以 ...

  2. windows服务安装错误 在‘安装’过程发生异常:System.ComponentModel.Win32Exception:系统正在关机

    今天安装windows服务的时候先是在本地安装测试通过,但是一到服务器就一直安装失败 在‘安装’过程发生异常:System.ComponentModel.Win32Exception:系统正在关机 然 ...

  3. http接口 两种调用http接口的方法

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; ...

  4. Android fragment的切换(解决REPLACE的低效)

    在项目中切换Fragment,一直都是用replace()方法来替换Fragment.但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的 ...

  5. 使用CImage类 显示图片

    在不适用openCv的一种时候,使用CImage显示图片数据,并且直接嵌入DC框中. 使用CImage 在pic控件里显示图片 void CMyCalLawsDlg::MyShowImage( CIm ...

  6. 【Hexo】本地local4000打不开解决方法

    错误:Cannot GET /spadesq.github.io/ (注:spadesq.github.io是原来放hexo文件夹的名字) 由于我后来把hexo文件夹搬迁到别处,但我发现打开本地,地址 ...

  7. BZOJ 4817: [Sdoi2017]树点涂色 LCT+Access的性质+DFS序+线段树

    Code: #include<bits/stdc++.h> #define maxn 200003 #define inf -1000000 using namespace std; vo ...

  8. SP1825 FTOUR2 - Free tour II 点分治+启发式合并+未调完

    题意翻译 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Code: #include <bits/stdc++.h> using n ...

  9. PAT_A1140#Look-and-say Sequence

    Source: PAT A1140 Look-and-say Sequence (20 分) Description: Look-and-say sequence is a sequence of i ...

  10. TensorFlow的序列模型代码解释(RNN、LSTM)---笔记(16)

    1.学习单步的RNN:RNNCell.BasicRNNCell.BasicLSTMCell.LSTMCell.GRUCell (1)RNNCell 如果要学习TensorFlow中的RNN,第一站应该 ...