Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >也谈应用程序级的同步、异步、阻塞、非阻塞

也谈应用程序级的同步、异步、阻塞、非阻塞

作者头像
chain
发布于 2018-08-02 07:13:07
发布于 2018-08-02 07:13:07
1.1K0
举报

同步IO(synchronous)

异步IO(asynchronous)

阻塞IO(blocking)

非阻塞IO(non-blocking)

这几个经常出现的词汇很容易会引起大家的误解,第一次接触相关词汇是在课上,当时上操作系统的老师说得比较模糊(阻塞==同步,非阻塞==异步),当时觉得挺对 的,

初学者一般来说很会这么认为。但是后来随着对操作系统的进一步认识和学习,以及参考其他的一些资料,今天就在这帮大家理一理这四个概念以及相关的联系。

阻塞,在操作系统的书中都有相关的概念,简单的说 就是线程或是进程在执行过程中暂停,以等待某个条件的触发。

同步,指的就是两个或多个以上的进程保持相互的制约,一般多用在 通信当面的词。

接下来就说一上述困扰大家的四个词之间的相互关系:

同步阻塞IO:

应用场景:

应用程序A执行了一个read操作,然后这个read操作会去进行一个系统调用(system call),转交给内核,应用程序便会等待(阻塞),kernel便会开始执行系统调用,执行

完成之后将结果返回给应用程序,应用程序得到结果后就不在阻塞,继续后续的过程。

打个比方就是,你去医药窗口花钱买药 ,告诉药剂师要买一盒感冒药,药剂师就去帮你去里面的药架上找感冒药,你就站在窗口等,他找到后拿到窗口给你,其实就是一

个同步阻塞的过程。

同步非阻塞IO:

应用场景:

在linux下,应用程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。也就是说,当应用程序设置了O_NONBLOCK之

后,执行write操作,调用相应的system call,这个system call会从内核中立即返回。但是在这个返回的时间点,数据可能还没有被真正的写入到指定的地方。也就是说,kern

el只是很快的返回了这个 system call(这样,应用程序不会被这个IO操作blocking),但是这个system call具体要执行的事情(写数据)可能并没有完成。而对于应用程序,

虽然这个IO操作很快就返回了,但是它并不知道这个IO操作是否真的成功了,如果想知道,需要应用程序主动地去问kernel。

打个比方就是,你去邮局寄东西(东西很重要,对方拿到后你才能够继续进行工作),填好 单子付完款后,邮局工作人员会告诉你,大概要三天到(邮局今天的囤货太多

了,改到明天发),然后你本人肯定就回去了,在家里等啊等,并且时不时的查查到哪了(不能继续进行下面的工作啊,诶 :( )。终于三天后收件人发信息说已经收到,你终

于可以开展你的下一步工作了 :)

异步阻塞IO:

应用场景:

在linux下,通常用select/poll来实现这种机制。应用程序要执行read操作,因此调用一个system call,这个system call被传递给了kernel。但在应用程序这边,它调用syst

em call之后,并不等待kernel返回响应,这一点是和前面两种机制不一样的地方。这也是为什么它被称为异步的原因。但是为什么称其为阻塞呢?这是因为虽然应用程序是一

个异步的方式,但是select()函数会将应用程序阻塞住,一直等到这个system call有结果返回了,再通知应用程序。也就是说,“在这种模型中,配置的是非阻塞 I/O,然后使用

阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。”所以,从IO操作的实际效果来看,异步阻塞IO和第一种同步阻塞IO是一样的,应用程序都是一直等到IO操作成功之后

(数据已经被写入或者读取),才开始进行下面的工作。异步阻塞IO的好处在于一个select函数可以为多个描述符提供通知,提高了并发性。

打个比方就是,一个银行柜台,现在有10个人想存钱。按照现在银行的做法,一个个排队。第一个人先填存款单,然后提交,然后柜员处理,然后给回执,成功后再轮到

下一个人。大家应该都在银行排过对,这样的流程是很痛苦的。如果按照异步阻塞的机制,10个人都填好存款单,然后都提交给柜台,提交完之后所有的10个人就在银行大厅

等待。这时候会专门有个人,他会了解存款单处理的情况,一旦有存款单处理完毕,他会将回执交给相应的正在大厅等待的人,这个拿到回执的人就可以去干其他的事情了。

而前面提到的这个专人,就对应于select函数。

异步非阻塞IO:

应用场景:

应用程序提交read请求的system call,然后,kernel开始处理相应的IO操作,而同时,应用程序并不等kernel返回响应,就会开始执行其他的处理操作(应用程序没有被I

O操作所阻塞)。当kernel执行完毕,返回read的响应,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。

打个比方就是,上述邮局寄东西,你寄完东西后不需要干等着,而可以干别的事情,等到收件人给你发收件信息后,你在回过头干之前没干完的工作。

