2012-01-30 56 views
0

为了学习的目的,我想遍历模块中的所有任务 并输出关于它们的不同信息。对于这个任务 我需要锁定所有任务的列表(我也不确定是否应该这样做)。我在锁定tasklist_lock的内核代码中看到了一些示例 。但是这个符号 不能被模块使用。其出口被删除了 c59923a15c12d2b3597af913bf234a0ef264a38b提交。模块中tasklist_lock的替代方案?

是否有任何其他方式可以锁定任务列表呢?

+0

你正在使用哪个内核版本? – ciphor 2012-01-31 08:30:22

+0

@ciphor上一个稳定版本 - v3.2.2。但我不明白它是如何产生影响的。 – Beginner 2012-01-31 08:55:46

回答

1

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(); 
1

您可以使用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接口,将暂停所有的任务,并把高优先级的线程上的每个处理器。所以,在回调时没有其他任务被安排。