Tenloy's Blog

同步和异步解读及编程中的使用场景

Word count: 4.4kReading time: 14 min
2021/04/20 Share

一、同步

协调,实现步调一致。两个或几个随时间变化的量,在变化过程中(在时域序列上相对位置)保持一定的相对/约束关系(这个关系分很多种:可以是两者同时做指定的事、也可以是两者先后做指定的事等)。

比如:

  • 音画同步、动作同步等。指某人/事 同时产生,同时进行。
  • 云同步等。在时间上保持一致性与统一化的现象。
  • 同步。两部分任务之间按照 先后顺序进行。
    • 线程同步:一者暂停(在时域中是一个横线),等另一者执行完成,再继续

注意:

简单来说:同步就是一段时间内,规定同一时间标准的每一刻(注解1),每个模块(设备/部件/线程)分别应该完成什么(变化),且各模块的变化之间有一定的相对/约束关系(注解2)

  1. 当两个设备需要有同步关系的时候,需要在两个设备之间规定一个共同的时间参考(时钟)。即由同宽同距(同频同相)的时钟信号控制每个设备(部件/线程),分别完成相应的操作
  2. 这两(多)个量的变化之间可能没有联系,突出的是这两(多)个量一段时间段内随时间的变化过程之间的对应关系。比如上述第一个例子中两者的变化没有联系,而第二个例子中是一者的变化引起另一者的变化

二、异步

与同步概念相反,两(多)者在随时间变化过程中没有相对/约束关系

比如:

  • 异步:多线程异步、进程异步
  • 异步传输:一种通讯方式,对设备需求简单,异步双方不需要共同的时钟。

三、编程中的使用

在操作系统中:同步执行的代码的执行过程有顺序性。而并发带来的异步性,每个进(线)程的代码都以其相对独立的不可预知的速度向前推进。

在计算机中,同步异步常见的两处使用场景:

  • 线程同步、异步
  • 同步通信、异步通信(指的是计算机内部件之间的通信)
  • 同步传输、异步传输(指的是计算机网络中的数据传输,原理基本上与上相同,增加了一些内容,详见下文)

3.1 线程同步、异步

3.1.1 同步

线程之间存在一定的约束关系,在执行过程中,存在一定的前后顺序。可能是出于临界资源的占用,也可能是等待另一条线程执行结果的返回等原因,需要执行完前一个,才能再执行下一个,需要等待、协调运行

3.1.1 异步

紧贴上面的概念,异步可以解释为两(多)者之间在随时间的执行过程中,两者之间没有约束关系,相互独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送出去,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

对于「既是单线程又是异步」的语言比如 js,我们需要明白:

“单线程”在这里的意思不是指代码的执行过程中,只用到了一个线程。而是指开发者不需要去管多线程编程的实现,只需要基于事件去写顺序逻辑就好了,运行环境会保证你的JS代码、一些异步API的回调都只会在指定的那一个线程中先后执行(异步API所对应的耗时操作,运行环境会分配子线程去处理的)。

感觉JS的这个“单线程、异步”概念真的是…不友好,“线程无关”、“除主线程,其他线程对开发者透明”这些说法不都更好理解?

说到底,异步最终还是需要多线程、多进程等技术来实现,只不过这个可以不由语言来决定而是由运行环境自动分配,两个调用栈同时执行在同一个线程内, 无论如何也不可能。

3.2 同步通信、异步通信

总线通信控制主要解决通信双方如何获知传输开始和传输结束,以及通信双方如何协调如何配合,通常用4种方式:同步通信、异步通信、半同步通信、分离式通信。

  • 同步通信中通信双方由统一时标控制数据传送。即双方按统一的传输周期进行信息传输,双方按约定好的时序进行联络,在规定的时钟周期内分别完成相应的操作。
  • 异步通信中没有公共的时钟标准,不要求所有部件严格的统一操作时间,而是采用应答方式(又称握手方式),即当主模块发出请求信号时,一直等待从模块反馈回来响应信号后,才开始通信。
  • 异步通信的应答方式又可分为不互锁、半互锁和全互锁三种类型。不互锁方式通信双方没有相互制约关系;半互锁方式通信双方有简单的制约关系;全互锁方式通信双方有完全的制约关系。其中全互锁通信可靠性最高;

