同步和异步的概念
来源:互联网 发布:优化系统 编辑:程序博客网 时间:2024/06/07 18:42
前言
今天在看安卓广播机制的时候,无意中看到一个一本书中提到标准广播是异步执行的广播,而有序广播是同步执行的广播。虽然以前对同步和异步通信有所了解,但是感觉在不同的应用场景下总是容易混淆,所以今天查了查资料,做个小总结。
1. 困惑?
安卓的标准广播机制是一种完全异步执行的广播,异步的特点在于广播发出之后,所有的广播接收器都能在几乎同一时刻接受这条广播消息,没有先后顺序,不会被截断。
有序广播则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接受这条广播消息。当这个接收器完成逻辑任务之后,才会继续向后传递广播,优先级高的接收器最先收到消息,并且前面的广播接收器可以截断广播。
可以看出,这里的同步和异步是根据广播接受者的特点,或者说广播的特点来区分的。我们先不深入讨论,先了解同步异步的基本概念。
2. 概念详解
正如上面所说,同步和异步在不同场景下的区分特点可能是不同的,我先给出最常见的同步和异步的概念。
2.1. 进程中的同步和异步
(1)进程同步
进程同步就是发出一个功能调用时,在没得到结果之前,该调用就不返回。也就是做完一个任务才会继续下一个任务(此处就和安卓广播的同步和异步有点相似了)。同步调用是一种有序执行的过程。最常见的同步调用就是sendMessage(),这个函数发消息给对方,最对方收到消息并处理,处理函数得到结果之前,这个函数不会有返回,等待处理的结果。只有对方处理完毕,该函数才会把处理函数得到的结果返回。
(2)进程异步
不管在什么场景下,同步和异步都是相对的。对于进程来说,异步就是意味着我只是调用,我启动了进程A,A中又调用B进程,然后不管B处理的结果有没有返回,A都能够继续执行下去。以异步IO操作为例,当代码需要执行一个十分耗时的IO操作时,它只发出一个IO读写指令,则CPU会对存储器进行操作,而不管这个操作是否完成(IO操作很费时),代码进行执行其他的操作。(同步IO则在IO操作时,其他代码等待操作结果)
所以异步是提高性能的一个手段,但是异步也带来一些危害,比如多线程时,异步执行导致多个线程的操作顺序不可预测,从而是结果不可预测,此时需要进行线程同步,一个线程操作资源时,其余线程必须等待。另外,在异步操作时,多个线程和进程间需要通过通知来传递消息。
2.2. 传输中的同步和异步
这个是通信中的概念,我有点忘了,网上查的。。。
(1)异步传输
通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是可变的,并不需要严格地限制它们的时间关系。起始位对应于二进制值 0,以低电平表示,占用 1 位宽度。停止位对应于二进制值 1,以高电平表示,占用 1~2 位宽度。一个字符占用 5~8位,具体取决于数据所采用的字符集。例如,电报码字符为 5 位、ASCII码字符为 7 位、汉字码则为8 位。此外,还要附加 1 位奇偶校验位,可以选择奇校验或偶校验方式对该字符实施简单的差错控制。发送端与接收端除了采用相同的数据格式(字符的位数、停止位的位数、有无校验位及校验方式等)外,还应当采用相同的传输速率。典型的速率有:9 600 b/s、19.2kb/s、56kb/s等。
异步传输又称为起止式异步通信方式,其优点是简单、可靠,适用于面向字符的、低速的异步通信场合。例如,计算机与Modem之间的通信就是采用这种方式。它的缺点是通信开销大,每传输一个字符都要额外附加2~3位,通信效率比较低。例如,在使用Modem上网时,普遍感觉速度很慢,除了传输速率低之外,与通信开销大、通信效率低也密切相关。
(2)同步传输
通常,同步传输是以数据块为传输单位。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列 (如16位或32位CRC校验码),以便对数据块进行差错控制。所谓同步传输是指数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时间关系。
2.3. 阻塞中的同步和异步
阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态。这里主要是为了方便记忆才放在一块说。
(1)阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
阻塞调用和同步调用是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
socket接收数据函数recv是一个阻塞调用的例子。
当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。
(2)非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
2.4. 同步和异步以及阻塞和非阻塞的区分
同步和异步以及阻塞和非阻塞的概念极易混淆,我做一些简单的区分说明:以去银行办业务为例
(1)同步阻塞
老老实实排队(阻塞),没得说,并且只能站在那排队,不能干其他的(同步),甚至不能玩手机。。。因为是同步执行,当排队这件事没完成,其余的事也不能干。
(2)异步阻塞
同样是排队(阻塞),但你你可以领个排队号。但是问题在于,在排队这件事情结束前,虽然你不用站在那排队,但你也不能离开,只能等待消息被触发(喊号),所以异步就是不等排队完成而做其他的,但是排队是必须的。
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息被触发时被阻塞.
(3)非阻塞同步
一边做其他的(非阻塞),一边等待排队(需要你自己去查看)。可能你觉得现实中很不错,实际上程序执行过程中,由于需要不断查看触发消息,需要来回切换,造成消耗过大,效率底下,你可以想象两个老板一会让你做这个,一会让你做那个。。。内心是崩溃的。。。
(4)非阻塞异步
没话说,效率高,VIP会员,你好好打电话,等到你了柜台会叫你的。(消息触发机制)
只需要告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下(注册一个回调函数),
那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
3. 解惑
现在回头看安卓的疑惑就很明白了,其实广播的同步和异步并不是指发多少个,其实就是说当异步时,我发了一个广播,因为不需等待结果,所以我继续发给别人,从而造成了几乎同时发给所有人,而同步则是一次一个,等待结果。
- 异步和同步的概念
- 同步和异步的概念
- 同步和异步的概念
- 同步和异步的概念
- 同步和异步的概念
- 同步和异步的概念
- 同步和异步的概念
- 同步和异步概念
- 同步和异步概念的解释
- 编程中同步和异步的概念
- 网络编程-同步和异步的概念
- 同步异步的概念
- 异步和同步概念理解
- 同步与异步的概念
- 同步与异步的概念
- 同步与异步的概念
- 同步与异步的概念
- 同步与异步的概念
- 创建用户界面线程
- Tips about how to do mornings
- Ubuntu 14.04下安装GitLab指南
- 机器学习入门阶段程序员易犯的5个错误
- Unicode字符集和多字节字符集关系
- 同步和异步的概念
- 第2章 活动的生命周期
- 探寻main函数的标准写法,以及获取main函数的参数、返回值
- linux编程之GDB调试
- std::vector::iterator重载了下面哪些运算符 http://www.nowcoder.com/profile/380772/test/2198787/1141?onlyWrong=0
- linux下php无法创建文件夹和文件的问题
- 深入分析JavaWeb Item30 -- 使用JDBC进行批处理
- 静态代码块、代码块、构造方法、普通方法&父类、子类顺序
- SonarQube代码质量管理平台安装与使用