IO-同步,异步,阻塞,非阻塞
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-同步,异步,阻塞,非阻塞的更多相关文章
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- 高性能IO设计模式之阻塞/非阻塞,同步/异步解析
提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来 ...
- 操作系统介绍-操作系统历史,IO,进程的三态,同步异步阻塞非阻塞
1.操作系统历史 2.进程,IO,同步异步阻塞非阻塞 操作系统历史: 手工操作: 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念. 手工操 ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- 理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO
以下是IO的一个基本过程 先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间.当用户程序读取数据的时 ...
- (转)同步异步,阻塞非阻塞 和nginx的IO模型
同步异步,阻塞非阻塞 和nginx的IO模型 原文:https://www.cnblogs.com/wxl-dede/p/5134636.html 同步与异步 同步和异步关注的是消息通信机制 (sy ...
- Java IO 学习(一)同步/异步/阻塞/非阻塞
关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...
- python并发编程之IO模型 同步 异步 阻塞 非阻塞
IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...
- 关于IO的同步,异步,阻塞,非阻塞
上次写了一篇文章:Unix IO 模型学习.恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现.中途正好讨论了网络IO的同步.异步.阻塞.非 ...
- 转:IO模型-- 同步和阻塞,异步和非阻塞的区别
源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...
随机推荐
- Java面向对象三大特点之继承
概念: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 生活中的继承: 兔子和羊属于食草动物类,狮子和豹属于食肉动物类 ...
- Krajee 文件上传
http://plugins.krajee.com/file-input/demo#ajax-uploads 插件官网 项目要个好看点的上传控件,于是搜到了这个. git的地址是 https://gi ...
- Java 序列化 反序列化 历史版本处理
直接引用 http://www.cnblogs.com/xdp-gacl/p/3777987.html
- js中对类和对象的理解
类 :对一群具有相同特征的对象的集合的描述:对象:真实存在的对象个体: **面向对象,而不是面向类. 1.一切皆对象,继承靠原型链,多态靠弱类型,封装--虽然可以靠闭包,但我个人更推崇和python一 ...
- css3制作惊艳hover切换效果
css3制作经验hover切换效果 <!DOCTYPE html><html> <head> <meta charset="UTF-8" ...
- guava学习--Ordering
转载:http://www.cnblogs.com/peida/p/Guava_Ordering.html Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering ...
- Oracle数据库备份与恢复
第一章. 理解什么是数据库恢复 当 我们使用一个数据库时,总希望数据库的内容是可靠的.正确的,但由于计算机系统的故障(硬件故障.软件故障.网络故障.进程故障和系统故障)影响数据库系 统的操作,影响数据 ...
- Octopus系列之js公共函数
货币选择 ChangeCurrency(this.value) 示例 <select name="currency" id="sl_currency" c ...
- iOS开发UI篇—在UIImageView中添加按钮以及Tag的参数说明
ios开发UI篇—在ImageView中添加按钮以及Tag的参数说明 一.tag参数 一个视图通常都只有一个父视图,多个子视图,在开发中可以通过使用子视图的tag来取出对应的子视图.方法为Viewwi ...
- 【58测试】【贪心】【离散】【搜索】【LIS】【dp】
第一题 大天使之剑 大意: 有n个怪,每个怪的ph 为 h[i],有三种攻击方式,普通攻击:一次打一个怪一滴血:重击(消耗1魔法值):一次打一个怪两滴血:群体攻击(消耗1魔法值):一次打所有怪一滴血. ...