От: | Serginio1 | https://habrahabr.ru/users/serginio1/topics/ | |
Дата: | 15.07.23 16:27 | ||
Оценка: | 3 (1) |
На многоядерных процессорах родная реализация встроенных потоков (native threads) может автоматически назначать работу нескольким процессорам, в то время как реализация green threads обычно не может[1][2]. Green threads могут быть запущены гораздо быстрее на некоторых виртуальных машинах. Однако, на однопроцессорных компьютерах наиболее эффективная модель ещё не определена. Тесты на компьютерах под управлением (старого) Linux на ядре версии 2.2 показали[3]:
Green threads значительно превосходят встроенные потоки Linux-системы по времени активации потоков и синхронизации.
Встроенные потоки Linux имеют несколько более высокую производительность операций ввода-вывода и переключения контекста.
Когда green thread выполняет блокирующий системный вызов, блокируется не только этот поток, но и все потоки внутри процесса[4]. Чтобы избежать этой проблемы, green threads должны использовать асинхронные операции ввода-вывода, хотя данную сложность можно скрыть, порождая скрытые для пользователя потоки на каждую операцию ввода-вывода, которые объединяются с green thread.
Есть также механизмы, которые позволяют использовать собственные потоки и снизить накладные расходы на активацию и синхронизацию потоков:
Пулы потоков снижают затраты на порождение новых потоков за счет повторного использования ограниченного числа потоков[5].
Также, языки, исполняющиеся на виртуальных машинах, НО использующие native threads, могут использовать технику оптимизации — анализ побочных эффектов (Escape-анализ), чтобы избежать синхронизации блоков кода, когда это возможно[6].