Процесс – это
объект операционной системы, которому выделяются ресурсы, необходимые для
выполнения приложения. Процесс имеет свое собственное виртуальное адресное
пространство (в котором размещаются код и данные программы), дескрипторы
открытых системных объектов (потоков, семафоров, мьютексов и т.д.), уникальный
идентификатор, приоритет и как минимум один поток, выполняющийся в
нем.
Поток – это некая
сущность внутри процесса, использующая центральный процессор для выполнения
команд программы. В то время как процесс является пассивным объектом –
владельцем ресурсов, поток – активный объект, необходимый для выполнения
программы. Все потоки процесса используют его виртуальное адресное пространство
и системные объекты, но каждый поток имеет свои стек и контекст выполнения
(адрес выполняемой команды и текущие значения регистров процессора). Процесс
создается с одним потоком, но в ходе выполнения любой из потоков может создать
дополнительный поток (указав для него задание на выполнение), после чего он
может либо дождаться завершения запущенного потока, либо продолжить вычисления
параллельно с ним. В последнем случае два потока смогут одновременно
использовать общие ресурсы, что приводит к необходимости организации
согласованного доступа к данным, то есть возникает задачи синхронизации
выполнения потоков.
Под параллельной программой в рамках
технологии многопоточного программирования Windows threads
будем рассматривать программу, при исполнении которой в определенные
моменты выполняется более одного вычислительного потока.
В
общем виде программа представляется в виде множества функций, часть из которых
могут параллельно выполняться в нескольких потоках. Таким образом, параллельная
программа представляет собой набор последовательных (однопотоковых) и
параллельных (многопотоковых) участков программного кода.
Запуск на выполнение дополнительных
потоков осуществляется с помощью функций Windows
API, каждый вызов функции Windows API создает один новый поток. При этом важным
аспектом программирования является то, что разработчику необходимо явно
формировать те данные, которые будут передаваться в функции дочерних потоков.
Синхронизация потоков и организация согласованного доступа к общим ресурсам
осуществляются с помощью специальных объектов синхронизации операционной
системы.