【问题标题】:how to count number of active users in kernel如何计算内核中的活跃用户数
【发布时间】:2012-05-24 07:48:11
【问题描述】:

我们使用的是内核版本 2.4-20,我们需要在内核模式下计算活跃用户的数量。目的是改变调度器,所以我们在 sched.c 中,修改 schedule() 函数。

我们所做的是统计 list_for_each 宏中的用户数。

list_for_each(tmp, &runqueue_head) {
    p = list_entry(tmp, struct task_struct, run_list);
    if (can_schedule(p, this_cpu)) {
        if (unique(p->uid)) add_new_user(p->uid);
        int weight = goodness(p, this_cpu, prev->active_mm);
        if (weight > c)
            c = weight, next = p;
    }
}

这基本上是将唯一用户添加到列表中。但是,我们得到随机结果。有没有具体的方法来解决这个问题?

谢谢。

【问题讨论】:

  • “随机结果”是什么意思?
  • 一开始我们在 goodness() 函数中统计用户,那里我们有绝对任意的数字(即使我们有 4 个用户同时运行,我们也可以得到 1 个用户)。在 sched() 中,我们似乎有一致的值,但我们不确定,因为 sched() 运行如此频繁,我们需要采样(每 5000 转一次)。我猜内核中没有包含当前活跃用户的字段?如果没有,计算它们的最佳方法是什么?感谢您的回复。
  • 感谢您的澄清。我不知道这个问题的答案。我的意图是指出这个问题并不完全清楚。我建议将其编辑到问题中。祝你好运!
  • 如此多的非用户功能实际上在用户空间库(“共享对象”)中,而不是在内核中,我担心在任何给定时间找出内核中实际有多少用户或多或少是随机的并且非常不稳定。

标签: linux kernel scheduler


【解决方案1】:

您可能想尝试在 for_each_task 宏中计算用户数。这会导致对具有因 I/O 或任何其他原因而被阻止的任务的用户进行计数。这应该会提供更好的结果,因为如果您使用运行队列,您无法保证能够统计运行交互式进程的用户。

【讨论】:

  • 这是有道理的。但是我们首先计算了善良函数中的用户,这可能是随机结果的原因。不过,我对此没有任何解释。由于某种原因,调度函数中的 for_each_task 有效。谢谢!
【解决方案2】:

这行得通吗?谁| awk ' { 打印 $1 }' |排序 -ud

【讨论】:

  • 我在内核中,我不能使用系统调用和终端程序。
猜你喜欢
  • 2021-11-28
  • 2021-03-06
  • 1970-01-01
  • 2015-02-25
  • 2021-10-26
  • 1970-01-01
  • 2020-10-06
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多