深入了解几种IO模型(阻塞非阻塞,同步异步)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zk3326312/article/details/79400805
一般来说,Linux下系统IO主要就是通过以下几个函数open(),close(),read(),write(),send(),recv(),lseek(),今天就以recv()为例来介绍下IO模型中的同步异步,阻塞非阻塞的区别。
先说阻塞与非阻塞的区别,recv()函数默认是阻塞的,什么是阻塞呢?就是当你调用recv()函数时,整个进程或者线程就等待在这里了,直到你recv的fd的所有信息都被send过来,这么做好处就是保证所有信息都能够完整的读取了,但劣势也很明显,就是在recv()的过程中你的进程或线程做不了其它事情,由此,引入了非阻塞IO。
非阻塞IO是什么呢,还是以recv()函数为例,当你将其设置为非阻塞时,每次当你recv()时,就直接返回,不管信息有没有完全send进来,好处很明显,recv()了之后进程马上能处理下一行代码,坏处也很明显,就是你不知道你的消息是否读完了,这种问题就是TCP中大名鼎鼎的半包问题(解决办法主要是通过一个buffer缓存所有读进来的消息)
打一个比方,你要去开水房接3/4杯水,在阻塞情况下,你需要等待你的杯子接够量,你才可以离开,当水是断断续续的时候,你就浪费了很多时间,因为在没水的这段时间你不能做其它事情,好处就是所有水接完就是刚刚好的3/4杯,在非阻塞情况下,你每次接水就接一些,只要没水了你就可以离开去做其它的事情,但需要你自己去看好量是不是够了3/4杯。阻塞和非阻塞的I/O模型图示如下:
阻塞IO模型:
非阻塞IO模型:
下面再说同步与异步的区别,在POSIX定义中把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO,看概念感觉异步跟非阻塞好像也没有什么区别,要好好理解同步和异步,就要详细说明下IO过程:
IO过程主要分两个阶段:
1.数据准备阶段
2.内核空间复制回用户进程缓冲区空间
无论阻塞式IO还是非阻塞式IO,都是同步IO模型,区别就在与第一步是否完成后才返回,但第二步都需要当前进程去完成,异步IO呢,就是从第一步开始就返回,直到第二步完成后才会返回一个消息,也就是说,非阻塞能够让你在第一步时去做其它的事情,而真正的异步IO能让你第二步的过程也能去做其它事情。这里就在说一下select,poll和epoll这几个IO复用方式,这时你就会了解它们为什么是同步IO了,以epoll为例,在epoll开发的服务器模型中,epoll_wait()这个函数会阻塞等待就绪的fd,将就绪的fd拷贝到epoll_events集合这个过程中也不能做其它事(虽然这段时间很短,所以epoll配合非阻塞IO是很高效也是很普遍的服务器开发模式--同步非阻塞IO模型)。有人把epoll这种方式叫做同步非阻塞(NIO),因为用户线程需要不停地轮询,自己读取数据,看上去好像只有一个线程在做事情,也有人把这种方式叫做异步非阻塞(AIO),因为毕竟是内核线程负责扫描fd列表,并填充事件链表的,个人认为真正理想的异步非阻塞,应该是内核线程填充事件链表后,主动通知用户线程,或者调用应用程序事先注册的回调函数来处理数据,如果还需要用户线程不停的轮询来获取事件信息,就不是太完美了,所以也有不少人认为epoll是伪AIO,还是有道理的。
再生动一点,还是以接水为例,当你使用epoll的IO复用时,相当于接水方有了一个服务员,他会告诉你哪些水龙头有水可以接,然后你可以阻塞或者非阻塞(最好是非阻塞,不然epoll的意义就不大了)的去接水,但接水这个过程,还是要你自己完成。而异步的IO模型呢,相当于你去水房,直接把水杯递给服务员,让他给你接好后再通知你来,连接水的过程也不需要了,异步IO的模型如下图:
---------------------
作者:曾柯
来源:CSDN
原文:https://blog.csdn.net/zk3326312/article/details/79400805
版权声明:本文为博主原创文章,转载请附上博文链接!
二、各种IO比较
一次IO操作包含了基本的两步:描述符就绪,内核数据到用户数据的拷贝.
阻塞:如果文件描述符还没就绪那么就一直等待,直到描述符就绪.等到描述符就绪以后就开始其他的IO步骤,最后完成IO操作以后返回.
非阻塞:如果文件描述符还没就绪那么就直接返回并返回一个错误码,不再傻等到描述符就绪.
阻塞和非阻塞的区别就是:如果此时因为各种原因不能马上进行IO操作那么如果继续等待则是阻塞IO,否则为非阻塞IO.
同步:一次IO请求阻塞,等待一次IO操作全部完成再返回.这里的一次IO操作包含了上面的阻塞和非阻塞模式,也就是这次IO操作可能成功也有可能会失败,但是一定要等待IO操作全部完成再返回.
异步:一次IO请求不阻塞,不等待IO操作完成再返回.等到IO操作完成以后内核会通知我们IO操作已经完成.
同步和异步的区别就是:等待一次IO操作完成再返回,否则是同步,否则为异步.
---------------------
作者:扎扎实实写代码
来源:CSDN
原文:https://blog.csdn.net/qq_30968657/article/details/66477381
版权声明:本文为博主原创文章,转载请附上博文链接!
深入了解几种IO模型(阻塞非阻塞,同步异步)的更多相关文章
- Python之阻塞IO模型与非阻塞IO模型
Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...
- IO模型之非阻塞IO
1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...
- IO模型,非阻塞IO模型,select实现多路复用
1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...
- 哪5种IO模型?什么是select/poll/epoll?同步异步阻塞非阻塞有啥区别?全在这讲明白了!
系统中有哪5种IO模型?什么是 select/poll/epoll?同步异步阻塞非阻塞有啥区别? 本文地址http://yangjianyong.cn/?p=84转载无需经过作者本人授权 先解开第一个 ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...
- Linux IO 同步/异步 阻塞/非阻塞
同步IO:导致请求进程阻塞,直到IO操作完成: 是内核通知我们何时进行启动IO操作,而实际的IO操作需要当前进程本身阻塞完成: 包括:阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型 ...
- Java IO 学习(一)同步/异步/阻塞/非阻塞
关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...
随机推荐
- eclipse git提交项目以及down项目大致步骤
down git项目步骤: 复制了url之后,import projects项目选中from git ,会出现如下截图,信息会自动填充 填好信息一直Next即可 完成之后,打开“Git Reposit ...
- Linux 常用软件清单
Linux 常用软件清单 下面是Linux环境的一些软件(有些只是关键字,直接搜素即可): arch 系列的是 pacman -Ss <关键字> debian 系列的是 apt searc ...
- Linux下安装mysql时报错:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:Data::Dumper
如题,安装mysql过程中,执行scripts/mysql_install_db --user=mysql命令时报错: FATAL ERROR: please install the followin ...
- tp6 不能使用vendor
从thinkphp 5.1.x后vendor的使用方法发生变化,文档又没有详细说明.官方真的太坑了! 在thinkPHP 5.1.X后新版取消了Loader::import方法以及import和ven ...
- 系综的实现方式(nve、nvt、npt)
一.NVE系综 更新位置和速度,v和e恒定. 二.NVT系综 几种实现的方式: 如: fix 1 all nve #更新位置和速度,e和V保持不变.若只有这个命令,就只nve系综,如果和控温命令一起, ...
- Hadoop 3.x 与Hadoop 2.x 的区别和优化点
Hadoop 3.x 与Hadoop 2.x 的区别和优化点 通用性 1.精简Hadoop内核,包括剔除过期的API和实现,将默认组件实现替换成最高效的实现(比如将FileOutputCommitte ...
- jmeter中jdbc连接数据库——(一)
所有jmeter基本组件功能本文不做介绍.jmeter要链接mysql数据库,首先得下载mysql jdbc驱动包 (注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致 ...
- 如何满足EN50128软件安全认证标准?
导语 EN 50128是为铁路行业的特定需求量身定制的功能安全标准.其标题为“铁路应用—通信,信号和处理系统—铁路控制和防护系统软件”.遵守该标准的要求对于铁路软件开发是至关重要的.因此,必须了解什么 ...
- 多商铺平台手机电脑自适应宣传展示平台店铺javassh项目代码线上
部署运行:eclipse 建议使用jdk 1.8 + ,Tomcat 8.0 + 系统介绍: 1.网站后台采用主流的 SSH框架 jsp JSTL,网站前台采用Angular jS框架 2.网站前端采 ...
- 在Mac上打开多个Unity实例
alias koa_unity="open -n /Applications/Unity\ 5.2.2/Unity.app" alias rob_unity="open ...