Потоки. Мультипрограммирование на уровне потоков

Чтобы поддерживать мультипрограммирование (многозадачность), ОС должна определить и оформить для себя те внутренние единицы работы, между которыми будет разделяться процессор и другие ресурсы компьютера.

В настоящее время в большинстве операционных систем определены два типа единиц работы.

Более крупная единица работы – процесс.

С помощью процессов удается обеспечить псевдопараллельное (при однопроцессорной вычислительной системе) или параллельное (при многопроцессорной вычислительной системе) выполнение заданий.

Но дело в том, что приложение (задание) может обладать внутренним параллелизмом, использование которого потенциально может ускорить вычисления.

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

И нужна более мелкая единица работы чем процесс - «поток», или «нить» (threads).

В Windows поддерживаются еще более мелкая единица работы - волокна (fibers).

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

Подобно процессам потоки в системе описываются структурой данных, которую обычно называют блоком управления потоком (thread control block, TCB).

В операционных системах, где существуют и процессы, и потоки, процесс рассматривается операционной системой как заявка на потребление всех видов ресурсов, кроме одного — процессорного времени.

Этот последний важнейший ресурс распределяется операционной системой между другими единицами работы — потоками, которые и получили свое название благодаря тому, что они представляют собой последовательности (потоки выполнения) команд.

Процессу ОС назначает адресное пространство и набор ресурсов, которые совместно используются всеми его потоками.

Создание потоков требует от ОС меньших накладных расходов, чем процессов.

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

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

Обычно различные потоки совместно используют следующие ресурсы процесса:

1) адресное пространство;

2) глобальные переменные;

3) открытые файлы;

4) дочерние процессы;

5) необработанные аварийные сигналы;

6) сигналы тревоги и их обработчики;

7) информацию об используемых ресурсах.

При этом каждый из потоков имеет собственный:

• счетчик команд

• регистр

• стеки

• состояние процессора

• локальные переменные

Все потоки одного процесса используют общие файлы, таймеры, устройства, одну и ту же область оперативной памяти, одно и то же адресное пространство.

Это означает, что они разделяют одни и те же глобальные переменные.

Поскольку каждый поток может иметь доступ к любому виртуальному адресу процесса, один поток может использовать стек другого потока.

Между потоками одного процесса нет полной защиты, потому что, во-первых, это невозможно, а во-вторых, не нужно.

Чтобы организовать взаимодействие и обмен данными, потокам вовсе не требуется обращаться к ОС, им достаточно использовать общую память — один поток записывает данные, а другой читает их.

С другой стороны, потоки разных процессов по-прежнему хорошо защищены друг от друга

Итак, мультипрограммирование более эффективно на уровне потоков, а не процессов.

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

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

В каждой ОС имеются системные вызовы с помощью которых программа выполняемая в процессе может произвести запуск, приостановку и завершение одного или нескольких потоков.

При переключениях процессора (обычно по таймеру) между отдельными потоками ОС тратится значительно меньше времени чем при переключении между отдельными процессами.

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

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