E.6 Различия между разными потоковыми пакетами
Работа MySQL в значительной степени зависит от используемого потокового
пакета. Таким образом, при выборе хорошей платформы для MySQL потоковый
пакет играет очень важную роль.
Существуют по меньшей мере три типа потоковых пакетов:
-
Пользовательские потоки в одном процессе. Переключение потоков
осуществляется сигналами (alarm) и библиотека потоков управляет всеми
функциями, не поддерживающими потоки, с помощью блокировок. Операции
чтения, записи и выборки обычно управляются программой выбора потоков,
которая переключает их на другой поток, если текущий должен ожидать
данные (речь идет о вызове select). Пакеты пользовательских потоков
могут быть интегрированы в стандартные библиотеки (FreeBSD- и
BSDI-потоки). Такие интегрированные пакеты требуют меньше затрат в
сравнении с потоковыми пакетами, которые должны обрабатывать все
ненадежные вызовы (MIT-pthreads, FSU Pthreads и потоки RTS). В
некоторых средах (например SCO) все системные вызовы поддерживают
потоки, так что обработка может быть выполнена очень просто (FSU
Pthreads под SCO). Недостатки такого метода: поскольку все вызовы, для
которых установлены соответствия, занимают мало времени, очень сложно
контролировать обработку всех ситуаций. Обычно существуют также
системные вызовы, не обрабатываемые потоковым пакетом (такие как
MIT-pthreads и сокеты). Диспетчеризация потоков не всегда является
оптимальной.
-
Пользовательские потоки в раздельных процессах. Переключение потоков
производится ядром и все данные используются совместно всеми потоками.
Потоковый пакет управляет стандартными вызовами потоков, чтобы
обеспечить совместное использование данных этими потоками. Такой метод
используется в LinuxThreads. Недостатки этого метода: масса процессов;
медленное создание потока. Если один поток умирает, то остальные
обычно зависают и необходимо их уничтожать перед перезапуском.
Переключение потоков отчасти затратно.
-
Потоки ядра. Переключение потоков управляется потоковой библиотекой
или ядром и происходит очень быстро. Все делается в одном процессе, но
для некоторых систем
ps
может показывать разные потоки. Если один из
потоков неожиданно умрет, то происходит аварийное прерывание всего
процесса. Большинство системных вызовов поддерживают потоки и должны
требовать очень небольших затрат. С потоками ядра работают Solaris,
HP-UX, AIX и OSF/1.
В некоторых системах управление потоками ядра осуществляется путем
интеграции потоков пользовательского уровня в системные библиотеки. В
подобных случаях переключение потоков может осуществляться только данной
потоковой библиотекой, и ядро фактически "не в курсе событий".
Add your own comment.