IO-同步,异步,阻塞,非阻塞
1.什么是IO
数据在系统内核(kernel)和用户进程之间的传递,称为IO。

2.IO操作步骤
以read为例,涉及两个系统对象,调用IO的process(or thread),即用户进程;另一个为系统内核(kernel)。
当用户进程调用recvfrom操作时,会经历两个阶段
1)等待数据准备
2)将数据从内核拷贝至进程中

3.IO模型
根据用户进程在IO操作时的状态,可以分为5中IO类型:
blocking IO:阻塞IO
non-blocking IO:非阻塞IO
IO multiplexing:多Socket连接IO
signal driven IO:信号驱动IO
asynchronous IO:异步IO

signal driven IO实际中很少使用,在此不做介绍。

2.blocking IO:阻塞IO
当用户进程调用recvfrom时,首先开始IO第一阶段:kernel准备数据。
用户进程会被阻塞。当kernel数据准备好以后,会将数据从kernel拷贝到用户内存,然后kernel返回结果,用户进程才会解除block的状态,重新运行起来。
blocking IO在IO执行的两个阶段都被block了。

3.non-blocking IO:非阻塞IO
可以设置socket使其变为non-blocking。
当对一个non-blocking socket执行recvfrom操作时,流程如下:
用户进程调用recvfrom,如果kernel数据还没有准备好,此时用户进程不会被block。而是立刻返回一个error,从用户进程角度看,它并没有等待,而是立刻得到了一个结果。
用户进程判断是一个error时,它就知道数据还没有准备好,于是再次发送read操作。
一旦kernel中的数据准备好,并且再次收到了用户进程的system call,那么它马上将数据拷贝到用户内存,然后kernel返回结果。
non-blocking IO在数据准备阶段,没有被block,而是不断的轮询kernel数据是否准备好;在数据拷贝阶段,用户进程被block,直到kernel拷贝结束,返回结果,用户进程才会解除block的状态。

4.IO multiplexing:多Socket连接IO
IO multiplexing的特点是单个用户进程可以同时处理多个网络连接IO,它的原理是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
当用户进程调用select时,整个进程会被block,当任何一个socket中的数据准备好了,select就会返回。这时用户进程再调用read操作,将数据从kernel拷贝到用户进程。我们可以看出,IO multiplexing和blocking IO的流程类似,不同的是,IO multiplexing需要两个system call(select和recvfrom),而blocking IO只调用了一个system call(recvfrom)。select的优势在于它可以同时处理多个socket连接。所以如果连接数不高的话,使用select/epoll的web server不一定比multi-threading+blocking IO的web server性能更好,select/epoll的优势在于能够处理更多的连接。
IO multiplexing中,每一个socket一般设置为non-blocking的,但是用户进程一直是被select函数block的。

5.asynchronous IO
用户进程发起read操作后,立刻返回可以去做其他的事情了。
此时,从kernel角度看,当它收到一个asynchronous read后,首先他立刻返回,所以不会对用户进程产生任何block,然后,kernel等待数据准备完成,然后将数据拷贝到用户内存,当这一切完成之后,kernel会给用户进程发送一个signal告诉用户进程read操作完成了。

6.四种IO模型的区别
blocking和non-blocking,synchronous IO和asynchronous IO的区别。
blocking和non-blocking的区别很明显,blocking会一致阻塞,non-blocking在数据没准备完全时会立刻返回。
synchronous同步IO指的是在IO操作时会阻塞用户进程;asynchronous含义相反。
可以看出blocking,non-blocking,IO multiplexing都是synchronous IO;而asynchronous不会对用户进程产生任何阻塞。

7.网上有一个比较形象的例子来说明这四种IO Model
有A,B,C,D四个人在钓鱼:
A用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆;
B的鱼竿有个功能,能够显示是否有鱼上钩,所以呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆;
C用的鱼竿和B差不多,但他想了一个好办法,就是同时放好几根鱼竿,然后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来;
D是个有钱人,干脆雇了一个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信。

IO-同步,异步,阻塞,非阻塞的更多相关文章

  1. 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor

    开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...

  2. 高性能IO设计模式之阻塞/非阻塞,同步/异步解析

    提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来 ...

  3. 操作系统介绍-操作系统历史,IO,进程的三态,同步异步阻塞非阻塞

    1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操 ...

  4. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  5. 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

    以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...

  6. (转)同步异步,阻塞非阻塞 和nginx的IO模型

    同步异步,阻塞非阻塞 和nginx的IO模型  原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...

  7. Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...

  8. python并发编程之IO模型 同步 异步 阻塞 非阻塞

    IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...

  9. 关于IO的同步,异步,阻塞,非阻塞

    上次写了一篇文章:Unix IO 模型学习.恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现.中途正好讨论了网络IO的同步.异步.阻塞.非 ...

  10. 转:IO模型-- 同步和阻塞,异步和非阻塞的区别

    源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...

随机推荐

  1. js时间格式转换

    在javascript中直接输出Date得到的结果是这样的: function date(){ var date = new Date(); alert(date); } 结果是:Mon Jun 15 ...

  2. 安装solidity遇见的问题——unused variable 'returned'

    在编译安装solidity的过程中遇见了一个很奇怪的问题 webthree-umbrella/libethereum/libethereum/Executive.cpp: In member func ...

  3. js+css3文字模糊代码

    在写文字模糊的时候要理清自己的思路,根据以下的步骤来: 对你要模糊的文字进行布局 <body style="background:#ccc;"> <ul clas ...

  4. tiny_cnn代码阅读(2)

    上一篇讲了mse函数 , 这次gradient_descent_levenberg_marquardt @see ${root}/tiny_cnn/optimizer/optimizer.h 这个函数 ...

  5. linux 下mysql的安装,并设置必要的密码

    首先,我使用的是redhat linux ,版本号为: [root@localhost init.d]# cat /proc/version Linux version - (bhcompile@po ...

  6. 读javascript高级程序设计03-函数表达式、闭包、私有变量

    一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...

  7. guava学习--集合1

    Lists: 其内部使用了静态工厂方法代替构造器,提供了许多用于List子类构造和操作的静态方法,我们简单的依次进行说明,如下: newArrayList():构造一个可变的.空的ArrayList实 ...

  8. nginx root&alias文件路径配置

    转:https://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/ 总结: alias 改变了访问路径.root对应loca ...

  9. Windows Store App 控件动画

    在开发Windows应用商店应用时,开发工具中已经封装了大量的控件供开发人员使用,而其中有一部分控件,例如FlipView.ToolTip.ListView以及SemanticZoom等控件中已经默认 ...

  10. PDF 补丁丁 0.4.2.950 测试版发布:按文件夹合并生成单独的PDF文件

    新的测试版实现了将文件夹的内容合并为单独的PDF文件的功能.以下图为例讲解操作步骤. 点击工具栏的“合并文件”按钮,打开合并功能. 设M盘下有“test”和“test2”文件夹,里面包含了需要合并的文 ...