Что такое нить ядра?

Я только что начал кодирование драйвера устройства и новый для потоковой передачи, прошел через многие документы, чтобы получить представление о потоках. У меня все еще есть некоторые сомнения.

  • что такое поток ядра?.
  • как он отличается от пользовательского потока?
  • Какова связь между двумя потоками?
  • Как я могу реализовать потоки ядра?.
  • Где я могу увидеть результат реализации?

Может кто-нибудь мне помочь? спасибо.

Ответ 1

Ядро-поток - это задача ядра, работающая только в режиме ядра; он обычно не создается системными вызовами fork() или clone(). Пример: kworker или kswapd.

Вероятно, вам не следует реализовывать потоки ядра, если вы не знаете, что они собой представляют.

Google предоставляет много страниц о потоках ядра, например. Страница Frey.

Ответ 2

  • Ядро-поток представляет собой task_struct без компонентов пользовательского пространства.
  • Помимо отсутствия пользовательского пространства, у него есть разные предки (kthreadd поток ядра вместо процесса init) и создается с помощью API только для ядра вместо последовательностей clone системных вызовов fork/exec.
  • Два потока ядра имеют kthreadd как родительский. Кроме того, поток ядра имеет одинаковую "независимость" от другого как процессы пользовательского пространства.
  • Используйте функцию/макрос kthread_run из заголовок kthread.h Вам, скорее всего, придется написать модуль ядра для вызова эта функция, поэтому вы должны взглянуть на драйверы устройств Linux.
  • Если вы ссылаетесь на текстовый вывод своей реализации (через вызовы printk), вы можете увидеть этот вывод в журнале ядра с помощью команды dmesg.

Ответ 3

Поскольку вы сравниваете потоки ядра с пользовательскими [land] потоками, я предполагаю, что вы имеете в виду что-то вроде следующего.

Обычный способ реализации потоков в настоящее время - это сделать это в ядре, поэтому их можно считать "нормальными" потоками. Однако это также возможно сделать в userland, используя сигналы, такие как SIGALRM, чей обработчик сохранит текущее состояние процесса (в основном, регистры) и изменит их на ранее сохраненный. Несколько ОС использовали это как способ реализации потоков, прежде чем они получили правильную поддержку потоков ядра. Они могут быть быстрее, так как вам не нужно переходить в режим ядра, но на практике они исчезли.

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

В ядре реализованы потоки ядра. Возможно, вы имели в виду, как их использовать? Наиболее распространенным способом является вызов pthread_create.