2008-12-23 3 views
3

Я искал информацию для общей реализации очередей ядер, то есть структур данных с первым-в-первом-выводом. Я думал, что может быть один, поскольку это, вероятно, то, что обычно используется, и есть стандарт для связанных списков (в виде структуры list_head). Есть ли какая-то стандартная реализация очереди, которую я не могу найти, или, возможно, обычной практикой просто использовать связанные списки в качестве очередей и надеяться на лучшее?Очереди в ядре Linux

+0

, что вы имеете в виду "надеяться на лучшее? Чего вы боитесь? – Javier

+0

Эх, это выражение. Я использую его здесь, так как я, кажется, что-то использую таким образом, что это не совсем норма. –

+0

Связанные списки имеют операции, которые нет в очереди FIFO (перечисление списка, удаление элементов из середины и т. Д.). Поэтому я опасаюсь, что если список используется как очередь без инкапсуляции, то в будущем какой-то дурак (возможно, я) не сможет наблюдать ограничение FIFO. –

ответ

5

Вы правы, ядро ​​Linux обычно использует связанные списки для реализации очередей. Это имеет смысл, потому что связанные списки предлагают требуемое поведение. Смотрите этот пример из ядра/workqueue.c:

INIT_LIST_HEAD(&wq->list); 
    // ... 
    case CPU_UP_CANCELED: 
      list_for_each_entry(wq, &workqueues, list) { 
        if (!per_cpu_ptr(wq->cpu_wq, hotcpu)->thread) 
3

Вы, кажется, путают абстракции (очередь ФИФО) с реализацией (связанный список). Они не являются взаимоисключающими - на самом деле очереди чаще всего реализуются как связанные списки - нет «надежды на лучшее».

7

Вы ищете include/linux/kfifo.h? Из рубрики:

Простая реализация FIFO ядра.

В любом случае это довольно новое, поэтому нетрудно найти прямое использование связанных списков. Кроме того, они имеют совершенно другую реализацию (FIFO реализованы как циклические буферы), поэтому у них есть разные приложения.

Обратите внимание, что они также разработаны с многопоточным использованием (думайте в очереди производителей/потребителей), но вы можете использовать их без блокировки с помощью __kfifo_put/__ kfifo_get.

Btw: Я помню, что узнал о них на lwn.net - закладок: lwn.net/Kernel/Index, и прочитайте запись о kfifo :-).

От вашего разработчика экс-ядра, Blaisorblade

Смежные вопросы