Эта статья начинается с принципа реализации процессов и потоков в Linux, распространяется на модель потоков Linux и, наконец, кратко объясняет стоимость переключения потоков.
Только начал учиться, не обязательно правильно, добрые люди приходят, чтобы исправить меня ах ах ах! ! !
Процессы и потоки в Linux
Для начала проясним основные понятия процесса и процесса:
- Процесс — это базовая единица распределения ресурсов.
- Поток — это основная единица планирования ЦП.
- В процессе может быть несколько потоков
- Потоки совместно используют ресурсы процесса
Фундаментальный
Процессы и потоки в пользовательском режиме Linux в основном соответствуют вышеуказанным концепциям, но в режиме ядра не проводится различие между процессами и потоками. Можно считать, что процессы выполняются в ядре единообразно, но некоторые из них являются «обычными процессами» (соответствующими процессным процессам), а некоторые — «облегченными процессами» (соответствующими потокам pthread или npthread), все из которых используютtask_struct
Структура сохраняется и сохраняется.
использоватьfork
создать процесс, использоватьpthread_create
Создайте тему. В конечном итоге вызываются два системных вызоваdo_dork
,а такжеdo_dork
законченныйtask_struct
Скопируйте структуру и добавьте новый процесс в планирование ядра.
Процесс — это основная единица распределения ресурсов, а потоки совместно используют ресурсы процесса.
Обычные процессы должны глубоко копировать виртуальную память, файловые дескрипторы, обработку сигналов и т. д., в то время как легковесные процессы являются «легковесными», поскольку им нужны только неглубокие копии большей части информации, такой как виртуальная память, а несколько легковесных процессов совместно используют один ресурс процесса.
Нить является основной единицей планирования ЦП, и могут быть несколько потоков под процессом
В Linux добавлена концепция группы потоков, так что исходный «процесс» соответствует потоку, а «группа потоков» соответствует процессу, понимая, что «в процессе может быть несколько потоков»:
- В операционной системе несколько групп процессов.
- В группе процессов несколько процессов (1:n)
- Процесс соответствует группе потоков(1:1)
- В группе потоков несколько потоков(1:н)
task_struct
, используйте группу целевых процессов pgid, группу целевых потоков tgid, целевой процесс или поток pid. Если предположить, что в данный момент существует группа процессов, приведенные выше понятия соответствуют следующему:
- В группе процессов есть главный процесс (родительский процесс), и pid равен pgid группы процессов, остальные процессы в группе процессов являются дочерними процессами родительского процесса, и pid не равен pgid
- Каждый процесс соответствует группе потоков, а pid равен tgid.
- В группе потоков есть «основной поток» (неохотно называемый «основным потоком», что соответствует основному процессу; по семантике его никогда нельзя назвать «родительским потоком»), а pid равен tgid потока. группа;Все остальные потоки в группе потоков находятся на одном уровне с основным потоком., pid не равен tgid
Поэтому вызов getpgid возвращает pgid,Вызов getpid должен возвращать tgid, вызов gettid должен возвращать pid. Не путайте при его использовании.
Потоки, отличные от основного потока процесса, являются базовой единицей планирования ЦП, что хорошо понятно. Так называемый основной поток и процесс владения на самом деле одно и то же.task_struct
, также может планироваться ЦП, поэтому основной поток также является основной единицей планирования ЦП.
Все потоки с одним и тем же tgid составляют концептуальный «процесс», только основной поток фактически выделяет ресурсы при его создании, а другие потоки совместно используют ресурсы основного потока посредством неглубоких копий. Сочетая обычные потоки и упрощенные процессы, описанные выше, «процесс является базовой единицей распределения ресурсов».
взять каштан
pgid | tgid | pid |
---|---|---|
111 | 111 | 111 |
112 | 112 | 112 |
112 | 112 | 113 |
113 | 113 | 113 |
113 | 113 | 114 |
113 | 115 | 115 |
113 | 115 | 116 |
113 | 115 | 117 |
- Есть 3 группы процессов 111, 112, 113
- В группе процессов 111 есть 1 родительский процесс 111, и ресурсы выделяются отдельно
- В процессе 111 существует 1 поток 111, разделяющий ресурсы процесса 111.
- В группе процессов 112 есть 1 родительский процесс 112, и ресурсы выделяются отдельно
- Под процессом 112 находятся 2 потока 112 и 113, разделяющие ресурсы процесса 112.
- В группе процессов 113 есть 1 родительский процесс 113 и 1 дочерний процесс 115, каждый из которых распределяет ресурсы независимо.
- В процессе 113 есть два потока 113 и 114, которые совместно используют ресурсы процесса 113.
- В процессе 115 есть 3 потока 115, 116, 117, которые совместно используют ресурсы процесса 115.
- В группе процессов 111 есть 1 родительский процесс 111, и ресурсы выделяются отдельно
резюме
Теперь гораздо проще понять процессы и потоки в linux:
- Процесс — это логическое понятие, используемое для управления ресурсами, соответствующее
task_struct
ресурсы в - Каждый процесс имеет по крайней мере один поток для конкретного выполнения, соответствующий
task_struct
Информация о планировании задач в - к
task_struct
pid различает потоки, tgid различает процессы, а pgid различает группы процессов.
потоковая модель линукса
один на один
Используются как LinuxThreads, так и NPTL.一对一
резьбовая модель,Один пользовательский поток соответствует одному потоку ядра. Ядро отвечает за планирование каждого потока, который может быть назначен другим процессорам.Linux 2.6 по умолчанию использует библиотеку потоков NPTL, модель потоков «один к одному»..
преимущество:
- Простота реализации.
недостаток:
- Большинство операций с пользовательскими потоками отображаются на потоки ядра, что приводит к частому переключению между пользовательским режимом и режимом ядра.
- Ядро сопоставляет объекты планирования для каждого потока.Если в системе большое количество потоков, это повлияет на производительность системы.
много к одному
Как подсказывает название,多对一
В модели потока,Несколько пользовательских потоков соответствуют одному и тому же потоку ядра., все детали создания потоков, планирования и синхронизации обрабатываются библиотекой потоков пользовательского пространства процесса.
преимущество:
- Многие операции пользовательских потоков прозрачны для ядра и не требуют частого переключения между пользовательским режимом и режимом ядра. Делает создание потоков, планирование, синхронизацию и т. д. очень быстрыми.
недостаток:
- Поскольку несколько пользовательских потоков соответствуют одному и тому же потоку ядра, если один из пользовательских потоков заблокирован, другие пользовательские потоки не могут выполняться.
- Ядро не знает, какие потоки находятся в пользовательском режиме, и не может добиться более полного планирования, приоритета и т. д., как потоки ядра.
многие ко многим
Модель потоков «многие к одному» очень легковесна, проблема в том, что несколько пользовательских потоков соответствуют одному фиксированному потоку ядра. Модель многопоточности решает эту проблему:m пользовательских потоков соответствуют n потокам ядра, обычноm>n
. NGPT, возглавляемая IBM, приняла多对多
многопоточная модель, но сейчас она устарела.
преимущество:
- Легкий с моделью «многие к одному»
- Поскольку существует несколько потоков ядра, когда один пользовательский поток заблокирован, другие пользовательские потоки все еще могут выполняться.
- Поскольку он соответствует нескольким потокам ядра, он может обеспечить более полное планирование, приоритет и т. д.
недостаток:
- сложный в реализации
переключение потоков
Linux использует модель потоков «один к одному», и разница между переключением потоков пользователя и переключением потоков ядра очень мала. В то же время, если игнорируются накладные расходы, вызванные добровольным отказом пользователя от права на выполнение (выход) пользовательского потока, необходимо учитывать только накладные расходы на переключение потоков ядра.
Обратите внимание, что это всего лишь упрощение для облегчения понимания.На самом деле библиотека пользовательских потоков проделала большую работу в процессе планирования и синхронизации пользовательских потоков, и эту часть накладных расходов нельзя игнорировать..
Как объясняет JVM для Thread#yield():Если базовая ОС не поддерживает семантику yield, JVM позволяет пользовательскому потоку вращаться до конца кванта времени, и поток пассивно переключается для достижения аналогичного эффекта..
что вызывает переключение потока
- вращение временного интервала
- блокировка потока
- Поток добровольно отказывается от кванта времени
Накладные расходы на переключение потоков
прямые затраты
Прямые накладные расходы вызваны самим переключением потоков, что неизбежно и неизбежно.
Переключение между режимом пользователя и режимом ядра
Переключение потоков возможно только в режиме ядра.Если текущий пользователь находится в пользовательском режиме, это неизбежно вызовет переключение между пользовательским режимом и режимом ядра. (Какова конкретная стоимость «переключения между режимом пользователя и режимом ядра»? ? ?)
переключатель контекста
Как упоминалось ранее, информация о потоке (или процессе не является обязательной) должна использоватьtask_struct
При сохранении и переключении потоков необходимо конвертировать старые потокиtask_struct
Вырезать из ядра и врезать новый поток, внося переключение контекста. Кроме того, необходимо также переключать регистры, программные счетчики, стеки потоков (в том числе стеки операций, стеки данных) и т. д.
алгоритм планирования потоков
Алгоритм планирования потока должен управлять состоянием потока, условиями ожидания и т. д. Если он запланирован в соответствии с приоритетом, он также должен поддерживать очередь приоритетов. Если переключение потоков происходит часто, эту стоимость не следует недооценивать.
над головой
Косвенные накладные расходы являются побочным эффектом прямых накладных расходов и зависят от реализации системы и пользовательского кода.
промах кеша
Для переключения процессов необходимо выполнить новую логику. Если адресное пространство, к которому обращаются эти двое, не является близким, произойдет промах кэша, и конкретное воздействие зависит от реализации системы и реализации пользовательского кода. Если кеш системы большой, влияние промахов кеша может быть уменьшено; если адресное пространство пользовательских потоков, обращающихся к данным, близко, частота промахов кеша сама по себе относительно низка.
То же самое верно для быстрых и медленных структур таблиц, таких как таблицы страниц.
Ссылаться на:
Ссылка на эту статью:Говоря о модели потоков Linux и переключении потоков
автор:обезьяна 007
Источник:monkeysayhi.github.io
Эта статья основана наCreative Commons Attribution-ShareAlike 4.0Международное лицензионное соглашение выпущено, его можно перепечатать, вывести или использовать в коммерческих целях, но авторство и ссылка на эту статью должны быть сохранены.