Подсчет тактов в Linux 2.4.14 - PullRequest
       11

Подсчет тактов в Linux 2.4.14

0 голосов
/ 15 января 2010

Я пытаюсь подсчитать общее количество тактов для каждого процесса (только когда он действительно запущен). Я вставил следующий код в schedule() (файл sched.h):

...
switch_tasks:
    prefetch(next);
    clear_tsk_need_resched(prev);
    if (likely(prev != next)) {
        rq->nr_switches++;
        rq->curr = next;

        /* My code start here*/
        if (next->start_count==1)
            next->start_run=jiffies;
        if (prev->start_count==1)
        {
            prev->total_running += (jiffies-prev->start_run);
            printk("total running = %lu, jif-start = %lu\n", \
            prev->total_running, jiffies-prev->start_run);
        }
...

Я добавил printk, потому что получил странные результаты. Вот некоторые из выводов:

Всего работает = 1522, JIF-Start = 1
общий пробег = 1522, jif-start = 0
общий пробег = 1523, jif-start = 1
общий пробег = 1, jif-start = 1
общий пробег = 0, jif-start = 0
общий пробег = 0, jif-start = 0
общий пробег = 0, jif-start = 0
общий пробег = 0, jif-start = 0

Это не имеет смысла для меня. Что-то не так с моим кодом?

1 Ответ

1 голос
/ 17 января 2010

Вывод трассировки показывает состояние для каждой задачи, поэтому может иметь смысл, если вы также напечатаете prev->pid, чтобы определить, о какой задаче вы говорите.

РЕДАКТИРОВАТЬ: ОК, если вас беспокоит получение "jif-start = 0": обратите внимание, что jiffies увеличивает только при каждом прерывании таймера, что, я думаю, почти наверняка каждые 10 мс для ядра 2.4.14. Вполне возможно (или даже вероятно), что процессы, связанные с вводом / выводом, могут проснуться, а затем очень быстро заблокировать ввод / вывод, что приведет к другому перепланированию до увеличения счетчика jiffy.

Возможно, что может быть в состоянии получить интервалы времени с более высоким разрешением от do_gettimeofday() (объявлено в <linux/time.h>), но фактическое разрешение, которое вы получите, зависит от платформы.

...