Что такое легкие и тяжелые потоки с точки зрения Java?
Тяжелая и легкая нить
- @TFD - ОП задал всего 4 вопроса, есть много времени, чтобы принять ответ. 10.02.2010
Ответы:
Это связано с объемом «контекста», связанного с потоком, и, следовательно, с количеством времени, которое требуется для выполнения «переключения контекста».
Тяжеловесные потоки (обычно потоки уровня ядра/ОС) имеют много контекста (аппаратные регистры, стеки ядра и т. д.). Поэтому для переключения между потоками требуется много времени. Тяжеловесные потоки также могут иметь ограничения на них, например, в некоторых ОС потоки ядра не могут быть вытеснены, что означает, что их нельзя принудительно отключить, пока они не передадут управление.
С другой стороны, легкие потоки (обычно потоки пространства пользователя) имеют гораздо меньший контекст. (По сути, они используют один и тот же аппаратный контекст), им нужно только хранить контекст пользовательского стека, поэтому время, необходимое для переключения облегченных потоков, намного короче.
В большинстве ОС любые потоки, которые вы создаете как программист в пользовательском пространстве, будут легковесными по сравнению с потоками в пространстве ядра. Не существует формального определения тяжеловесного и легковесного, это скорее сравнение между потоками с большим количеством контекста и потоками с меньшим контекстом. Не забывайте, что каждая ОС имеет свою собственную реализацию потоков, и границы между тяжелыми и легкими потоками не обязательно четко определены. В некоторых языках программирования и фреймворках, когда вы создаете «Поток», вы можете даже не получить полный поток, вы можете просто получить некоторую абстракцию, которая скрывает реальное количество потоков внизу.
[Некоторые операционные системы позволяют потокам совместно использовать адресное пространство, поэтому потоки, которые обычно были бы довольно тяжелыми, стали немного легче]
Стандартные потоки Java достаточно тяжелые по сравнению с потоками Erlang, которые являются очень легкими порождаемыми процессами. Erlang демонстрирует распределенный конечный автомат. Однако, например, http://kilim.malhar.net/ , библиотека расширений Java на основе Актера модель параллелизма, предлагает конструкцию для легких потоков в java. Вместо того, чтобы Thread реализовывал run(), поток Kilim реализуется из библиотеки Kilim, используя метод execute(). По-видимому, это показывает, что время выполнения Java превосходит Erlang (по крайней мере, в локальной среде, насколько мне известно). В Java действительно были такие вещи в спецификации исходного языка, называемые «зелеными потоками», но последующие версии Java отказались от них в пользу собственных потоков.
В большинстве систем облегченные потоки — это обычные потоки, которые вы создаете с помощью библиотеки, например p_threads в Linux.
В то время как тяжелый вес в некоторых системах относится к системному процессу с собственной виртуальной памятью и более сложной структурой, такой как информация о производительности/статистике процесса.
Чтобы получить больше информации:
http://www.computerworld.com/s/article/66405/Processes_and_Threads
http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx