Легковесные процессы обеспечивают многонитевое выполнение внутри одного процесса. Планирование выполнения LWP происходит независимо, и такие процессы могут выполняться параллельно на многопроцессорных системах. Каждый LWP связан со своей собственной нитью ядра, такая связь не прерывается на протяжении всего жизненного цикла процесса. Традиционные структуры ргос и user недостаточны для представления многонитевых процессов. Данные в этих структурах должны быть разделены на информацию, касающуюся каждого процесса и каждого LWP. В системе Solaris структура ргос используется для хранения всех данных каждого процесса, в том числе и процессозависимой части традиционной области и. Вдобавок к структурам, описывающим процесс в ядре, появляется новая структура — Iwp, которая хранит информацию о каждой LWP-составляющей контекста процесса.
Структура Iwp содержит следующую информацию:
• сохраненные значения регистров прикладного уровня (когда LWP не выполняется); • аргументы системного вызова, результаты работы и код ошибки; • информацию об обработке сигналов; • данные об использовании ресурсов и данные профиля процесса; • время подачи сигналов тревоги; • значения времени работы в режиме задачи и использования процессора; • указатель на нить ядра; • указатель на структуру ргос.
Структура Iwp может быть выгружена вместе с легковесным процессом, поэтому невыгружаемая по определению информация, например маски некоторых сигналов, хранится в структуре нити, связанной с LWP. В реализации системы под архитектуру Sparc для хранения указателя на текущую нить используется глобальный регистр %д7, что дает возможность быстрого доступа к текущему LWP и процессу. Для легковесных процессов (и нитей ядра) доступны основные средства синхронизации, такие как взаимные исключения, условные переменные, семафоры и защелки чтения-записи. Эти средства будут более подробно описаны в разделе 7. Каждое из приведенных средств может определять различные варианты поведения нитей. Например, если нить попытается получить доступ к объекту mutex, удерживаемому другой нитью, то она либо перейдет в цикл активного ожидания освобождения объекта mutex, либо блокируется до момента этого события. Когда объект синхронизации инициализируется, источник вызова этого объекта должен указать, какое поведение для него ожидается.
Все LWP используют общий набор обработчиков сигналов. Однако каждый LWP может обладать собственной маской сигналов, решая самостоятельно, какие из полученных сигналов нужно игнорировать или блокировать. Любой LWP также имеет возможность определить свой собственный альтернативный стек для обработки сигналов. Все сигналы делятся на две категории: ловушки и прерывания. Ловушки представляют собой сигналы, вырабатываемые в ходе действий самого LWP (например, SIGSEGV, SIGFPE и SIGSYS). Такие сигналы всегда передаются легковесному процессу, действия которого привели к их появлению. Сигналы прерываний (такие как SIGST0P и SIGINT) могут быть доставлены любому LWP, который не маскирует эти сигналы. Легковесные процессы не имеют глобального пространства имен и вследствие этого невидимы для других процессов. Процесс не может направить сигнал напрямую определенному LWP, принадлежащему другому процессу, а также знать, какой LWP послал ему сообщение.