Linux - потоки и приоритеты планирования процесса

если мы создадим pthreads (pthread_create) или процессы (fork) с политиками планирования по умолчанию в linux, будет ли планировщик обрабатывать процессы и потоки с одинаковым приоритетом при их планировании?

скажем, что существует процесс P1 с одним потоком и процесс P2 с 2 потоками T1 T2

позволяет сказать, что есть только одно ядро. Будет ли планирование P1 T1 P1 T2 P1 T1 P1 T2

или

P1 T1 T2 P1 T1 T2

Ответ 1

Linux больше не планирует процессы вообще.

В ядре потоки запланированы. Концепция процесса теперь представляет собой искусственную конструкцию, которую видят в основном вещи вне ядра. Очевидно, что ядро ​​должно знать, как потоки связаны друг с другом, но не для целей планирования.

В основном, ядро ​​поддерживает множество потоков, и каждый поток имеет лидера группы потоков, что видно извне как процесс. В потоке есть идентификатор потока и идентификатор группы потоков - он очень похож на отношения между PID и PPID (идентификатор процесса и идентификатор родительского процесса).

Когда вы создаете регулярный поток, ядро ​​дает ему новый идентификатор потока, но его идентификатор группы потоков идентичен идентификатору группы потока, который его создал. Таким образом, он выглядит как поток внутри процесса для внешнего мира.

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

Большинство неядерных утилит, сообщающих о процессах, на самом деле просто сообщают о потоках, где идентификатор потока совпадает с идентификатором группы потоков.

Существуют тонкости с другими методами, которые, вероятно, слишком сложны, чтобы входить сюда. То, что я написал выше, является (надеюсь) хорошим учебным пособием среднего уровня.

Теперь, для вашего конкретного вопроса, это было бы не так, поскольку P1 имеет только один поток (нет P1T2).

С помощью ядра потоки P1T1, P2T1 и P2T2 и, предположив, что они имеют одинаковые свойства планирования и ведут себя одинаково с (a) то, как они будут быть запланированным.


См. также:

для получения дополнительной информации.


(a): Очевидно, что это изменение, если потоки начинают блокировать операции ввода-вывода (ядро не будет планировать их до тех пор, пока не будет доступно I/O) или рано освободить их кванты времени (ядро, вероятно, будет их приоритет в качестве награды за хорошую игру), но тогда они не ведут себя одинаково.

Ответ 2

Верно, что ядро ​​Linux (из версии 2.6.23 и включено) планирует задачи, которые являются либо потоками, либо (однопоточными) процессы.

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

В общем, потоки могут быть либо потоками пользовательского пространства, либо потоками пространства ядра. Потоки пользовательского пространства обычно реализуются библиотекой. Таким образом, ядро ​​почти ничего не знает о них (ядро знает только о процессе, к которому они принадлежат), и они обрабатываются в пользовательском пространстве. Напротив, потоки ядра реализуются ядром, и они полностью обрабатываются ядром. Вы можете получить общий вид со следующего изображения.

введите описание изображения здесь

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

Примером потоков ядра являются LinuxThreads, которые теперь заменены более современными библиотека NPTL. Примером потоков пользовательского пространства является библиотека GNU Portable Threads

Теперь, что касается планирования, как и ожидалось, потоки пользовательского пространства планируются по-другому для потоков ядра:

  • Когда используются потоки пользовательского пространства, планировщик выполняет процессы планирования. Таким образом, он выбирает конкретный процесс и выделяет допустимый квант времени. Затем планировщик потоков внутри процесса отвечает за выбор того, как будет выполняться планирование между потоками. Поскольку потоки пользовательского пространства не прерываются прерываниями, выбранный поток будет потреблять весь квант процесса, пока он не выполнит свою задачу. Таким образом, гипотетическое планирование в этом случае было бы следующим:

    P1 (T1), P2 (T1), P1 (T1), P2 (T1 - T1 завершает свою задачу и дает), P2 (T2 - для оставшегося кванта времени, P1 (T1), P2 (T2), P1 (T1),....

  • Когда используются потоки ядра, тогда ядро ​​планирует потоки. Ядро не интересует, к какому процессу принадлежит поток, но он распределяет один временной квант каждой нити в равной степени. Итак, в этом случае гипотетическим планированием будет:

    P1 (T1), P2 (T1), P2 (T2), P1 (T1), P2 (T2), P1 (T1),...


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