写作缘由
在计算机领域,经常会遇到“同步”(synchronous)和“异步”(asynchronous)两个术语。而且它们还出现在不同的上下文中。我好奇“同步”和“异步”到底是什么意思,以及它们的含义是否会随上下文变化而变化,我指的是本质上的变化。
这里总结两个出现术语“同步”和“异步”的场景:编程中的函数调用和体系结构中的异常。
函数调用中的“同步”和“异步”
有时候会遇到称某个函数是同步调用的或异步调用的。比如 JavaScript 中的异步调用。
我理解一般的函数都是同步调用的,也就是在这个函数执行完毕之前,不会执行该函数调用之后的代码。
那么所谓异步调用,也就是函数被调用执行后,不等这个函数执行完毕,就会执行该函数调用之后的代码。这时想必不止有一个程序流了,推测异步函数调用开启了新的线程或进程。
体系结构中异常的“同步”和“异步”
在学习 armv8 架构时,我再次遇到了同步异常和异步异常这两个概念,armv8 中的分类大概是这样的:
同步异常是在处理器执行指令的过程中产生的。
异步异常是在处理器外部产生的,比如时钟中断,这个中断信号是由处理器外的时钟产生的。
总结
表面上,上文中两个场景下的“同步”和“异步”描述的是毫不相干的内容,但本质上却是一致的。本质上,同步是指事件的发生与程序流有根本的联系,异步是指事件的发生与程序流根本上没有联系。比如“同步函数返回”这个事件发生在函数执行完毕,主程序将从这个事件开始继续执行,事件与程序流是有联系的;而“异步函数返回”这个事件和主程序执行到了哪里毫无关系。比如“同步异常”是在执行程序流中的特定指令时产生的,它的发生和程序流的执行有本质的联系;“异步异常”的发生是外界因素导致的,跟程序流执行到哪里无关。
术语“同步”和“异常”肯定还出现在其他上下文中,比如“进程同步与互斥”中的“同步”。对于“同步”和“异常”出现的各种情况,我难以考虑全面。但我不加证明的给出一个最根本,能解释一切的本质:同步是指两个或多个实体的动作是协同的,异步是指两个或多个实体的动作是无需协同的。