Виртуальный поток
В компьютерном программировании виртуальный поток — это поток , который управляется библиотекой времени выполнения или виртуальной машиной (ВМ) и создан так, чтобы напоминать «реальный» поток операционной системы для выполнения на нем кода, требуя при этом существенно меньше ресурсов, чем последний.
Виртуальные потоки позволяют выполнять десятки миллионов упреждающих задач и событий на компьютере потребительского уровня 2021 года. [1] по сравнению с небольшими тысячами потоков операционной системы. [2] Упреждающее исполнение [3] важен для повышения производительности за счет параллелизма и быстрого упреждающего реагирования на десятки миллионов событий.
Более ранние конструкции, которые не являются или не всегда являются вытесняющими, такие как сопрограммы , зеленые потоки или в основном однопоточный Node.js , приводят к задержкам в ответе на асинхронные события, такие как каждый входящий запрос в серверном приложении. [4]
Определение
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( апрель 2022 г. ) |
Виртуальные потоки были коммерциализированы в браузере Google Chrome в 2008 году. [5] где виртуальные потоки могут пересекать физические потоки. Виртуальные потоки действительно виртуальны и создаются в программном обеспечении пользовательского пространства.
- Виртуальные потоки являются вытесняющими
- Это важно для производительности ответа, поскольку виртуальный поток может реагировать на события без вмешательства программиста или до завершения текущей задачи.
- Вытеснение требует знаний многопоточного программирования, чтобы избежать разрывов записи, гонок за данными и невидимых записей другими потоками.
- Виртуальные потоки могут переключаться между исполнительными блоками всех процессоров и ядер.
- Это позволяет использовать все доступное оборудование, что в 10 раз больше, чем на современных компьютерах.
- В реализации go1.18 существуют очереди виртуальных потоков на каждый исполнительный модуль. Существуют дополнительные виртуальные потоки, не выделенные исполнительному блоку, и исполнительный блок может украсть виртуальные потоки у другого исполнительного блока. [6]
- Виртуальные потоки не требуют выхода или подобных вмешательств со стороны программиста.
- Кажется, что виртуальные потоки выполняются непрерывно, пока не вернутся или не остановятся при блокировке синхронизации.
- В отличие от сопрограмм, если виртуальный поток находится в бесконечном цикле, он не блокирует программу. Выполнение продолжается при более высокой загрузке процессора, даже если число циклических потоков превышает количество доступных исполнительных блоков.
- Число виртуальных потоков может исчисляться десятками миллионов благодаря использованию небольших часто управляемых стеков.
- Это позволяет использовать на несколько величин больше потоков, чем при использовании потоков ОС.
- Go 1.18 может запустить 15 миллионов виртуальных потоков на компьютере потребительского уровня 2021 года, то есть около 350 000 на гигабайт основной памяти. Это возможно благодаря горутинам, имеющим изменяемый размер стека менее 3 КиБ.
- Компьютер потребительского уровня обычно поддерживает 3000 потоков ОС, а в конфигурации системы может предложить около 15 000 потоков.
- Виртуальные потоки могут выделяться быстро, аналогично скорости выделения памяти.
- Поскольку выделение виртуального потока похоже на выделение структур памяти, их можно выделять очень быстро, примерно 600 000 в секунду. Это невозможно для потоков ОС, которые могут привести к сбою хоста со скоростью намного ниже этой скорости.
- Более быстрое наращивание уменьшает потребность в пулах предварительно запущенных потоков для удовлетворения внезапного увеличения трафика.
- В Go виртуальный поток выделяется с помощью вызова функции, которому предшествует ключевое слово «go». Вызов функции обеспечивает закрытие значений переменных, которые гарантированно будут видны новой горутине. горутины не имеют возвращаемого значения, поэтому возвращающая горутина просто исчезает
- Виртуальные потоки совместно используют карту памяти, как потоки ОС.
- Подобно потокам ОС, виртуальные потоки совместно используют память в рамках всего процесса и поэтому могут свободно совместно использовать и получать доступ к объектам памяти, подлежащим синхронизации.
- Некоторые однопоточные архитектуры, такие как движок V8 ECMAScript, используемый Node.js, с трудом принимают данные, которые конкретный поток не выделил, что требует использования специальных типов данных с нулевым копированием при совместном использовании данных между потоками.
- Виртуальные потоки обеспечивают параллелизм, как потоки ОС.
- Параллелизм означает, что несколько инструкций выполняются одновременно, что обычно приводит к значительному повышению производительности.
- Это отличается от более простого параллелизма, при котором один исполнительный модуль выполняет несколько потоков, совместно используемых с небольшими временными интервалами. Благодаря квантованию времени создается впечатление, что каждый поток выполняется непрерывно. Хотя параллелизм проще реализовать и запрограммировать, он не дает никакого прироста производительности.
Основные причины
[ редактировать ]Серверы Java имеют обширные и потребляющие память программные конструкции, позволяющие десяткам объединенных в пул потоков операционной системы упреждающе выполнять тысячи запросов в секунду без использования виртуальных потоков. Ключом к повышению производительности здесь является уменьшение начальной задержки при обработке потоков и минимизация времени блокировки потоков операционной системы. [7]
Виртуальные потоки увеличивают возможный параллелизм на многие порядки, в то время как фактический достигаемый параллелизм ограничен доступными исполнительными блоками и конвейерной обработкой, предлагаемыми нынешними процессорами и процессорными ядрами. В 2021 году компьютеры потребительского уровня обычно будут предлагать параллелизм десятков одновременно работающих исполнительных устройств. [8] Для повышения производительности за счет параллелизма среда выполнения языка должна использовать все существующее оборудование. [9] не быть однопоточным и не иметь глобальной синхронизации, такой как глобальная блокировка интерпретатора .
Увеличение числа возможных вытесняющих элементов, предлагаемое виртуальными потоками, достигается за счет того, что среда выполнения языка управляет стеками потоков изменяемого размера. [10] Эти стеки меньше по размеру, чем стеки потоков операционной системы. Максимальное количество потоков, возможное без подкачки, пропорционально объему основной памяти. [11]
Для эффективной поддержки виртуальных потоков необходимо в значительной степени переписать среду выполнения языка, чтобы предотвратить задержку блокирующими вызовами потока операционной системы, назначенного для выполнения виртуального потока. [12] и управлять стеками потоков. [13] Примером модификации виртуальных потоков является Java Loom. [14] Примером нового языка, предназначенного для виртуальных потоков, является Go. [15]
Сложность
[ редактировать ]Поскольку виртуальные потоки обеспечивают параллелизм, программист должен обладать навыками многопоточного программирования и синхронизации.
Поскольку заблокированный виртуальный поток блокирует поток ОС, который он занимает в данный момент, во время выполнения необходимо приложить немало усилий для обработки блокирующих системных вызовов. Обычно поток из пула резервных потоков ОС используется для выполнения вызова блокировки виртуального потока, чтобы первоначально выполняющийся поток ОС не блокировался.
Управление стеком виртуальных потоков требует внимательности в компоновщике и быстрого прогнозирования требований к дополнительному пространству стека.
Реализации
[ редактировать ]Браузер Гугл Хром
[ редактировать ]Виртуальные потоки используются для сериализации одноэлементных операций ввода-вывода. Когда виртуальный поток выполняется, он может переходить в другой поток ОС. Браузер Chrome впервые появился в 2008 году. Виртуальные потоки Chrome доступны разработчикам, расширяющим браузер.
Идти
[ редактировать ]Go Горутины стали вытесняющими с версии Go 1.4 в 2014 году и представляют собой широкое применение виртуальных потоков.
Другие варианты использования термина
[ редактировать ]Интел [16] в 2007 году назвал метод оптимизации компилятора Intel виртуальными потоками.
См. также
[ редактировать ]- Асинхронный/ожидание
- Легкий процесс
- Сопрограмма
- Глобальная блокировка переводчика
- Волокно (информатика)
- Переносимые потоки GNU
- Протопотоки
Ссылки
[ редактировать ]- ^ Руделл, Харальд (19 марта 2022 г.). «массовый виртуальный параллелизм» .
- ^ баелдунг (2 января 2022 г.). «Максимальное количество потоков на процесс в Linux | Информация о Linux» . www.baeldung.com . Проверено 30 марта 2022 г.
- ^ «Примечания к выпуску Go 1.14 — язык программирования Go» . go.dev . Проверено 30 марта 2022 г.
- ^ Node.js. «Не блокируйте цикл событий (или рабочий пул)» . Нод.js. Проверено 30 марта 2022 г.
- ^ «Потоки и задачи в Chrome» . chromium.googlesource.com . Проверено 5 апреля 2022 г.
- ^ Лу, Генчи (22 июля 2021 г.). «Модель потока Java и горутина Golang» . Середина . Проверено 5 апреля 2022 г.
- ^ «Принципы обработки тысяч соединений в Java с использованием Netty — производительность DZone» . dzone.com . Проверено 30 марта 2022 г.
- ^ «MacBook Pro 14 дюймов и MacBook Pro 16 дюймов» . Яблоко . Проверено 30 марта 2022 г.
- ^ «Часто задаваемые вопросы (FAQ) — язык программирования Go» . go.dev . Проверено 30 марта 2022 г.
- ^ «Черновик JEP: виртуальные потоки (предварительная версия)» . openjdk.java.net . Проверено 30 марта 2022 г.
- ^ Руделл, Харальд (22 марта 2022 г.). «Максимальное количество виртуальных потоков в Go» .
- ^ Щукоцкий, Денис (18 марта 2020 г.). «Разница между потоком и виртуальным потоком в Java | Baeldung» . www.baeldung.com . Проверено 30 марта 2022 г.
- ^ «Почему у вас могут быть миллионы горутин, но только тысячи потоков Java» . rcoh.me . 12 апреля 2018 г. Проверено 30 марта 2022 г.
- ^ «Главное — Главное — OpenJDK Wiki» . wiki.openjdk.java.net . Проверено 30 марта 2022 г.
- ^ «Язык программирования Go» . go.dev . 22 марта 2022 г. Проверено 30 марта 2022 г.
- ^ «Журнал Intel Technology» (PDF) .