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基础]循环结构3
[Java基础]循环结构3 break 与 continue 中断循环... /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:BreakTest.java 编写时间:2016/6 ...
- [讨论] 全新首发WIN7 32&64 WINSXS进一步精简批处理公测
恶魔浮雕 发表于 2016-1-8 15:01:27 |https://www.itsk.com/forum.php?mod=viewthread&tid=362278&highlig ...
- Caché数据库学习笔记(4)
目录 DeepSee的使用 数据.方法等的导入与导出 ======================================================== ================ ...
- Linux Socket编程(不限Linux)
"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...
- [maven] 使用Nexus创建maven私有仓库
1.为什么需要maven私有仓库? 从Maven中央仓库下载所需的jar包,需要外网的支持.如果公司不能上外网的话则不能从中央仓库下载所需jar包,公司网速慢的时候也会影响项目构建的速度.用户可以用n ...
- 解决Jenkins打不开浏览器问题
参考:http://blog.csdn.net/achang21/article/details/45096003 1.控制面板禁用掉jenkins服务 2.java -jar jenkins.war ...
- SourceForge无法访问的解决办法
这一阵java框架spring和hibernate都有新版本了(spring2.5.5和hibernate3.2.6)想下载看看,却发现 SourceForge.net无法打开.刚才用Google搜索 ...
- PE文件学习系列一为什么是PE
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)Q Q:408365330 E-Mail:egojit@qq.com PE概述: ...
- 通过一行代码学习javascript
[].forEach.call($$("*"), function (a){ a.style.outline = "1px solid #"+(~~(Math. ...
- csu 1804 有向无环图
题目地址 分析:从复杂度来看,一定不可能是枚举和来计算.1e5的规模来看,应该是复杂度比较合适. 我是这么想的,对于三个点,假设1->2有a种走法,2->3有b种走法.那么1->3应 ...