В обычных ОС процесс определяется соответствующим адресным пространством и одиночным управляющим потоком. Но часто встречаются ситуации, когда в одном адресном пространстве предпочтительно иметь несколько квазипараллельных управляющих процессов.
Модель процесса базируется на двух независимых концепциях: группировании ресурсов и выполнении программы. Когда их разделяют, появляется понятие потока.
С одной стороны, процесс можно рассматривать как способ объединения родственных ресурсов в одну группу. У процесса есть адресное пространство, содержащее программу, данные и другие ресурсы. Ресурсами являются открытые файлы, дочерние процессы, аварийные необработанные сообщения, обработчики сигналов, учетная информация и многое другое. Гораздо проще управлять ресурсами, объединив их в форме процесса.
С другой стороны, процесс можно рассматривать как поток исполняемых команд. У потока есть счетчик команд, отслеживающий порядок выполнения действий. У него есть регистры, в которых хранятся текущие переменные. У него есть стек, содержащий протокол выполнения процесса, где на каждую вызванную процедуру отведена отдельная структура. Хотя поток протекает внутри процесса, следует различать концепции потока и процесса. Процессы используются для группирования ресурсов, а потоки являются объектами, поочередно исполняющимися на ЦП.
Концепция потоков добавляет к модели процесса возможность одновременного выполнения в одной и той же среде процесса нескольких достаточно независимых программ. Несколько потоков,
работающих параллельно в одном процессе, аналогичны нескольким процессам, идущим параллельно на одном компьютере. В первом случае потоки разделяют адресное пространство, открытые файлы и другие ресурсы. Во втором — процессы совместно пользуются физической памятью, дисками, принтерами и другими ресурсами. Потоки обладают некоторыми свойствами процессов, поэтому их иногда называют упрощенными процессами. Термин многопотонность также используется для описания использования нескольких потоков в одном процессе.
При запуске многопоточного процесса в системе с одним процессором потоки работают поочередно. Процессор быстро переключается между потоками, создавая впечатление параллельной работы потоков, даже не на очень быстром процессоре. Например, в случае трех потоков в одном процессе все потоки будут работать параллельно. Каждому потоку будет соответствовать виртуальный процессор с быстродействием, равным одной трети быстродействия реального процессора.
Почему же потоки так необходимы? Основной причиной является выполнение большинством приложений большого количества действий, некоторые из них могут время от времени блокироваться.Схему программы можно существенно упростить, если разбить приложение на несколько последовательных потоков, запущенных в квазипараллельном режиме.
При использовании потоков имеется также возможность совместного применения параллельными объектами одного адресного пространства и всех содержащихся в нем данных. Для некоторых приложений эта возможность является существенной. В таких случаях схема параллельных процессов с разными адресными пространствами не подходит.
В пользу потоков работает еще один аргумент — легкость их создания и уничтожения, так как с потоком не связаны никакие ресурсы. В большинстве систем на создание потока уходит примерно
в 100 раз меньше времени, чем на создание процесса. Это свойство особенно полезно при необходимости динамического и быстрого изменения числа потоков.
Третьим аргументом является производительность. Концепция потоков не дает увеличения производительности, если они ограничены возможностями процессора. Но когда имеется одновременная потребность в выполнении большого объема вычислений и операций ввода-вывода, наличие потоков позволяет совмещать эти процедуры во времени, увеличивая, тем самым, общую скорость работы приложения.
Концепция потоков полезна также в системах с несколькими процессорами, где возможен настоящий параллелизм.
Необходимость потоков проще продемонстрировать на конкретном примере. Рассмотрим текстовый процессор, который выводит на экран монитора текст в том виде, в котором он будет напечатан.
Допустим, что пользователь пишет книгу. С точки зрения автора проще хранить книгу в одном файле, чтобы легче было искать отдельные фрагменты, редактировать и т.п.
Представим, что пользователь удалил предложение на первой странице, а затем исправил предложение на 350-й странице документа, в котором 400 страниц. Он дает команду программе перейти на страницу с номером 350. Текстовому процессору придется переформатировать весь документ вплоть до 350-й страницы, поскольку он не знает, где начинается эта страница. Это может занять довольно много времени и вряд ли обрадует пользователя.
В данном случае помогут потоки. Пусть текстовый процессор написан в виде двухпоточной программы. Один поток взаимодействует с пользователем, а второй переформатирует документ в фоновом режиме. Как только предложение на первой странице было удалено, интерактивный поток дает команду фоновому потоку переформатировать весь документ. В то время как первый поток продолжает выполнять команды с клавиатуры или мыши, второй поток быстро переформатирует документ. Может случиться, что форматирование будет закончено раньше, чем пользователь захочет перейти к 350-й странице, и тогда команда будет выполнена мгновенно. Можно добавить третий поток. Большинство текстовых процессоров автоматически сохраняет редактируемый текст один раз в несколько минут (время устанавливается пользователем), чтобы в случае аварийного
завершения программы, отказа системы или перебоев с питанием пользователь не лишился результатов своей работы. Этим может заниматься третий поток, не отвлекая два оставшихся.