Что такое потоки с легким весом и тяжелым весом в Java?
Тяжелая и легкая резьба
Ответ 1
Он связан с количеством "контекста", связанным с потоком, и, следовательно, количеством времени, которое требуется для выполнения "контекстного переключателя".
Тяжелые потоки (как правило, потоки уровня ядра /os ) имеют много контекста (аппаратные регистры, стеки ядра и т.д.). Поэтому для переключения между потоками требуется много времени. Тяжелые потоки могут также иметь ограничения на них, например, на некоторых ОС, потоки ядра не могут быть предварительно упущены, а это означает, что они не могут принудительно отключиться, пока не откажутся от контроля.
Легкие потоки с другой стороны (обычно, потоки пользовательского пространства) имеют гораздо меньший контекст. (Они, по сути, имеют один и тот же аппаратный контекст), им нужно только сохранить контекст пользовательского стека, поэтому время, затрачиваемое на переключение облегченных потоков, намного короче.
В большинстве ОС любые потоки, созданные вами в качестве программиста в пользовательском пространстве, будут легкими по сравнению с потоками пространства ядра. Не существует формального определения тяжеловеса и легкого веса, это скорее сравнение потоков с большим количеством контекста и потоков с меньшим контекстом. Не забывайте, что каждая ОС имеет свою собственную реализацию потоков, а линии между тяжелыми и светлыми потоками не обязательно четко определены. В некоторых языках программирования и фреймворках, когда вы создаете "Thread", вы даже не можете получать полный поток, вы можете просто получить некоторую абстракцию, которая скрывает реальное количество нитей внизу.
[Некоторые ОС позволяют потокам обмениваться адресным пространством, поэтому потоки, которые обычно будут довольно тяжелыми, немного легче)
Ответ 2
Стандартные потоки Java достаточно тяжелы по сравнению с потоками Erlang, которые являются очень легкими нерегулярными процессами. Эрланг демонстрирует распределенный конечный автомат. Однако, например, http://kilim.malhar.net/, библиотека расширений Java, основанная на модели Actor concurrency, предлагает конструкцию для легких потоков в Ява. Вместо Thread реализует run(), поток Kilim реализует из библиотеки Kilim с помощью метода execute(). По-видимому, он показывает, что время выполнения Java превосходит Erlang (по крайней мере, в локальной среде AFAIK). Java действительно имеет такие вещи в оригинальной спецификации языка, называемой "зелеными нитями", но последующие версии Java отбросили их в пользу родных потоков
Ответ 3
В большинстве систем потоки с легким весом - это обычные потоки, которые вы создаете с помощью библиотеки, например p_threads в linux.
В то время как тяжелый вес в некоторых системах относится к системному процессу, его собственной виртуальной памяти и более сложной структуре, например информации о производительности процесса/статистике.
Для получения дополнительной информации:
http://www.computerworld.com/s/article/66405/Processes_and_Threads
http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx