Что такое поток ядра? - PullRequest
       19

Что такое поток ядра?

19 голосов
/ 28 февраля 2012

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

  1. что такое поток ядра?.
  2. чем он отличается от пользовательского потока?.
  3. Какая связь между двумя потоками?
  4. как я могу реализовать потоки ядра?.
  5. где я могу увидеть результаты реализации?.

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

Ответы [ 4 ]

16 голосов
/ 28 февраля 2012
  1. Поток ядра - это task_struct без компонентов пользовательского пространства.
  2. Помимо отсутствия пользовательского пространства, он имеет разных предков (kthreadd поток ядра вместо процесса init)и создается API только для ядра вместо последовательностей из clone из fork/exec системных вызовов.
  3. Два потока ядра имеют kthreadd в качестве родителя.Кроме того, поток ядра обладает той же «независимостью» друг от друга, что и процессы пользовательского пространства.
  4. Используйте функцию / макрос kthread_run из заголовка kthread.h Скорее всего, у вас будетнаписать модуль ядра для вызова этой функции, поэтому вам следует взглянуть на Драйверы устройств Linux
  5. Если вы имеете в виду вывод текста вашей реализации (через * 1021)* звонки), вы можете увидеть этот вывод в журнале ядра, используя команду dmesg.
8 голосов
/ 28 февраля 2012

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

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

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

3 голосов
/ 15 октября 2018

пользовательские потоки и стек:

Каждый поток имеет свой собственный стек, так что он может использовать свои собственные локальные переменные, глобальные переменные общего ресурса потока, которые являются частью разделов .data или .bssисполняемого файла Linux.Поскольку потоки совместно используют глобальные переменные, т.е. мы используем механизмы синхронизации, такие как мьютекс, когда мы хотим получить доступ / изменить глобальные переменные в многопоточном приложении.Локальные переменные являются частью отдельного стека потоков, поэтому никакой синхронизации не требуется.

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

Чтобы создать ядро ​​потока, используйте kthread_create ():

#include <linux/kthread.h>

structure task_struct *kthread_create(int (*threadfn)(void *data),
                                      void *data, const char namefmt[], ...);

Потоки ядра и стек: Потоки ядра используются для выполнения задач постобработки для ядра, таких как потоки сброса pdf, потоки workq и т. Д. Потоки ядра - это принципиально новый процесс только без адресного пространства (может быть создан с помощью clone ()вызов с необходимыми флагами) означает, что они не могут переключиться в пользовательское пространство.Потоки ядра планируются и могут быть вытеснены как обычные процессы.

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

Подробнее о стеках ядра: - https://www.kernel.org/doc/Documentation/x86/kernel-stacks

0 голосов
/ 28 февраля 2012

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

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

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

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

...