Skip to content

Latest commit

 

History

History
56 lines (38 loc) · 4.72 KB

what_is_a_thread.md

File metadata and controls

56 lines (38 loc) · 4.72 KB

Что такое поток?

Источник: What is a Thread?

Pthreads: обзор. Что такое поток?

Технически поток (thread) определяется как независимый поток инструкций, который операционная система может планировать к самостоятельному выполнению. Но что это значит?

Для разработчика ПО понятие потока лучше всего описывает «процедура», которая выполняется независимо от своей главной программы.

Идя на шаг дальше, представьте программу, содержащую ряд процедур. Теперь представьте, что все эти процедуры могут быть запланированы операционной системой к одновременному и/или независимому выполнению. Это и есть описание «многопоточной» программы.

Как это достигается?

Прежде чем понимать поток, нужно сначала понять, что такое процесс UNIX. Процесс создаётся операционной системой и требует довольно больших «накладных расходов». Процесс содержит информацию о ресурсах программы и состоянии её выполнения, включая:

  • идентификационную информацию (например, ID процесса и ID пользователя);
  • переменные окружения;
  • рабочий каталог;
  • инструкции программы;
  • состояние CPU (регистры, информация об ошибках);
  • выделенную память (стек и кучу);
  • файловые дескрипторы;
  • обработчики сигналов;
  • разделяемые библиотеки;
  • информацию, связанную с межпроцессным взаимодействием (очереди сообщений, каналы, семафоры, разделяемая память).

Процесс UNIX

Потоки внутри процесса UNIX

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

  • указатель стека;
  • регистры;
  • свойства планирования (политику, приоритет);
  • набор ожидающих и заблокированных сигналов;
  • специфичные для потока данные.

Итак, подытоживая, в среде UNIX поток:

  • существует внутри процесса и использует его ресурсы;
  • имеет собственный независимый поток управления, пока существует родительский процесс и ОС это поддерживает;
  • дублирует только те ресурсы, которые нужны ему для независимого планирования, что делает его легковесным;
  • может делить ресурсы процесса с другими потоками.

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

  • изменения, внесённые одним потоком в разделяемые системные ресурсы (например, закрытие файла), будут видны всем остальным потокам;
  • два указателя с одинаковыми значениями указывают на одни и те же данные;
  • возможно чтение и запись в одни и те же области памяти, поэтому программисту требуется явная синхронизация.

POSIX потоки