异步并不总是提高效率的,那什么时候用同步,什么时候用异步呢?
mingdu.zheng at gmail dot com
异步要解决的是CPU和I/O速度差异的问题,所以异步适合I/O远慢于CPU的情况,如果I/O仅稍慢于CPU或速度相当,那么异步并不会提高效能。
采用异步模式会有进出状态机或事件调度的开销,而同步模式没有这些开销,使用轮询式同步操作I/O的额外开销几乎为0。
适合异步的情况
如果CPU比I/O快两个数量级以上,那么异步比同步更好。比如某个系统CPU是100MHz,有个10MHz的SPI设备,假设SPI设备以字(16bit)为单位收发数据,那么每收发一个字大约需要160个CPU时钟,这种情况下,使用异步更佳。160个时钟中或许有60个被用在进出状态机或事件调度的开销中,多出来的100个时钟可以去做其它事情或者休眠以节约电能。
适合同步的情况
如果CPU仅比I/O快一个数量级,那么同步比异步更好。比如某个系统CPU是50MHz,有个50MHz的SPI设备,假设SPI设备以字节为单位收发数据,那么每收发一个字节大约需要8个CPU时钟,8个时钟还不够进出一个函数呢,这种情况下,使用同步更佳。如果使用异步模式,那么进出状态机的开销假设是60个时钟的话,那么异步模式反而比同步模式消耗了更多的时钟。
模棱两可的情况
如果CPU和I/O的速度比在一个数量级和两个数量级之间,那么使用同步或异步,其效果都差不多。如果一定要一决雌雄的话,就要分析异步模式引入了多少额外的开销,以及每个I/O请求占用多少时钟。还是扔硬币吧。
硬件加速器
硬件加速器可以批量处理I/O,CPU仅需要按批次处理,而不是按字节处理,DMA就是一种典型的硬件加速器。比如某个系统CPU是50MHz,有个50MHz的SPI设备,假设SPI设备借助DMA每次收发20字节,那么一次I/O请求需要160个时钟。DMA进一步扩大了CPU和I/O请求的速度差,把原先适合用同步方式操作的I/O变成了适合异步方式的I/O。还有一种硬件加速器是FIFO,借助FIFO可以一次操作多个数据。
总结
总而言之,同步还是异步并不绝对,要看哪个能节省更多的时钟。