总的来看的话,对于同步和异步,指的都是应用程序级的,而所谓的阻塞和非阻塞的话,指的是在内核调度进程或线程方面的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013年10月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java|网络IO之同步、异步、阻塞、非阻塞
最近在看《大型分布式网站架构-设计与实践》这本书时,文中提到阻塞式IO,其实之前我在看一些书籍时也经常听到同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO这些词。 那么同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别呢? 一、网络IO操作过程 对于一个网络IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的过程process (or thread),另一个就是系统
黄小怪
2018/05/21
3K3
【i.MX6ULL】驱动开发9——Linux IO模型分析
前面两篇介绍按键的文章,无论是用GPIO来读取,还是用中断的方式,其应用程序通过循环读取的方式获取按键值,都会使得CPU的占用率很高。本篇先来介绍Linux中几种的I/O模型,以后使用这类方式进行按键值的读取,可以极大降低CPU的使用率。
xxpcb
2021/12/01
6880
【i.MX6ULL】驱动开发9——Linux IO模型分析
同步、异步、阻塞、非阻塞
同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。
菲宇
2019/06/13
3.1K0
深入理解--异步和非阻塞同步和阻塞异步和非阻塞
异步和非阻塞的概念实际上已经出现了很长一段时间。但是异步真正开始流行起来,是因为AJAX技术逐渐成为主流的web开发技术。非阻塞的概念真正流行起来,是当java引入NIO,也可以称作非阻塞IO的API,开始走进主流的开发人员的视线,真正流行起来,也可以认为是node.js带来的。
desperate633
2018/08/22
1.1K0
IO - 同步,异步,阻塞,非阻塞
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。 本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”,Stevens在这节中详细说明了各种IO的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。本文中的流程图也是截取自参考文献。
后端技术探索
2018/08/09
2.3K0
同步异步与阻塞非阻塞
标题有点简单粗暴,直接用了本文要介绍的几个概念。本来想取个高大上一点的标题,但是感觉主题不那么明了。
windealli
2018/07/21
2K0
同步异步与阻塞非阻塞
聊聊同步与异步、阻塞与非阻塞、I/O模型
程序员:假如我们执行A,B两个IO操作的时候,如果必须等待A完成后才能执行B那么这个就是
咻一咻
2020/05/29
1.3K0
一种理解同步/异步,阻塞/非阻塞,Linux IO 模型,select /poll /epoll 的方法
吕力
2017/07/24
7K4
一种理解同步/异步,阻塞/非阻塞,Linux IO 模型,select /poll /epoll 的方法
对于同步、异步、阻塞、非阻塞的几点浅薄理
一、同步与异步 同步/异步, 它们是消息的通知机制(都是通过状态、通知、回调函数来返回结果) 1. 概念解释     同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
py3study
2020/01/19
5880
总是搞不懂的同步异步,阻塞非阻塞
最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者。
码哥字节
2020/05/17
9170
阻塞和非阻塞、同步和异步的讲解
我个人对于网络编程有着强烈的兴趣,最近打算开始看 muduo 的网络库,了解到其构建了基于 Reactor 的事件处理机制,本质涉及 I/O 多路复用的知识。为了后续的理解,首先搞清楚一个有无数讲解却又令人费解的概念:阻塞和非阻塞、同步和异步。
泽霖
2023/11/26
2140
网络IO之阻塞、非阻塞、同步、异步总结
1、前言   在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和书总结一下,加以区别,加深理解。 2、数据流向   网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分
李海彬
2018/03/23
1.1K0
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
黄规速
2022/04/14
2.8K0
socket阻塞与非阻塞,同步与异步、I/O模型
同步/异步,阻塞/非阻塞
什么是同步和异步 同步和异步是针对应用程序和内核的交互而言的, 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。 什么是阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 同步/异步与阻塞/非阻塞的区别 同步与异步:针对数据访问的方式,程序是主动去询
欠扁的小篮子
2018/04/11
3.3K0
socket阻塞与非阻塞,同步与异步、I/O模型
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:
用户6280468
2022/03/21
3.4K0
socket阻塞与非阻塞,同步与异步、I/O模型
理解同步异步与阻塞非阻塞——傻傻分不清楚的终极指南
同步异步与阻塞非阻塞这两组概念在 IO 场景下非常常见,由于他们在表现出来的效果上很相似,很容易造成混淆和困扰,要想理清楚这两组概念首先需要认识到这两组概念强调的是不同维度的事。
菜皮日记
2024/08/05
1320
同步与异步 阻塞与非阻塞
          1)排队分为在队伍中等待和取号等待两种。在队伍中等待,那么我就需要不断的看看前面的人办理完了没。如果选择取号等待,那么我就比较安逸了,我就不必去管前面的人是否已经办理,我只需要等待别人通知我就行了。也就是这两种方式,一种是自己去做,一种是别人来做。二者孰优孰劣,一目了然。
用户3003813
2018/09/06
1.2K0
30分钟了解同步,异步,阻塞,非阻塞
同步,异步,阻塞,非阻塞,在一些场景下,它们是同一个概念的不同名字;在另一些场景下,它们是不同的概念。
SOEZ
2018/07/21
2.1K0
30分钟了解同步,异步,阻塞,非阻塞
阻塞 & 非阻塞 | 同步 & 异步
一个典型的IO操作包括了两个阶段,数据准备和数据读写。比如说现在要使用 recv 执行一个读操作,数据就绪就是远端是否有数据可读。
看、未来
2021/10/09
3K0
阻塞 & 非阻塞 | 同步 & 异步
关于IO的同步,异步,阻塞,非阻塞
上次写了一篇文章:Unix IO 模型学习。恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现。中途正好讨论了网络IO的同步、异步、阻塞、非阻塞的概念,当时讲下来,大家的理解各不相同,各执己见。搜索了网络上的一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。 虽然网络上充斥了大量关于同步、异步、阻塞、非阻塞的文章,但大都是抄来抄去,没有一个权威的说法。但我找到了这一篇文章,该文章引用了《UNIX网络编程 卷1》的介绍,
小小科
2018/05/02
8230
推荐阅读
相关推荐
Java|网络IO之同步、异步、阻塞、非阻塞
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档