同步和异步的概念

来源:互联网 发布:优化系统 编辑:程序博客网 时间: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. 解惑

现在回头看安卓的疑惑就很明白了,其实广播的同步和异步并不是指发多少个,其实就是说当异步时,我发了一个广播,因为不需等待结果,所以我继续发给别人,从而造成了几乎同时发给所有人,而同步则是一次一个,等待结果。

1 0
原创粉丝点击