我正在编写一个在 SMP(centos 6.4)上处理网络数据包的系统。我正在使用 cpu 隔离并在某些内核上运行单个 ktrhead,如果我不通过调用 schedule() 不时释放 cpu 系统获取看门狗,我试图移动到实时优先级并在特定时间内释放 CPU,例如每 450 个 jiffies 50 个 jiffies,但它会卡住。我的问题,softirq kthread 是否更新了 jiffies?如果我不释放 cpu,防止 jiffies 增加?
谢谢
我正在编写一个在 SMP(centos 6.4)上处理网络数据包的系统。我正在使用 cpu 隔离并在某些内核上运行单个 ktrhead,如果我不通过调用 schedule() 不时释放 cpu 系统获取看门狗,我试图移动到实时优先级并在特定时间内释放 CPU,例如每 450 个 jiffies 50 个 jiffies,但它会卡住。我的问题,softirq kthread 是否更新了 jiffies?如果我不释放 cpu,防止 jiffies 增加?
谢谢
当定时器中断被触发时,jiffies 会增加。定时器中断被系统定时器击中。它不是由 softirq kthread 更新的。
在 x86 中,系统定时器是通过可编程中断定时器 (PIT) 实现的。PPC 通过递减器实现它。
从您的线程的描述来看,您的线程似乎正在锁定 cpu,因此根据其超时预期会命中看门狗。在大多数系统中,jiffies 是 10ms;但是您可以通过检查 HZ 的值来检查它的值:HZ 值将在一秒钟内给出定时器中断的数量,因此一秒钟内会有 HZ jiffies。
在您的情况下,每当您释放 CPU 时,看门狗线程就有机会运行并检查当前的 jiffies,然后与上次运行时存储的 jiffies 值进行比较:如果发现差异大于或等于看门狗超时,如果已配置,它会命中并重置系统。