Нужно какое-то объяснение о очереди ожидания ядра Linux - PullRequest
1 голос
/ 29 ноября 2011

Мне нужно написать какой-нибудь модуль ядра для моих университетских классов, и теперь я пытаюсь понять различные механизмы ядра, которые я должен использовать.Одним из них являются очереди ожидания .Я написал простой модуль, который регистрирует запись /proc и выполняет некоторую простую логику внутри его функции read:

DECLARE_WAIT_QUEUE_HEAD(event);

volatile int condvar = 0;
volatile int should_wait = 1;

int simple_read_proc(char *page, char **start, off_t offset, int count, int *eof, void *data) {
    printk(KERN_INFO "simple_read_proc from %i\n", current->pid);
    if(should_wait == 1) {
        printk(KERN_INFO "Waiting in %i\n", current->pid);
        should_wait = 0;
        wait_event_interruptible(event, condvar == 1);
        printk(KERN_INFO "Wait finished in %i\n", current->pid);
        condvar = 0;
        return sprintf(page, "%s", "The wait has finished!\n");
    } else {
        printk(KERN_INFO "Waking up in %i\n", current->pid);
        condvar = 1;
        wake_up_interruptible(&event);
        return sprintf(page, "%s", "Woke up the other process!\n");
    }
}

Вот что происходит, когда я пытаюсь дважды запустить cat на зарегистрированном /proc file:

Первый cat процесс ждет, пока второй разбудит его.Второй cat процесс делает именно это.Каждый процесс печатает то, что должен.Пока что все как запланировано.Но потом я смотрю на dmesg, и вот что я вижу:

[11405.484168] Initializing proc_module
[11413.209535] simple_read_proc from 6497
[11413.209543] Waiting in 6497
[11415.498482] simple_read_proc from 6499
[11415.498489] Waking up in 6499
[11415.498507] simple_read_proc from 6499
[11415.498514] Wait finished in 6497
[11415.498518] Waking up in 6499
[11415.498546] simple_read_proc from 6497
[11415.498550] Waking up in 6497
[11415.498554] simple_read_proc from 6497
[11415.498557] Waking up in 6497
[11415.498689] simple_read_proc from 6499
[11415.498694] Waking up in 6499
[11415.498753] simple_read_proc from 6497
[11415.498757] Waking up in 6497

Мой вопрос: почему функция simple_read_proc вызывается так много раз?Я думал, что это может быть потому, что cat вызывается read много раз, но я проверил это с помощью strace, и это не так - каждый cat вызывал read только один раз.

Iбыл бы признателен за объяснение этого явления.

1 Ответ

2 голосов
/ 29 ноября 2011

Посмотрите на комментарий в fs/proc/generic.c о том, «Как быть функцией чтения процесса».Поскольку вы не меняете eof, цикл в __proc_file_read будет вызывать вашу функцию read_proc несколько раз.

...