Linux – потоки ядра

101
Linux - потоки ядра
Linux - потоки ядра

Я хочу остановиться на некоторых характеристиках потоков ядра.

Во-первых, потоки ядра всегда выполняются в режиме ядра и никогда в режиме пользователя. Таким образом, потоки ядра имеют практически все привилегии и не имеют адресов в пространстве пользователя, связанных с ними.

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

В-третьих, все потоки ядра являются потомками kthreadd – Почему это так? Мы объясним это в следующей статье, посвященной kthreadd.

Наконец, давайте исследуем потоки ядра с помощью /proc и посмотрим разницу в информации, полученной от обычного пользовательского процесса (он же пользовательская задача). В файле “/proc/pid” есть несколько записей, которые содержат информацию в случае процесса в режиме пользователя, но пусты в случае потока ядра, такие как: “maps”, “environ”, “auxv”, “cmdline” (рекомендую прочитать “man proc”, чтобы получить больше информации о них). Кроме того, каталоги fd и fdinfo пусты, а ссылка “exe” не указывает на какой-либо исполняемый файл. На прилагаемом скриншоте мы видим некоторые различия между PID 1 [пример обычного процесса в режиме пользователя] и PID 2 [пример потока ядра]. BTW, скриншот ниже был взят из онлайн/браузерной реализации Linux под названием JSLinux – https://bellard.org/jslinux.

Linux - потоки ядра