多线程应用程序中的直接内存访问(DMA)调度

时间:2012-02-27 20:21:56

标签: network-programming io linux-kernel linux-device-driver dma

我想使用DMA加速网络I / O(密集磁盘读取和通过Internet输出)。我想知道我是否有一个多线程应用程序,其中每个线程发出DMA传输如何由OS调度磁盘I / O和DMA传输?

据我所知,内核在没有用户程序的情况下从磁盘加载所需的数据部分并发出DMA传输。因此,磁盘调度程序将无济于事(只有一个内核进程始终访问磁盘)。我还希望在加载到内存中的数据时有任何内核工具来安排DMA传输吗?

1 个答案:

答案 0 :(得分:3)

网络驱动程序已经使用DMA加速传输。当您发出write时,内核将分配一个连续的物理内存块,并将数据从用户空间缓冲区复制到此内存中。在此阶段,内核将连接所有必需的以太网和TCP / IP标头。

然后,内核将向网卡发出DMA请求,要求它从该物理内存位置获取数据并将其加载到其内部缓冲区中。此时,您的write系统调用将返回。当网卡完成(并且数据正在从适配器中出来)时,网卡将向内核发出完成信号。

在Linux中,网络驱动程序通常是单线程的(有一些例外,但它很复杂),所以如果你尝试write一些数据并且驱动程序已经处于活动状态,它仍然会被复制到内核空间但是在网络驱动程序再次空闲之前不会执行DMA请求(当内核下次被通知DMA完成时会触发它。)

故事的士气是,这已经有效并且速度相当快,使用DMA加速和应用程序无需任何操作,它已经得到了解决。你可以加速的唯一部分是内核空间缓冲区中的副本,但由于这比实际的网络传输快得多(并且可以同时完成),因此它对吞吐量没有任何影响,只有延迟。 / p>

N.B。以上是对地方的粗略简化,如果您想了解有关特定部分的更多详细信息,请编辑您的问题,我会尽我所能。