linux - 模块中 tasklist_lock 的替代方案?

标签 linux linux-kernel

出于学习目的,我想遍历所有任务 在一个模块中并输出关于它们的不同信息。对于这个任务 我需要锁定所有任务的列表(我也不确定是否应该这样做。)。我见过一些例子 在内核代码里面锁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/

相关文章:

linux - 搜索读取虚拟内核内存的隐藏模块?

c - 如何在两个 Linux 模块之间共享代码?

linux - 系统脚本

linux - 如何从 inode /路径名中找到一个 dentry?

php - 通过服务器/代理

linux - Apache Mesos、Mesosphere 和 DCOS 之间有什么区别?

linux - mlock() 如何与休眠一起工作?

linux - 在 linux 内核中测量 TCP 的 RTT

c++ - 如何让写时复制在 Linux 上的共享内存上工作

linux - 系统重启后 Linux 中的服务自动启动