详见总线通信控制 ——《计组》

3.3 同步、异步传输

在网络通信过程中,通信双方要交换数据,需要高度的协同工作。为了正确的解释信号,接收方必须确切地知道信号应当何时接收和处理,因此定时是至关重要的。

在计算机网络中,定时的因素称为位同步。同步是要接收方按照发送方发送的每个位的起止时刻和速率来接收数据,否则会产生误差。

通常可以采用同步或异步的传输方式对位进行同步处理。

首先是两者的不同

同步传输 异步传输
同步 外同步 自同步(见底部总结)
传输格式 面向 比特的传输,每个信息帧中包含若干个字符( 单位是帧) 面向 字符的传输,每个字符帧只包含一个字符( 单位是字符)
时钟 要求接收时钟和发送时钟同频同相,通过特定的时钟线路协调时序 不要求接收时钟和发送时钟完全同步,对时序的要求较低
数据流 发送端发送连续的比特流 发送端发送完一个字节后,可经过任意长的时间间隔再发送

是否拥有同一个时钟序列进行工作,或者是以数据块为单位进行数据传输,是同步传输和异步传输之间的差别;

同步效率更高,更加适合对速度要求高的传输,当然这种通信对时序的要求也更高,硬件更复杂。

3.3.1 位同步

要求接收端根据发送端发送数据的起止时间和时钟频率,来校正自己的时间基准和时钟频率,这个过程叫位同步。可见,位同步的目的是使接收端接收的每一位信息都与发送端保持同步。

3.3.2 同步通信

同步通信是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,当接收端确认接收到同步字符后,发收双方建立同步,此后便在 同步时钟的控制下逐位发送/接收。

同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息,由同步字符、数据字符和校验字符(CRC)组成。(见上图)

  • 同步字符:位于帧的开头,用于确认数据字符的开始;
  • 数据字符:在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;
  • 校验字符:有1到2个,用于接收端对接收到的字符序列进行正确性的校验

同步这种方式中因为分组相比异步大得多,很长一段数据才会有额外的辅助位负载,所以效率更高,更加适合对速度要求高的传输,当然这种通信对时序的要求也更高。

随着数据帧中实际数据比特位的增加,开销比特所占的百分比将相应地减少。但是,数据比特位越长,缓存数据所需要的缓冲区也越大,这就限制了一个帧的大小。

另外,帧越大,它占据传输媒体的连续时间也越长。在极端的情况下,这将导致其他用户等得太久。

“同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。

3.3.3 异步通信

异步通信指两个互不同步的设备通过计时机制或其他技术进行数据传输。异步通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。基本上,发送方可以随时传输数据,而接收方必须在信息到达时准备好接收。

这种传输通常是很小的分组,比如一个字符为一组,为这个组配备起始位和结束位。所以这种传输方式的效率是比较低的,毕竟额外加入了很多的辅助位作为负载,常用在低速的传输中。

异步通信,是以字符或者字节为单位组成字符帧进行传输。字符帧格式中包括空闲位、起始位、资料位、奇偶校验位、停止位。(见上图)

以RS232协议规定为例,异步通信一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时:

  • 总是以“起始位”开始(低电平,逻辑值0),以“停止位”结束,字符之间没有固定的时间间隔要求。
  • 字符数据本身由5~8位数据位组成,接着字符后面是一位校验位(也可以没有校验位)
  • 最后是一位或一位半或二位停止位
  • 停止位后面是不定长的空闲位(处于逻辑“1”状态,表示当前线路上没有资料传送)。
  • 停止位和空闲位都规定为高电平(逻辑值1),这样就保证起始位开始处一定有一个下跳沿。

