Что такое процесс в операционной системе
Процессом называют некий независимый объект, потребляющий системные ресурсы при выполнении заданной программы. То есть это исполнительная единица, служащая для запуска программы и ее исполнения.
Пример. На одной и той же вычислительной системе запускается программа по решению двух логарифмов: 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 или живой замок — явление, при котором потоки непрерывно реагируют на действия друг друга, из-за чего у них не остается возможности возобновить работу.
Практическое использование потоков и процессов
Потоки и процессы используются при программировании различных приложений и серверов, упрощая и ускоряя обработку информации.
Например, разработчику нужно организовать работу веб-сервера. Для этого он будет манипулировать потоком диспетчера и рабочими потоками. Диспетчер считывает входящие из сети запросы, анализирует их и передает на выполнение свободному рабочему потоку. Этот рабочий поток переходит в состояние готовности, проверяет доступность запрашиваемых данных из кеша доступных ему веб-страниц. При отсутствии информации запускается процесс чтения с диска, а поток блокируется до тех пор, пока не будет завершена дисковая операция. При блокировке рабочего потока активируется другой поток в стадии готовности или диспетчер. Благодаря такому решению упрощается программирование, и возрастает производительность всей системы.