Чтобы поддерживать мультипрограммирование (многозадачность), ОС должна определить и оформить для себя те внутренние единицы работы, между которыми будет разделяться процессор и другие ресурсы компьютера.
В настоящее время в большинстве операционных систем определены два типа единиц работы.
Более крупная единица работы – процесс.
С помощью процессов удается обеспечить псевдопараллельное (при однопроцессорной вычислительной системе) или параллельное (при многопроцессорной вычислительной системе) выполнение заданий.
Но дело в том, что приложение (задание) может обладать внутренним параллелизмом, использование которого потенциально может ускорить вычисления.
Для реализации этой возможности в операционной системе наряду с процессами должен быть другой механизм распараллеливания вычислений, который учитывал бы тесные связи между отдельными ветвями вычислений одного и того же приложения.
И нужна более мелкая единица работы чем процесс - «поток», или «нить» (threads).
В Windows поддерживаются еще более мелкая единица работы - волокна (fibers).
Потоки возникли в операционных системах как средство дополнительного распараллеливания вычислений в рамках одного процесса, когда приложение обладает внутренним параллелизмом.
Подобно процессам потоки в системе описываются структурой данных, которую обычно называют блоком управления потоком (thread control block, TCB).
В операционных системах, где существуют и процессы, и потоки, процесс рассматривается операционной системой как заявка на потребление всех видов ресурсов, кроме одного — процессорного времени.
Этот последний важнейший ресурс распределяется операционной системой между другими единицами работы — потоками, которые и получили свое название благодаря тому, что они представляют собой последовательности (потоки выполнения) команд.
Процессу ОС назначает адресное пространство и набор ресурсов, которые совместно используются всеми его потоками.
Создание потоков требует от ОС меньших накладных расходов, чем процессов.
В отличие от процессов, которые принадлежат разным, вообще говоря, конкурирующим приложениям, все потоки одного процесса всегда принадлежат одному приложению, поэтому ОС изолирует потоки в гораздо меньшей степени, нежели процессы в традиционной мультипрограммной системе.
Для потоков в отличии от процессов характерно следующие важное свойство: они делят между собой почти все ресурсы потока- одновременно используют эти ресурсы.
Обычно различные потоки совместно используют следующие ресурсы процесса:
1) адресное пространство;
2) глобальные переменные;
3) открытые файлы;
4) дочерние процессы;
5) необработанные аварийные сигналы;
6) сигналы тревоги и их обработчики;
7) информацию об используемых ресурсах.
При этом каждый из потоков имеет собственный:
• счетчик команд
• регистр
• стеки
• состояние процессора
• локальные переменные
Все потоки одного процесса используют общие файлы, таймеры, устройства, одну и ту же область оперативной памяти, одно и то же адресное пространство.
Это означает, что они разделяют одни и те же глобальные переменные.
Поскольку каждый поток может иметь доступ к любому виртуальному адресу процесса, один поток может использовать стек другого потока.
Между потоками одного процесса нет полной защиты, потому что, во-первых, это невозможно, а во-вторых, не нужно.
Чтобы организовать взаимодействие и обмен данными, потокам вовсе не требуется обращаться к ОС, им достаточно использовать общую память — один поток записывает данные, а другой читает их.
С другой стороны, потоки разных процессов по-прежнему хорошо защищены друг от друга
Итак, мультипрограммирование более эффективно на уровне потоков, а не процессов.
Задача, оформленная в виде нескольких потоков в рамках одного процесса, может быть выполнена быстрее за счет псевдопараллельного (или параллельного в мультипроцессорной системе) выполнения ее отдельных частей.
Наибольший эффект от введения многопоточной обработки достигается в мультипроцессорных системах, в которых потоки, в том числе и принадлежащие одному процессу, могут выполняться на разных процессорах действительно параллельно (а не псевдопараллельно).
В каждой ОС имеются системные вызовы с помощью которых программа выполняемая в процессе может произвести запуск, приостановку и завершение одного или нескольких потоков.
При переключениях процессора (обычно по таймеру) между отдельными потоками ОС тратится значительно меньше времени чем при переключении между отдельными процессами.
Это связано с тем, что в данном случи процессору нужно производить дополнительные и последующие восстановление значительно меньшего числа переменных процесса (счетчика команд, регистров стеков состояний процессора).
При переключении между потоками процессору нет необходимости производить выполнение самых длительных операций (запоминание и восстановление памяти используемых процессов, описание состояния всех файлов, а так же устройств занятый процессом).