проблема
(1) Какие бывают типы резьбы?
(2) Какие модели потоков?
(3) Какую модель потоков использует каждый язык?
Введение
В Java понятия параллельного программирования, многопоточности и общих ресурсов, о которых мы обычно говорим, связаны с потоками.Упомянутые здесь потоки на самом деле должны называться ""Тема пользователя", и в соответствии с операционной системой существует еще один поток, который называется "поток ядра".
Пользовательские потоки расположены в ядре, и их управление не требует поддержки ядра, в то время как потоки ядра напрямую поддерживаются и управляются операционной системой. Почти все современные операционные системы, включая Windows, Linux, Mac OS X и Solaris, поддерживают потоки ядра.
Ultimately, there must be some kind of relationship between user threads and kernel threads. In this chapter, we will learn three common ways to establish this relationship: many-to-one model, one-to-one model and many-to-many модель.
Модель много к одной
Модель многопоточности «многие к одному», также известная как модель многопоточности на уровне пользователя, означает, что несколько пользовательских потоков соответствуют одному и тому же потоку ядра, а все детали создания, планирования и синхронизации потоков обрабатываются пользовательским пространством процесса. библиотека потоков.
преимущество:
- Многие операции пользовательских потоков прозрачны для ядра и не требуют частого переключения между пользовательским режимом и режимом ядра, что делает создание потоков, планирование и синхронизацию очень быстрыми;
недостаток:
- Поскольку несколько пользовательских потоков соответствуют одному и тому же потоку ядра, если один из пользовательских потоков заблокирован, другие пользовательские потоки также не могут выполняться;
- Ядро не знает, какие потоки находятся в пользовательском режиме, и не может добиться более полного планирования, приоритета и т. д., как потоки ядра;
Библиотеки сопрограмм, реализованные на многих языках, в основном относятся к этому пути, например, gevent от python.
модель один в один
Модель «один к одному», также известная как модель многопоточности на уровне ядра, означает, что один пользовательский поток соответствует одному потоку ядра, и ядро отвечает за планирование каждого потока, который может быть запланирован для других процессоров.
преимущество:
- Простая реализация [Эта статья изначально была создана публичной учетной записью «Tong Ge Reading Source Code»];
недостаток:
- Большинство операций пользовательской потоки отображаются на резьбу ядра, вызывая частое переключение пользовательского состояния пользовательского и ядра;
- INERLEL карты планирования для каждого потока. Если в системе появляется большое количество потоков, это повлияет на производительность системы;
В Java используется модель потоков «один к одному», поэтому будьте осторожны при запуске потока в Java.
Модель «многие ко многим»
Модель «многие ко многим», также известная как двухуровневая модель многопоточности, является продуктом изучения сильных сторон других, полностью поглощая преимущества первых двух моделей многопоточности и максимально избегая их недостатков.
В рамках этой модели пользовательские потоки и потоки ядра представляют собой модель отображения многие ко многим (m : n, обычно m>=n).
Прежде всего, в отличие от модели «многие ко многим», процесс в модели «многие ко многим» может быть связан с несколькими потоками ядра, поэтому несколько пользовательских потоков в процессе могут быть привязаны к разным потокам ядра, что аналогично к модели «один к одному»;
Во-вторых, он отличается от модели «один к одному» тем, что все пользовательские потоки в его процессе не привязаны к потокам ядра один за другим, а могут быть динамически связаны с потоками ядра. поток из-за того, что когда блокирующая операция запланирована для отказа от ЦП ядром, оставшиеся пользовательские потоки в связанном процессе могут повторно связываться с другими потоками ядра для запуска.
Таким образом, модель «многие ко многим» — это не модель «многие к одному», полностью планируемая сама по себе, и не модель «один к одному», полностью планируемая операционной системой, а промежуточное состояние (самопланирование и системное планирование работы вместе), потому что эта модель Высокая сложность ядра операционной системы разработчики вообще не используют, поэтому она чаще в виде сторонней библиотеки.
преимущество:
- Легкий с моделью «многие к одному»;
- Поскольку существует несколько потоков ядра, когда один пользовательский поток заблокирован, другие пользовательские потоки все еще могут выполняться;
- Поскольку это соответствует нескольким потокам ядра, можно добиться более полного планирования, приоритета и т. д.;
недостаток:
- Комплексная реализация [Эта статья изначально была создана публичной учетной записью «Tong Ge Reading Source Code»];
Планировщик Goroutine на языке Go принимает эту схему реализации. На языке Go, процесс может начать тысячи Goroutines, что также является важной причиной его «высокого параллелизма» Halo с момента своего дебюта.
Когда мы поговорим о ForkJoinPool в Java позже, мы сравним и объясним модель потока PMG языка Go.
Суммировать
(1) потоки делятся на пользовательские потоки и потоки ядра;
(2) модель потоков имеет модель «многие к одному», модель «один к одному» и модель «многие ко многим»;
(3) Операционная система обычно реализует только модель «один к одному»;
(4) Java Thread, используя одну модель, она соответствует нити планировщика ниток ядра для операционной системы для обработки;
(5) Использование многопоточных моделей в языке Go — вот почему они высоки, а его модель потоков очень похожа на forkjoinpool в Java;
(6) gevent Python использует модель многопоточности «многие к одному»;
пасхальные яйца
Какую модель потоков используют языки, которые вы изучили?
Рекомендуемое чтение
1,Серия сборников Java Dead Knock
3.Dead hit серия синхронизации Java
Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись «Брат Тонг читает исходный код», просмотреть больше статей в серии исходного кода и поплавать в океане исходного кода с братом Тонгом.