Применение потоков для обеспечения параллельной работы (TCP)
12.1. Введение
В предыдущей главе рассматривались параллельные серверы с установлением логического соединения и использовался мультипроцессный проект для иллюстрации одного из способов организации параллельной работы. В настоящей главе показано, как могут использоваться потоки для обеспечения параллельной работы. В ней описаны общие характеристики потоков, их преимущества и недостатки, а также приведен пример параллельного сервера с установлением логического соединения, реализованного по принципу создания нескольких потоков в одном процессе. Этот пример сервера соответствует алгоритму 8.41, который также служил основой проекта, применяемого в предыдущей главе. Как и в проекте реализации параллельного сервера, в котором используется несколько процессов, системный администратор предусматривает создание одного ведущего потока во время начальной загрузки системы. Ведущий поток работает неопределенно долгое время, ожидая поступления от клиентов новых запросов на установление соединения. Ведущий поток создает новый ведомый поток для обслуживания каждого соединения с клиентом, а ведомый поток выполняет все операции обмена данными с этим клиентом. После того как ведомый поток заканчивает отвечать на запросы определенного клиента, его работа завершается. Сегодня в магазине увидел ламинат таркетт - надо подумать.
12.2. Краткий обзор потоков Linux
- Динамическое создание. Новый поток может быть создан в любое время путем вызова функции pthread_create. Операционная система ограничивает максимально допустимое количество параллельных потоков, равно как и максимальное количество параллельных процессов
- Параллельное выполнение. При использовании однопроцессорного компьютера лишь создается впечатление, что все потоки выполняются одновременно. На многопроцессорном компьютере действительно выполняется сразу несколько потоков, поскольку операционная система может назначить для каждого из них по одному процессору.
- Многозадачный режим с вытеснением. Операционная система распределяет ресурсы процессора по потокам. В том случае, если число активных потоков превышает число доступных процессоров (например, на однопроцессорном компьютере), система передает ресурсы процессора от одного потока к другому автоматически, разрешая одному потоку выполняться в течение короткого времени перед передачей ресурсов другому. API-интерфейс управления потоками включает также функцию sched_yield, которую поток может вызвать, чтобы добровольно отказаться от ресурсов процессора, прежде чем закончится выделенный ему квант времени.
- Приватные локальные переменные. Каждый поток имеет свой собственный, приватный стек. Этот стек используется для распределения локальных переменных и хранения записей активизации процедур (т.е. информации о вызовах процедур).
- Разделяемые глобальные переменные. Все потоки процесса разделяют единый набор глобальных переменных.
- Разделяемые дескрипторы файлов. Все потоки процесса разделяют единый набор дескрипторов файлов.
- Функции координации и синхронизации. API-интерфейс управления потоками включает функции, которые могут использоваться потоками для координации и синхронизации выполнения.