Включите исполнение JavaScript в браузере, чтобы запустить приложение.
13 янв 2025

Процессы и потоки: ключевые отличия и их роль в операционных системах

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

Что такое процесс в операционной системе

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

Пример. На одной и той же вычислительной системе запускается программа по решению двух логарифмов: log25x и log(7x+9). Несмотря на то что программа одна, система запустит два разных вычислительных процесса, так как в них используются разные исходные данные.

В программировании принято выделять два типа процессов:

  • основные, используемые процессором;
  • дочерние, созданные под основным процессом.

Для каждого процесса выделяется отдельное адресное пространство. То есть, при одновременном запуске двух или более процессов ни один из них не имеет доступа к структурам и переменным «конкурентов». Исключение из этого правила может быть только в тех случаях, когда оператор настроил межпроцессорное взаимодействие. Например, для обмена информацией по каналам связи между несколькими ПК или передачи отдельных файлов.

К элементам процесса относят:

  • открытые файлы;
  • файлы, отображенные в памяти;
  • дескрипторы;
  • адресное пространство;
  • дочерние процессы;
  • потоки — в одном процессе их может быть несколько.

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

  • Создание и завершение. Эти операции для каждого процесса выполняются один раз.
  • Запуск — процесс переводится в состояние исполнения.
  • Блокировка и разблокировка. Процесс может быть заблокирован, например, в результате ожидания входных данных, которые ему недоступны в конкретный момент времени. После получения требуемой информации происходит выход временно остановленного процесса из режима ожидания.
  • Изменение приоритета. Текущий процесс может быть приостановлен ОС, так как согласно новому алгоритму, в первую очередь время центрального процессора выделяется на другую задачу.

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

Что такое поток и его особенности

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

Каждый поток состоит из трех основных элементов:

  • стек — представляет собой способ хранения данных с упорядоченными элементами, где удаление и добавление элементов выполняется по принципу «последним пришел, первым ушел»;
  • регистр процессора — определенный участок памяти внутри процессора, предназначенный для промежуточного хранения информации и имеющий длину от 8 до 32 бит;
  • счетчик команд — регистр процессора, который определяет последовательность выполнения команд.

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

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

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

Модели потоков в современных операционных системах

В зависимости от способа классификации выделяют три типа моделирования потоков:

  • по отображению в ядро;
  • по уровню реализации;
  • по виду многозадачности.

Модели отображения в ядро

  • 1:1. Такая модель считается наиболее простой, используется в Windows и Linux с ядром от 2.6 и выше. Основной принцип модели 1:1 — за управление любым потоком внутри любого процесса напрямую отвечает планировщик ядра.
  • N:M. Относится к гибридным системам, обладает высокой производительностью, но сложна в реализации. Основной принцип модели: часть пользовательских потоков (N) выполняется за счет команд из планировщика ОС, потоки режима ядра (M) управляются планировщиком потоков процесса или библиотекой потоков. Например, это может быть GNU Portable Threads — библиотека пользовательского пространства на базе POSIX/ANSI-C для UNIX-платформ.
  • N:1. Все пользовательские потоки управляются планировщиком ядра ОС. Примером такой модели могут служить волокна — облегченные пользовательские потоки, которые чаще всего применяются для упрощения портирования софта, разработанного для другой ОС.

Модели потоков в зависимости от уровня реализации

  • Поддержка потоков в режиме пользователя. В теории такая модель должна быть удобна, однако в реальности широкого распространения она не получила. В частности, данная модель реализована в GNU Portable Threads, благодаря чему обеспечивается простота переноса библиотеки с одной ОС на другую.
  • Поддержка потоков на уровне ядра. В эту группу входят все модели потоков, относящиеся к формату 1:1. Например, Native Posix Threads Library (NPTL), Win 32, Leight Weight Kernel Threads (LWKT) в DragonFlyBSD.
  • Гибридный режим. В таких моделях разработчики пытаются создать тандем из одновременной поддержки потоков в режиме пользователя и на уровне ядра. Например, гибридная схема, работающая по модели N:M, была реализована в стандарте Posix Threads в NetBSD. Однако достоинств у нее было меньше, чем недостатков, поэтому впоследствии система N:M была заменена моделью 1:1.

Проблемы многопоточности

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

  • Состояние гонки — так называют ошибку проектирования, в результате которой итоговое решение зависит от порядка реализации отдельных частей кода. Для решения проблемы можно предложить, например, использовать атомарные операции или ограничить доступ потоков к переменной так, чтобы в каждый отдельный момент времени ее мог изменять только один из потоков.
  • Взаимная блокировка — возникает в ситуации, когда параллельные потоки ожидают ресурсы, которые уже заняты «конкурентами», в результате чего ни один из них не может продолжить работу. 
  • Голодание потоков — отсутствие доступа потока к какому-либо общему ресурсу, так как он непрерывно занят другими потоками, имеющими первоочередную важность.
  • Livelock или живой замок — явление, при котором потоки непрерывно реагируют на действия друг друга, из-за чего у них не остается возможности возобновить работу.

Практическое использование потоков и процессов

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

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