【发布时间】:2011-08-31 14:16:51
【问题描述】:
我正在为没有 DMA 的设备编写驱动程序。
驱动程序启动设备操作,然后通过定期从设备中拉出 busy 标志等待操作完成。
该操作需要 4.5 或 9 微秒才能完成。在任何情况下,设备都不会提前完成操作。晚于指定时间(9 微秒)读取设备状态不会出现错误。
忙等待
在 Internet 上找到的所有内核文章都告诉忙等待这么短的时间间隔。他们认为任何休眠操作都会比busywait浪费更多的资源。就个人而言,我不喜欢在琐碎的等待上浪费周期。
安排/睡眠
我发现在目标硬件上,一个进程使用整个 CPU schedule() 调用导致其他线程(在空处理器上没有其他线程)在设备操作完成之前最多可以调用 4 次。当我添加更多虚拟进程来加载 CPU 时,我看到驱动程序中的调度调用为并发运行的进程提供了更公平的 CPU 分配。
我应该在等待设备时调用schedule() 甚至usleep_range(),还是应该依靠内核抢占来处理busywaits?
【问题讨论】:
标签: linux-kernel