Поток ядра и пользовательский поток и их механизм
У меня возникла путаница с пониманием потока ядра, пользовательского потока, модели потока из-за «режима ядра», «пользовательского режима», «пользовательские потоки и потоки ядра точно такие же». Кто-нибудь может это прояснить?
Поток ядра
- Поток ядра — это «облегченная» единица планирования ядра.
- В каждом процессе существует по крайней мере один поток ядра .
- Если в процессе существует несколько потоков ядра, они совместно используют одну и ту же память и файловые ресурсы.
- Потоки ядра не владеют ресурсами, за исключением стека, копии регистров, включая программный счетчик, и локального хранилища потока (если оно есть), поэтому их создание и уничтожение относительно дешевы.
- Ядро может назначать по одному потоку каждому логическому ядру в системе (поскольку каждый процессор разбивается на несколько логических ядер, если он поддерживает многопоточность, или поддерживает только одно логическое ядро на физическое ядро, если нет), и может выгружать потоки, которые получить блокировку.
- Однако для переключения потоков ядра требуется гораздо больше времени, чем для пользовательских потоков.
- Поток ядра — это объект потока, поддерживаемый операционной системой.
- Это фактический поток, который может планироваться и выполняться процессором.
- Планировщик потоков ядра отвечает за планирование потоков ядра.
Тема пользователя
- Потоки иногда реализуются в библиотеках пользовательского пространства, поэтому они называются пользовательскими потоками.
- Ядро не знает о них, поэтому они управляются и планируются в пользовательском пространстве.
- Пользовательские потоки, реализованные виртуальными машинами, также называются зелеными потоками.
- Каждый пользовательский поток на самом деле не может выполняться сам по себе, и единственный способ для запуска пользовательского потока — это если потоку ядра фактически приказано выполнить код, содержащийся в пользовательском потоке.
Зеленая нить
- зеленые потоки или виртуальные потоки [оспариваются - обсуждаются] — это потоки, запланированные библиотекой времени выполнения или виртуальной машиной (ВМ), а не изначально базовой операционной системой (ОС) .
Модель резьбы
Модель 1:1
- Потоки, созданные пользователем в соответствии 1:1 с запланированными объектами в ядре, представляют собой простейшую возможную реализацию многопоточности. OS/2 и Win32 использовали этот подход с самого начала.
Тема, википедияТема, википедияТема, википедия
До сих пор мое понимание было следующим.
- В окне модель резьбы 1:1.
- Если я вызываю функцию CreateThread, создаются 2 потока: 1 пользовательский поток, 1 поток ядра.
- Поскольку «каждый пользовательский поток фактически не может работать сам по себе» и «потоку ядра фактически приказано выполнить код, содержащийся в пользовательском потоке», потоку ядра предлагается выполнить код, содержащийся в пользовательском потоке, который LPTHREAD_START_ROUTINE.
- Для функции CreateThread требуется Kernel32.dll.
- Функция CreateThread возвращает HANDLE потока, подразумевая "объект потока, поддерживаемый операционной системой".
- Потоки, созданные CreateThread, выполняются одновременно в многоядерной среде, что означает, что «ядро может назначить по одному потоку каждому логическому ядру».
- CreateThread по крайней мере создает поток ядра.
Однако в этой ссылке
- Пользовательские потоки и потоки ядра абсолютно одинаковы.
- Пользовательский поток — это тот, который выполняет код пользовательского пространства.
- Поток ядра — это поток, выполняющий только код ядра и не связанный с процессом пользовательского пространства.
- Фактически все потоки начинаются в пространстве ядра.
- В процессах на x86 Windows потоки чередуются между пользовательским режимом и режимом ядра (между программой и вызовами ОС/системы). Существуют рабочие потоки ядра, но они не участвуют напрямую и не всегда в выполнении процессов.
Разница между потоками на уровне пользователя и потоками, поддерживаемыми ядром?
Это испортило мой разум. Что это значит?
Означает ли это, что создается 1 поток ядра (например, CreateThread), и этот поток ядра чередуется между режимами пользователя и ядра?