我有一个进程P和一个内核线程KT。我想同步P与KT的执行。 KT基本上是一个事件处理程序。但我的要求是KT不应该继续处理事件,如果P正在运行。所以我需要暂停P,然后继续在KT中进行事件处理并恢复P.因此,我的问题是,从KT开始,我该如何强制抢占P?稍后恢复时,我可以使用wake_up_process()。如何从另一个进程/内核线程中抢占一个进程?
对于调度进程,常用的技巧是将状态设置为TASK_INTERRUPTIBLE并调用schedule()。如果我保存了task_struct指针P,然后从KT开始安排P,我将P(而不是当前)的状态设置为TASK_INTERRUPTIBLE并调用调度?这是一个黑客,它会工作吗?你看到我失踪的任何干净的方式吗?
是否有一些信号可以发送P让它抢占?
如果需要同步,为什么不使用同步原语(例如futex)而不是一些晦涩的技巧?在需要处理的时候阻止进程并将其唤醒。 – Damon
'SIGSTOP'(因为你问的信号)是相似的 - 为什么应用这种黑客?使用多个线程意味着并行性(否则它并没有太大的意义 - 如果线程只能独占运行,那么也可以使用单个线程来处理所有事情)。所以,让消费线程(应用程序)阻塞在futex或eventfd上(如果你喜欢,可以通过epoll),而生产者(内核线程)在有需要时做出通知。它也不太容易失败。 – Damon
谢谢达蒙。我重新设计使用锁而不是黑客。 – spa