网络编程中的同步与异步

      网络编程中有三对关键的词,单线程与多线程、阻塞与非阻塞、同步与异步,同步与异步一直是比较疑惑的地方。
以前认为,同步就是阻塞socket,异步就是非阻塞socket,现在发现这样理解很片面的,其实好多地方有同步异步的概念。

数字电路中的同步与异步是针对时钟来说的

同步时序逻辑电路:各触发器有相同的时钟脉冲,时钟脉冲到来时所有触发器状态同时改变
异步时序逻辑电路:没有统一的时钟脉冲,所有触发器的状态转换不一定发生在同一时刻,某些触发器的状态转换有可能会延迟。

在通信原理中也有同步与异步的概念

同步传输:发送方与接收方以相同的速率进行收发,不需要对每个字符进行开始和停止的操作
异步传输:每次异步传输的信息都以一个起始位开头,在传输结束时,一个停止位表示该次传输信息的终止。

在生活中也有同步与异步的例子

厨房里做大饼的大厨把大饼抛给做销售的大婶,他可以以两种方式来抛

同步抛大饼:大叔头都不抬,以一定的频率抛,大婶也没抬头,以相同的频率接。
异步抛大饼:大叔对大婶说,要抛了,大婶做好准备,大叔才抛出大饼。

可以看到,同步是以相同的频率来达成协作,异步是以通知的方法来达成协作。

在网络编程中

阻塞与非阻塞只是针对线程而言,在等待IO的时候是挂起还是继续做别的事情。同步与异步是指IO设备与CPU的协作方式,而不是发送方与接收方的协作方式,由于CPU的运算速度很快,跟IO设备不是一个数量级的,因此同步socket就会使线程一直等待(当然CPU不会忙等,这关系到线程同步问题)。异步socket会以通知的方式与CPU进行协作,当IO事件到来时线程会收到通知,异步体现在这里,而不是非阻塞socket。

原文地址:https://www.cnblogs.com/panyihua/p/3930523.html