如何查找所有可运行的进程

时间:2014-11-11 10:10:37

标签: linux linux-kernel kernel scheduler

我正在了解调度程序并尝试打印所有可运行的程序。所以我编写了一个内核模块,它使用for_each_process宏来迭代所有进程,然后打印出#34; runnable"州。但这似乎是一种愚蠢(而且效率低下)的方式。所以我考虑获取对所有正在运行的队列的引用,并使用他们的Red-Black-Tree来检查可运行的进程,但是找不到这样做的方法。

我发现每个CPU都有一个sched_class的列表stop_sched_class->rt_sched_class->fair_sched_class->idle_sched_class,每个CPU都有自己的运行队列。但无法找到一种方法来接触所有人。

我使用了使用tasks_timeline的模块来查找所有可运行的进程,以打印正在运行的队列的地址 - 似乎我有3个正在运行的队列(只有两个处理器)。

模块:

#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */
#include <linux/sched.h>

MODULE_LICENSE("GPL");

struct cfs_rq {
        struct load_weight load;
        unsigned int nr_running, h_nr_running;
};

void printList(void){
    int count;
    struct task_struct * tsk;

    count = 0;
    for_each_process(tsk){
        if(tsk->state)
            continue;
        printk("pid: %d rq: %p (%d)\n", tsk->pid, tsk->se.cfs_rq, tsk->se.cfs_rq->nr_running);
        count++;
    }
    printk("count is: %d\n", count);
}

int init_module(void)
{
    printList();

    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world proc.\n");
}

输出:

[ 8215.627038] pid: 9147 ffff88007bbe9200 (3)
[ 8215.627043] pid: 9148 ffff8800369b0200 (2)
[ 8215.627045] pid: 9149 ffff8800369b0200 (2)
[ 8215.627047] pid: 9150 ffff88007bbe9200 (3)
[ 8215.627049] pid: 9151 ffff88007bbe9200 (3)
[ 8215.627051] pid: 9154 ffff8800a46d4600 (1)
[ 8215.627053] count is: 6
[ 8215.653741] Goodbye world proc.

关于电脑:

$ uname -a
Linux k 3.13.0-39-generic #66-Ubuntu SMP Tue Oct 28 13:30:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ cat /proc/cpuinfo | grep 'processor' | wc -l
2

所以我的问题是:

  1. 如何以更好的方式打印所有可运行的进程?
  2. 如何制作和管理正在运行的队列?
  3. 正在运行的队列是否以某种方式相互关联? (如何?)

2 个答案:

答案 0 :(得分:0)

$ps -A -l并找到实例,其中提到了过程状态(R)和过程标志(1)。

答案 1 :(得分:0)

您可以在cmd下尝试此操作。

样本输出。

127:~$ ps -A -l | grep -e R -e D
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
1 S     0  1367     2  0  80   0 -     0 -      ?        00:00:01 SEPDRV_ABNORMAL
4 R  1000  2634  2569  2  80   0 - 794239 -     ?        00:25:06 Web Content
1 D     0 20091     2  0  80   0 -     0 -      ?        00:00:00 kworker/3:2
4 R  1000 21077  9361  0  80   0 -  7229 -      pts/17   00:00:00 ps