Лекция: Мотивация
Совместное использование потоков на пользовательском уровне и на уровне ядра дает возможность программисту выбрать вариант параллелизма, который будет наиболее эффективным для данного приложения и подойдет для него больше других.
В некоторых программах используется логический параллелизм, который позволяет упростить и структурировать код, но для которого не нужен аппаратный параллелизм. Например, приложение со многими окнами, из которых только одно является активным, можно эффективно реализовать в виде набора потоков на пользовательском уровне, которым отвечает один облегченный процесс. Преимущество использования для таких приложений только потоков на пользовательском уровне заключается в их эффективности. Потоки на пользовательском уровне можно создавать, уничтожать, блокировать, активизировать и т.д. без участия ядра. Если бы ядру было известно о каждом потоке на пользовательском уровне, оно должно было бы размещать структуры данных для каждого потока, а также выполнять переключение потоков. Как мы видели в табл. 4.1, при переключении потоков на уровне ядра потребляется больше ресурсов, чем при переключении потоков на пользовательском уровне.
Если в приложение входят потоки, которые могут быть блокированы, например, при выполнении ввода-вывода, то заманчиво использовать несколько облегченных процессов, поддерживающих такое же или большее количество потоков на пользовательском уровне. Чтобы в рамках этого же процесса могли выполняться и другие потоки, не нужно никакого вмешательства приложения или библиотеки потоков. Если один из потоков процесса будет блокирован, другие его потоки могут выполняться в оставшихся облегченных процессах.
В некоторых приложениях эффективным является взаимно однозначное отображение потоков на уровне ядра и облегченных процессов. Например, можно реализовать такое параллельное вычисление элементов массива, чтобы элементы, стоящие в разных строках, вычислялись в разных потоках. Если каждому потоку на пользовательском уровне соответствует свой облегченный процесс, то переключать потоки при вычислениях не потребуется.
Для некоторых приложений подходит смешанное использование потоков, постоянно связанных с облегченными процессами, и несвязанных потоков (при этом несколько облегченных процессов совместно используются несколькими потоками). Например, при реализации прикладной системы реального времени программист может захотеть, чтобы одни потоки обладали приоритетом в масштабе всей системы и планировались в реальном времени, а другие — выполняли функции в фоновом режиме и могли совместно использовать один или небольшое количество облегченных процессов.