1

我有一个进程 P 和一个内核线程 KT。我想将 P 的执行与 KT 同步。KT 基本上是一个事件处理程序。但我的要求是,如果 P 正在运行,KT 不应继续处理事件。所以我需要暂停 P 然后继续在 KT 中进行事件处理并恢复 P。所以我的问题是,从 KT 开始,我如何强制抢占 P ?为了稍后恢复,我可以使用wake_up_process()。

对于调度一个进程,常用的技巧是将状态设置为 TASK_INTERRUPTIBLE 并调用 schedule()。如果我保存了 P 的 task_struct 指针,然后从 KT 调度 P,我将 P 的状态(而不是当前)设置为 TASK_INTERRUPTIBLE 并调用 schedule ,它会起作用吗?这是一个黑客,它会工作吗?你看到我想念的任何干净的方式吗?

有什么信号我可以发送 P 要求它先发制人吗?

4

1 回答 1

2

你不能做你所要求的。当然,您可以从在相同或不同 CPU/内核上运行的另一个进程/线程将状态设置为 TASK_INTERRUPTIBLE。但是您不能在另一个 CPU/内核上调用 schedule()(出于同样的原因,您不能在另一个 CPU/内核上调用任何其他函数)。考虑 schedule() 不将 CPU/核心 ID 作为参数,那么你如何告诉它 core1 应该重新调度?

针对这些类型的同步要求的另一种流行解决方案是使用实时优先级。这几乎和你提议的一样丑陋,但如果你有一个支持实时优先级的内核,它实际上可以工作。这里的想法很简单,进程 P 的优先级高于 KT,当它准备好运行时它会抢占 KT。使用 CPU 亲和性将两个进程强制到同一个 CPU/内核上(这很重要,否则它将不起作用!)。顺便说一句,这种方法没有任何真正的同步——当 P 和 KT 相互运行时,您严格依赖 RT 优先级来强制执行。

我建议你听从 Damon 的建议并重新设计,因为没有真正干净的方法来做你要求的事情,但是有很多干净的方法可以同步两个进程。

于 2013-05-21T15:22:37.817 回答