0:07
Поток — это отдельный объект в операционной системе,
который привязан к процессу.
После создания и инициализации поток
переходит в состояние "готовность",
занимая в своей группе приоритетности место в конце очереди.
Планировщик операционной системы в соответствии
с описанной стратегией выбирает поток,
переводя его в состояние "выполнение".
По истечении отведенного кванта времени
поток возвращается в состояние "готовность",
становясь в хвост очереди в своей группе приоритетности.
Из состояния "выполнение" поток может перейти
в другие состояния и до завершения
отведенного кванта времени.
В состояние "готовность" он может перейти,
если появился поток с большим приоритетом.
В состояние "завершение" поток переходит,
выполнив свою работу, завершив выполнение
отведенного ему фрагмента кода.
В состояние "ожидание" поток может перейти,
если его дальнейшее выполнение возможно только
после наступления некоторого события
(например, ему потребуются данные,
а устройство компьютера, выполняющее
ввод этих данных, еще не завершило свою работу).
Из состояния "ожидание" поток может перейти
в состояние "готовность", если наступило событие,
ожидаемое потоком.
За время жизни потока он многократно проходит цикл
"готовность" — "выполнение" — "ожидание" — "готовность",
иногда минуя переход в состояние "ожидания".
Так как весь процесс вычислений на компьютере
управляется событиями, каждый поток во время
своего выполнения многократно прерывается,
уступая свое место другому потоку.
События, приводящие к приостановке выполнения потока,
могут быть асинхронными по отношению к его работе, —
они могут произойти в любой момент выполнения потока.
Такие события называются прерываниями.
Синхронные события, связанные с тем,
что по тем или иным причинам выполнение потока
становится невозможным, называются исключениями
или исключительными ситуациями.
Типичными примерами исключительных ситуаций являются
такие ситуации, как попытка деления целого числа на ноль
или попытка чтения записи несуществующего файла.
1:53
В большинстве случаев самому программисту
приходится разрабатывать параллельный алгоритм
своей задачи, позволяющий эффективно
использовать возможности современных компьютеров.
Новая техника со многими процессорами
требует новых программ со многими потоками,
новых программ для кластеров и суперкомпьютеров.
Потоком можно управлять двумя способами.
Потоки на уровне ядра — выделяется стек
выполнения внутри адресного пространства,
создается и инициализируется блок
управления потоком по аналогии с блоком управления процессом,
каждый поток идентифицируется своим номером —
thread ID, по аналогии с process ID.
Управления потоками на уровне пользователя —
2:32
есть возможность управлять потоками из библиотеки
режима пользователя. Например, библиотека pthreads.
Потоки на уровне пользователя работают в 10-100 раз быстрее,
чем потоки режима ядра.
Это связано с тем, что для перепланировки выполнения
потоком одного процесса не происходит
перехода из режима пользователя в режим ядра
для исполнения функций управления.
Создание и синхронизация потоков выполняется без участия ядра.
Приведем некоторые цифры.
Создание потока даже в режиме ядра
в 2,5 раза быстрее создания нового процесса.
Создание потока в режиме пользователя
в 20 раз быстрее создания потока в режиме ядра.
В Windows есть только возможность создания потоков
на уровне ядра. Это связано с синхронизациями
процессов ввода/вывода.
Файберы являются еще более "легкими"
блоками планирования, относящимися
к кооперативной многозадачности.
Выполняющийся файбер должен явно "уступить"
право другим файберам на выполнение,
что делает их реализацию гораздо легче,
чем реализацию потоков выполнения ядра или
пользовательских потоков выполнения.
Файберы могут быть запланированы для запуска
в любом потоке выполнения внутри того же процесса.
Это позволяет приложениям получить
повышение производительности за счет управления
планированием самого себя, вместо того чтобы полагаться
на планировщика ядра (который может быть
не настроен на такое применение).
Параллельные среды программирования, такие как OpenMP,
обычно реализуют свои задачи посредством файберов.
Файберы могут быть реализованы без поддержки
операционной системы, хотя некоторые операционные системы
и библиотеки предоставляют явную поддержку для них.
Windows библиотека Win32 содержит API для файберов.
4:06
Пул потоков — это коллекция потоков,
которые могут использоваться для выполнения
нескольких задач в фоновом режиме.
Это позволяет разгрузить главный поток
для асинхронного выполнения других задач.
Пулы потоков часто используются в серверных приложениях.
Каждый входящий запрос назначается потоку из пула,
таким образом, запрос может обрабатываться асинхронно
без задействования главного потока
и задержки обработки последующих запросов.
Когда поток в пуле завершает выполнение задачи,
он возвращается в очередь ожидания,
в которой может быть повторно использован.
Повторное использование позволяет приложениям избежать
дополнительных затрат на создание новых
потоков для каждой задачи.
Обычно пулы имеют максимальное количество потоков.
Если все потоки заняты, дополнительные задачи
помещаются в очередь, где хранятся до тех пор,
пока не появятся свободные потоки.
Можно реализовать собственный пул потоков,
но гораздо проще использовать пул, предоставляемый
операционной системой через определенный набор классов.