Можно ли заблокировать задачу из пространства ядра? - PullRequest
2 голосов
/ 08 октября 2011

Мне интересно, есть ли способ заблокировать пользовательскую задачу из пространства ядра? Есть ли уже функция в ядре для этого? Я пытался посмотреть, но пока не нашел ничего очевидного.

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

В UP это довольно просто: установите состояние задачи на TASK_INTERRUPTIBLE и вызовите schedule(). Вы можете «возобновить» его позже, установив его состояние на TASK_RUNNING.

В SMP необходимо убедиться, что задача не выполняется на другом процессоре.

1 голос
/ 31 января 2012

См. Это:

http://lxr.linux.no/linux+v3.0.4/include/linux/sched.h#L242

 250/*
 251 * This serializes "schedule()" and also protects
 252 * the run-queue from deletions/modifications (but
 253 * _adding_ to the beginning of the run-queue has
 254 * a separate lock).
 255 */
 256extern rwlock_t tasklist_lock;
 257extern spinlock_t mmlist_lock;
 258

Итак, мы знаем, что эта блокировка предназначена для синхронизации доступа для обновления структуры планирования.Чтобы изменить статус выполнения задания, посмотрите пример:

http://lxr.linux.no/linux+v3.0.4/kernel/signal.c#L1812

1769                read_lock(&tasklist_lock); 
1809               __set_current_state(TASK_RUNNING); 
1810                if (clear_code) 
1811                        current->exit_code = 0; 
1812               read_unlock(&tasklist_lock

U вам просто нужно заблокировать / разблокировать tasklist_lock и установить статус.

...