【发布时间】: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 转一次)。我猜内核中没有包含当前活跃用户的字段?如果没有,计算它们的最佳方法是什么?感谢您的回复。
-
感谢您的澄清。我不知道这个问题的答案。我的意图是指出这个问题并不完全清楚。我建议将其编辑到问题中。祝你好运!
-
如此多的非用户功能实际上在用户空间库(“共享对象”)中,而不是在内核中,我担心在任何给定时间找出内核中实际有多少用户或多或少是随机的并且非常不稳定。