У меня есть процесс P и поток ядра KT. Я хочу синхронизировать выполнение P с KT. KT - это в основном обработчик событий. Но мое требование состоит в том, что KT не должен продолжать обработку событий, если P запущен. Поэтому мне нужно приостановить P, а затем продолжить обработку событий в KT и возобновить P. Итак, мой вопрос: от KT, как я могу принудительно вытеснить P? Для возобновления позже я могу просто использовать wake_up_process().Как вытеснить один процесс из другого процесса/потока ядра?
Для планирования процесса обычно используется трюк, чтобы установить состояние как TASK_INTERRUPTIBLE и расписание вызовов(). Будет ли он работать, если у меня есть указатель task_struct из P, а затем из KT, чтобы запланировать P, я устанавливаю состояние P (вместо текущего) как TASK_INTERRUPTIBLE и расписание вызовов? Это хак, не так ли? Вы видите какой-то чистый способ, которого мне не хватает?
Есть ли какой-нибудь сигнал, который я могу отправить P, чтобы попросить его упредить?
Если требуется синхронизация, почему бы не использовать примитив синхронизации (например, futex) вместо некоторых неясных трюков? Имейте блок процесса и разбудите его, когда есть что обработать. – Damon
'SIGSTOP' (так как вы просили сигналы) схож - зачем применять такой взлом? Использование нескольких потоков подразумевает параллелизм (в действительности это не имеет особого смысла), если потоки только запускаются исключительно, вы можете использовать один поток для всего). Итак, пусть блок потребляющих потоков (приложений) на futex или на eventfd (через epoll, если хотите), и продюсер (поток ядра) сообщают, что когда что-то нужно делать. Это гораздо меньше, чем склонность к провалу. – Damon
Спасибо Дэймон. Я переработал, чтобы использовать блокировки вместо взлома. – spa