stop_machine()
вводит незанятые потоки и отключает прерывания в каждом из процессоров системы, кроме того, которое выполняет пользовательскую функцию, которую вы передаете в качестве аргумента stop_machine()
.Это эквивалентно удержанию каждой спин-блокировки в ядре и приводит к зависанию системы до тех пор, пока выполняется пользовательская функция.Излишне говорить, что это сильно влияет на производительность, но также обеспечивает надежные гарантии согласованности.
Если вы хотите просто прочитать данные из задач системы и не обращаете внимания на абсолютную точность (согласованность), вы можете выполнить итерациюсписок учета процессов в критическом разделе чтение-копирование-обновление (RCU) .Вы также можете проверить RCU в Википедии .
struct task_struct *iter;
rcu_read_lock();
list_for_each_entry_rcu(iter, &init_task.tasks, tasks) {
printf("The current task of the list is: %s\n.", iter->comm);
}
rcu_read_unlock();