我有一個進程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