异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟 自同步的)。这样,只要发送端和接收端协商好字符帧格式和波特率,就可以由各自的时钟来控制数据的发送和接收。

举个例子,我们的键盘按下一个按键,发出一个字符信号,异步传输机制就会为它加上前后的辅助同步信息,帮助接收方识别到我们按下了哪一个按键。因为我们敲击键盘的节奏不固定,所以异步是一种很适合的方式

用于异步通信的连接在OSI(开放系统互连)参考模型的物理层中被定义。

“异步通信”是一种很常用的通信方式。

异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。

异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。

异步通信也可以是以帧作为发送的单位。接收端必须随时做好接收帧的准备。这时,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为 帧定界

帧定界还包含确定帧的结束位置,这有两种方法:

  • 一种是在帧的尾部设有某种特殊的比特组合来标志帧的结束
  • 在帧首部中设有帧长度的字段

需要注意的是,在异步发送帧时,并不是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同步)。

3.3.4 总结

1.异步通信方式的特点

异步通信是按字符传输的。每传输一个字符就用起始位来进行收、发双方的同步。不会因收发双方的时钟频率的小的偏差导致错误。

这种传输方式利用每一帧的起、止信号来建立发送与接收之间的同步。特点是:每帧内部各位均采用固定的时间间隔,而帧与帧之间的间隔时随即的。接收机完全靠每一帧的起始位和停止位来识别字符时正在进行传输还是传输结束。

(使用串口USART中的串行异步通信是一个代表)

2.同步通信方式的特点

进行数据传输时,发送和接收双方要保持完全的同步,因此,要求接收和发送设备必须使用同一时钟。

优点是可以实现高速度、大容量的数据传送;缺点是要求发生时钟和接收时钟保持严格同步,同时硬件复杂。

(SPI总线是一个典型代表)

3.对比:

可以这样说,不管是异步通信还是同步通信都需要进行同步,只是异步通信通过传送字符内的起始位来进行同步,而同步通信采用共用外部时钟来进行同步。所以,可以说前者是 自同步,后者是 外同步。同时,同步要求收发两端对时间的精确度要求很高,异步没有同步要求那么高。

自同步、外同步:

  • 同步传输:是发送端的发送、接收端的接收是同步的,在统一的时钟信号下进行,发一位,接一位。同步传输的数据格式是一种外同步方式所采用的数据格式。对这种方式,在发送的一帧数据中不包含同步字符。同步信号SYNC通过专门的控制线加到串行的接口上。当SYNC一到达,表明数据部分开始,接口就连续接收数据和CRC校验码。
  • 异步传输:发送端的发送、接收端的接收不用时钟同步。发送端发一个字符,接收端等接收到之后按字符的始、止位来实现自同步,处理一个字符。
4. 应用

在大量使用异步与同步传输的大型机/终端环境中

  • 异步传输用于传输来自用户周期性按键的终端的字符。接收系统知道等待下一次按键,即使这会花费较多的时间。
  • 相反,同步传输用作定期传输大量信息的大型系统之间的数据链路。协议为在公用电话系统上利用慢速链路而进行了优化,因此无关位将从传输中删除,并且时钟用于隔开字符。

Author:Tenloy

原文链接:https://tenloy.github.io/2021/04/20/Sync-Async.html

发表日期:2021.04.20 , 8:05 PM

更新日期:2024.04.07 , 8:02 PM

版权声明:本文采用Crative Commons 4.0 许可协议进行许可

CATALOG
  1. 一、同步
  2. 二、异步
  3. 三、编程中的使用
    1. 3.1 线程同步、异步
      1. 3.1.1 同步
      2. 3.1.1 异步
    2. 3.2 同步通信、异步通信
    3. 3.3 同步、异步传输
      1. 3.3.1 位同步
      2. 3.3.2 同步通信
      3. 3.3.3 异步通信
      4. 3.3.4 总结
        1. 1.异步通信方式的特点
        2. 2.同步通信方式的特点
        3. 3.对比:
        4. 4. 应用