出于学习目的,我想遍历所有任务 在一个模块中并输出关于它们的不同信息。对于这个任务 我需要锁定所有任务的列表(我也不确定是否应该这样做。)。我见过一些例子 在内核代码里面锁tasklist_lock。然而这个符号 不能被模块使用。它的导出被删除 c59923a15c12d2b3597af913bf234a0ef264a38b 提交。
有没有其他方法可以锁定任务列表?
最佳答案
stop_machine()
在系统的每个 CPU 中引入空闲线程并禁用中断,但执行您作为参数传递给 stop_machine()
的用户定义函数的 CPU 除外。 .这相当于在内核中持有每个自旋锁,只要用户定义的函数运行就会导致系统卡住。不用说,它对性能有很大的影响,但也提供了强大的一致性保证。
如果您只想从系统任务中读取数据并且您不介意绝对精确(一致性),您可以在 read-copy-update (RCU) 中遍历进程的会计列表。关键部分。您也可以查看 RCU in Wikipedia .
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();
关于linux - 模块中 tasklist_lock 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071749/