Я искал информацию для общей реализации очередей ядер, то есть структур данных с первым-в-первом-выводом. Я думал, что может быть один, поскольку это, вероятно, то, что обычно используется, и есть стандарт для связанных списков (в виде структуры list_head). Есть ли какая-то стандартная реализация очереди, которую я не могу найти, или, возможно, обычной практикой просто использовать связанные списки в качестве очередей и надеяться на лучшее?Очереди в ядре Linux
ответ
Вы правы, ядро 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)
Вы, кажется, путают абстракции (очередь ФИФО) с реализацией (связанный список). Они не являются взаимоисключающими - на самом деле очереди чаще всего реализуются как связанные списки - нет «надежды на лучшее».
Вы ищете include/linux/kfifo.h? Из рубрики:
Простая реализация FIFO ядра.
В любом случае это довольно новое, поэтому нетрудно найти прямое использование связанных списков. Кроме того, они имеют совершенно другую реализацию (FIFO реализованы как циклические буферы), поэтому у них есть разные приложения.
Обратите внимание, что они также разработаны с многопоточным использованием (думайте в очереди производителей/потребителей), но вы можете использовать их без блокировки с помощью __kfifo_put/__ kfifo_get.
Btw: Я помню, что узнал о них на lwn.net - закладок: lwn.net/Kernel/Index, и прочитайте запись о kfifo :-).
От вашего разработчика экс-ядра, Blaisorblade
- 1. Отдел в ядре linux
- 2. очереди сетевого стека Linux
- 3. Реализация правильной межмодульной синхронизации в ядре Linux
- 4. Алгоритмы планирования в ядре linux
- 5. Функция DECLARE_COMPLETION_ONSTACK в ядре linux
- 6. sys_call_table в ядре Linux 2.6.18
- 7. Pin Muxing в ядре linux
- 8. Вызов функции в ядре linux
- 9. Понимание typecheck в ядре Linux
- 10. Включить DRM_KMS_CMA_HELPER в ядре linux
- 11. Как спать в ядре Linux?
- 12. определение spinlock_t в ядре Linux
- 13. Распределение памяти в ядре Linux
- 14. Структура PTE в ядре linux
- 15. Использование regex в ядре linux
- 16. Странный тупик в ядре Linux
- 17. Роль tty в ядре Linux
- 18. Передано байтов в ядре Linux?
- 19. Использование MD5 в ядре Linux
- 20. отображение памяти в ядре linux
- 21. __context__ атрибут в ядре Linux
- 22. реализация тетсру в Linux ядре
- 23. Межмодульная связь в ядре Linux
- 24. page swap в ядре Linux
- 25. CONFIG_DEBUG_PAGEALLOC на ядре ARM Linux?
- 26. объявить переменную в сборке в ядре Linux?
- 27. Оборудование GPIO watchdog в ядре linux ... Autorun
- 28. Потенциальная утечка памяти в ядре linux?
- 29. gpiod_ * vs gpio_ * методы в ядре Linux
- 30. Как отлаживать проблемы в ядре Linux `init()`?
, что вы имеете в виду "надеяться на лучшее? Чего вы боитесь? – Javier
Эх, это выражение. Я использую его здесь, так как я, кажется, что-то использую таким образом, что это не совсем норма. –
Связанные списки имеют операции, которые нет в очереди FIFO (перечисление списка, удаление элементов из середины и т. Д.). Поэтому я опасаюсь, что если список используется как очередь без инкапсуляции, то в будущем какой-то дурак (возможно, я) не сможет наблюдать ограничение FIFO. –