为了学习的目的,我想遍历模块中的所有任务 并输出关于它们的不同信息。对于这个任务 我需要锁定所有任务的列表(我也不确定是否应该这样做)。我在锁定tasklist_lock的内核代码中看到了一些示例 。但是这个符号 不能被模块使用。其出口被删除了 c59923a15c12d2b3597af913bf234a0ef264a38b提交。模块中tasklist_lock的替代方案?
是否有任何其他方式可以锁定任务列表呢?
为了学习的目的,我想遍历模块中的所有任务 并输出关于它们的不同信息。对于这个任务 我需要锁定所有任务的列表(我也不确定是否应该这样做)。我在锁定tasklist_lock的内核代码中看到了一些示例 。但是这个符号 不能被模块使用。其出口被删除了 c59923a15c12d2b3597af913bf234a0ef264a38b提交。模块中tasklist_lock的替代方案?
是否有任何其他方式可以锁定任务列表呢?
stop_machine()
引入空闲线程并禁用每个系统的CPU中的中断,除了执行用户定义的函数的那个函数作为参数传递给stop_machine()
。这相当于将每个自旋锁保持在内核中,并且只要用户定义的函数运行就会导致系统冻结。不用说,它对性能有很大影响,但也提供了强大的一致性保证。
如果您只想读取系统任务中的数据,并且您不介意绝对精确(一致性),则可以在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();
您可以使用stop_machine()如下:
int for_each_task(void * data)
{
struct task_struct * g, * p;
do_each_thread(g, p) {
// do the work
} while_each_thread(g, p);
return 0;
}
...
stop_machine(for_each_task, NULL, NULL);
...
stop_machine
接口,将暂停所有的任务,并把高优先级的线程上的每个处理器。所以,在回调时没有其他任务被安排。
你正在使用哪个内核版本? – ciphor 2012-01-31 08:30:22
@ciphor上一个稳定版本 - v3.2.2。但我不明白它是如何产生影响的。 – Beginner 2012-01-31 08:55:46