Для того чтобы воспользоваться преимуществами многопроцессорной архитектуры, MySQL использует многопотоковый подход, позволяющий распределять процессы между процессорами для достижения максимальной параллельности их выполнения. Это важно знать не только администратору базы данных, который должен понимать, каким образом MySQL лучше всего использует процессорные мощности, но и разработчикам, которые могут добавить в MySQL дополнительные функции. Все дополнительные функции должны быть безопасными в многопроцессорной работе, т.е. они должны не мешать друг другу при параллельной работе.
Ниточка с иголочкой
Для того чтобы лучше понять концепцию потока в целом, необходимо рассмотреть различие между потоками и процессами. Процесс содержит как исполняющуюся программу, так и набор ресурсов, таких как карта размещения файлов и адресное пространство. Все потоки, связанные с данной задачей, разделяют между собой ресурсы задачи, поэтому поток скорее является программным счетчиком, стеком и набором регистров. Все остальные структуры данных принадлежат задаче. Процесс запускается как задача с одним потоком.
Потоком считается мини-процесс, имеющий свой собственный стек и выполняющий свою собственную часть кода. В отличие от процесса, поток разделяет свою память с другими потоками. Группой потоков является набор потоков, исполняемых в рамках одного и того же процесса. Все они разделяют одну и ту же область памяти и могут пользоваться одними и теми же глобальными переменными, одной и той же динамической областью памяти, одним и тем же набором дескрипторов файлов и т.д. Все потоки в группе потоков выполняются с использованием квантов времени при работе на одном процессоре или параллельно на многопроцессорных системах.
Преимущество использования группы потоков над использованием группы процессов заключается в том, что контекстное переключение в первом случае происходит значительно быстрее; другими словами, система переключается между потоками значительно быстрее, чем она могла бы переключиться с одного процесса на другой. Кроме того, обмен данными между двумя потоками реализуется быстрее и проще, чем обмен данными между процессами, т.к. все потоки уже работают с общей адресной областью в памяти и разделяют одни и те же переменные.
Библиотеки потоков POSIX являются стандартным прикладным программным интерфейсом для C и C++. Они наиболее эффективным образом используются на многопроцессорных системах, где процессы можно распределять по разным процессорам, таким образом, увеличивая скорость с помощью параллельной или распределенной обработки. Потоки дают меньшую нагрузку, чем ветвление или размножение новых процессов, так как система при этом не выделяет нового виртуального адресного пространства и переменные, что необходимо в случае с процессами. Кроме того, что POSIX лучше всего проявляет себя на многопроцессорной системе, есть определенная выгода от его использования на однопроцессорных системах, в которых используется задержки в операциях ввода/вывода и других системных функций, которые могут останавливать выполнение процесса.
В зависимости от платформы, в MySQL используются различные потоковые пакеты. Потоки POSIX используются в большинстве вариантов UNIX, таких как FreeBSD и Solaris. LinuxThreads используются для дистрибутивов Linux, а в целях повышения эффективности на платформе Windows используются потоки Windows (но, в сущности, они имитируют потоки POSIX).
Так как СУБД MySQL является приложением, использующим в своей работе потоки, она может передать операционной системе выполнение задачи координирования распределения потоков между процессами для распределения нагрузки между ними. Причины использования потоков системой MySQL перечислены ниже.
■ Поток глобального соединения обрабатывает все запросы на соединение и создает отдельный выделенный поток для обработки процедуры аутентификации и обработки запросов SQL каждого соединения. Поток этого типа работает как для соединений с использованием соединений TCP/IP, так и для соединений, использующих именованные каналы.
■ Отдельным потоком обрабатываются внутренние семафоры и функции прослушивания аварийных сигналов.
■ При необходимости выделенный поток предназначается для сброса на диск копий всех таблиц через определенный интервал времени.
■ Для таблиц, при работе с которыми используется задержанный оператор INSERT, выделяется отдельный поток.
■ При репликациях для синхронизации с главным узлом используется отдельный поток.
Конечно, другим способом извлечь выгоду из многопроцессорной работы является запуск нескольких экземпляров MySQL на одной и той же машине, т.е. таким образом, запускается отдельный процесс для каждого экземпляра. Такой подход особенно удобен для компаний, предоставляющих услуги хостинга, и для обеспечения внутреннего хостинга в корпоративной среде. Работой нескольких экземпляров MySQL на одном компьютере можно легко организовать многопользовательскую работу, для которой требуются разные настройки.