如何从另一个进程/内核线程中抢占一个进程?

时间:2013-05-21 09:22:55

标签: linux linux-kernel kernel

我有一个进程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并调用调度吗?这是一个黑客,它会工作吗?你看到我遗失的任何干净的方式吗?

是否有一些信号我可以发送P要求它抢占?

1 个答案:

答案 0 :(得分:2)

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

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

我建议你接受Damon的建议并重新设计,因为没有真正干净的方法去做你要求的事情,但有许多干净的方法来同步两个过程。