Открыть сервис

Поток выполнения

Поток выполнения (также поток, нить, тред; от англ. thread of execution) — это наименьшая единица обработки, которую операционная система может планировать и выполнять независимо. Поток выполнения представляет собой последовательность инструкций (команд) процессора, выполняемых в рамках одного процесса. В отличие от процесса, который обладает собственным адресным пространством, потоки одного процесса разделяют это пространство, а также другие ресурсы (открытые файлы, сокеты, семафоры), что позволяет им эффективно взаимодействовать и обмениваться данными.

История

Концепция многопоточности начала формироваться в 1960-х годах с появлением мультипрограммирования. Первые операционные системы, такие как CTSS (Compatible Time-Sharing System), поддерживали только однопоточные процессы. Идея разделения процесса на несколько независимых потоков выполнения была впервые реализована в операционной системе OS/360 компании IBM, где использовались «задачи» (tasks), по сути являвшиеся потоками.

Значительный шаг вперёд был сделан в 1980-х годах с появлением операционной системы Unix. В System V Release 4 (SVR4) и 4.3BSD были введены первые реализации потоков на уровне ядра. Однако настоящий прорыв произошёл в 1990-х годах с развитием многопроцессорных систем. Операционные системы Windows NT (1993) и Linux (с версии 2.0) получили полноценную поддержку многопоточности. В 1995 году стандарт POSIX.1c (также известный как POSIX Threads, или Pthreads) унифицировал интерфейс для работы с потоками в Unix-подобных системах.

Современные операционные системы (Windows, Linux, macOS, FreeBSD) поддерживают многопоточность на уровне ядра, а аппаратная поддержка (гиперпоточность, SMT — Simultaneous Multithreading) позволяет одному физическому ядру процессора выполнять несколько потоков одновременно.

Классификация потоков выполнения

По реализации

По отношению к процессу

Устройство и характеристики

Каждый поток выполнения характеризуется следующими компонентами:

Разделяемые ресурсы

Потоки одного процесса совместно используют:

Синхронизация потоков

Поскольку потоки разделяют память, одновременный доступ к общим данным может приводить к состояниям гонки (race conditions), когда результат выполнения зависит от порядка доступа. Для предотвращения этого используются механизмы синхронизации:

Проблемы многопоточности

Применение

Многопоточность широко используется в различных областях:

Пул потоков (Thread Pool)

Для снижения накладных расходов на создание и уничтожение потоков часто используется пул потоков. При старте приложения создаётся фиксированное количество потоков, которые находятся в состоянии ожидания. При поступлении задачи (например, запроса от клиента) один из свободных потоков из пула получает задание на выполнение. После завершения работы поток возвращается в пул и ожидает следующей задачи. Это позволяет избежать частого создания потоков и ограничить общее количество одновременно работающих потоков.

Интересные факты

Источники

  1. Таненбаум Э., Бос Х. «Современные операционные системы». 4-е издание. — СПб.: Питер, 2015.
  2. Стивенс У., Раго С. «UNIX. Профессиональное программирование». 3-е издание. — СПб.: Питер, 2014.
  3. Лав Р. «Linux. Системное программирование». 2-е издание. — СПб.: Питер, 2014.
  4. Херлихи М., Шавит Н. «Искусство многопроцессорного программирования». — М.: ДМК Пресс, 2012.
  5. Буч Г. «Объектно-ориентированный анализ и проектирование с примерами приложений». 3-е издание. — М.: Вильямс, 2008.
  6. Документация POSIX.1c (IEEE Std 1003.1c-1995).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →