Существует две основных категории потоков с точки зрения реализации:
- пользовательские потоки, которые реализуются через специальные библиотеки потоков;
- потоки уровня ядра, которые реализуются через системные вызовы.
Каждый уровень имеет свои достоинства и недостатки. Некоторые операционные системы позволяют реализовать потоки обоих уровней.
Пользовательские потоки.
При использовании этого уровня ядро не знает о существовании потоков - все управление потоками реализуется приложением с помощью специальных библиотек. Переключение потоков не требует привилегий режима ядра, а планирование полностью зависит от приложения. При этом ядро управляет деятельностью процесса. Если поток вызывает системную функцию, то будет блокирован весь процесс, но для поточной библиотеки этот поток будет находиться в активном состоянии. Здесь состояние потока не зависит от состояния процесса.
Преимущества пользовательских потоков в следующем:
- переключение потоков не требует участия ядра - нет переключения из режима задачи в режим ядра;
- планирование может определяться приложением - при этом выбирается наилучший алгоритм;
- пользовательские потоки могут применяться в любой ОС - необходимо лишь наличие совместимой библиотеки потоков.
Недостатки пользовательских потоков:
- большинство системных вызовов является блокирующими и ядро блокирует процессы - включая все потоки в пределах процесса;
- ядро может направлять на процессоры только процессы - два потока в пределах одного и того же процесса не могут выполняться одновременно на двух разных процессорах.
Потоки уровня ядра
На этом уровне все управление потоком выполняется ядром. Используется программный интерфейс приложения (системные вызовы) для работы с потоками уровня ядра. Ядро поддерживает информацию о контексте процесса и потоков; переключение потоков требует выполнения дисциплины планирования ядра на уровне этих потоков.
Преимущества потоков уровня ядра:
- ядро может одновременно планировать выполнение нескольких потоков одного процесса на нескольких процессорах, блокирование выполняется на уровне потока;
- процедуры ядра могут быть многопоточными.
Недостатки:
- переключение потоков в пределах одного процесса требует участия ядра.
Основной библиотекой для реализации пользовательских потоков является библиотека потоков POSIX, которая называется pthreads.