С помощью процессов можно организовать параллельное выполнение программ.
Для этого процессы клонируются с помощью вызовов fork() или
exec(), а затем между ними организуется взаимодействие средствами
IPC. Это довольно дорогостоящий с точки зрения ресурсов процесс.
С другой стороны, для организации параллельного выполнения и взаимодействия
можно использовать механизм многопоточности. Основной единицей здесь
является поток.
Поток представляет собой облегченную версию процесса. Чтобы понять,
в чем состоит его особенность, необходимо вспомнить основные характеристики
процесса:
Процесс владеет определенными ресурсами. Он размещен в некотором виртуальном
адресном пространстве, содержащем образ процесса. Кроме того, процесс
управляет другими ресурсами (файлы, устройства ввода - вывода и т.д.).
Процесс подвержен диспетчеризации. Он определяет порядок выполнения
одной или нескольких программ, при этом выполнение может перекрываться
с другими процессами. Каждый процесс имеет состояние выполнения и
приоритет диспетчеризации.
Если рассматривать эти характеристики независимо друг от друга (как
это принято в современной теории ОС), то:
Владелец ресурса обычно называется процессом или задачей. Ему присущи:
виртуальное адресное пространство;
индивидуальный доступ к процессору, другим процессам, файлам, и ресурсам
ввода - вывода.
Модуль для диспетчеризации обычно называется потоком или облегченным
процессом. Ему присущи:
состояние выполнения (активное, готовность, и т.д.);
сохранение контекста потока в неактивном состоянии;
стек выполнения и некоторую статическую память для локальных переменных;
доступ к пространству памяти и ресурсам своего процесса.
Все потоки процесса разделяют общие ресурсы. Изменения, вызванные
одним потоком, становятся немедленно доступными другим потокам.
При корректной реализации потоки имеют определенные преимущества над
процессами. Им требуется:
Меньше времени для создания нового потока, поскольку создаваемый поток
использует адресное пространство текущего процесса.
Меньше времени для завершения потока.
Меньше времени для переключения между двумя потоками в пределах того
же самого процесса.
Меньше коммуникационных расходов, поскольку потоки разделяют все ресурсы,
и в частности адресное пространство. Данные, продуцируемые одним из
потоков, немедленно становятся доступными всем другим потокам.