没有直接内存访问(DMA)的异步编程将如何工作?

时间:2020-06-30 00:45:50

标签: c# asynchronous async-await dma

据我了解,异步编程不涉及线程。

根据我对Cleary理解,它只是通过在硬件中利用DMA引擎来获得性能。 其工作原理如下:

  1. 异步任务启动DMA引擎,以将数据从内存缓冲区复制到I / O设备。
  2. 任务返回并放弃对同步器的控制-或其任何要求-允许其他任务运行。
  3. 当DMA完成时,它会通过和通知操作系统。
  4. 然后操作系统以某种方式通知同步器该操作已完成。
  5. 最后,同步器将运行Async任务中的其余代码。

这是通过状态机在C#中实现的,这是一个简单的示例here(点数转到Lasse V. Karlsen


据我所知,如果IF DMA不可用,那么将在数据复制操作中使用涉及CPU的已编程I / O。除了PI / O之外,是否还有DMA的替代方案?

在这种情况下,异步等待如何获得性能?据我了解,我只是看到它以零增益增加了更多开销(状态机和中断的上下文切换)。

我的理解在多大程度上是正确的?

PS:我根本不使用C#,但是我发现该示例确实有用-我可以接受任何语言的示例。

0 个答案:

没有答案