Полиморфизм (информатика)
- 1 year ago
- 0
- 0
Проце́сс — это идентифицируемая абстракция совокупности взаимосвязанных системных ресурсов на основе отдельного и независимого виртуального адресного пространства в контексте которой организуется выполнение потоков. Стандарт ISO 9000:2000 Definitions определяет процесс как совокупность взаимосвязанных и взаимодействующих действий, преобразующих входящие данные в исходящие.
Компьютерная программа сама по себе — лишь пассивная последовательность инструкций. В то время как процесс — непосредственное выполнение этих инструкций.
Также, процессом называют выполняющуюся программу и все её элементы: адресное пространство , глобальные переменные , регистры , стек , открытые файлы и так далее.
Обычно процесс в вычислительной системе представлен (также говорят, «владеет») следующими ресурсами:
Операционная система хранит большую часть информации о процессах в таблице процессов.
В операционных системах, поддерживающих потоки выполнения (нити), потоки также владеют собственными ресурсами. Обычно это только состояние процессора, хотя потоки могут использовать и другие ресурсы.
Для снижения вероятности влияния процессов друг на друга и вероятности отказа системы (например, взаимных блокировок или пробуксовки ) операционная система обеспечивает изоляцию процессов и выделяет необходимые им ресурсы. Также операционная система предоставляет механизмы для взаимодействия процессов безопасными и предсказуемыми способами.
В данном разделе рассмотрено представление процесса в памяти операционной системы Linux и архитектуры x86 . Подобное представление мало отличается от многих других многозадачных операционных систем и архитектур. Например в amd64 , наследнике x86, стек вызовов точно так же растёт сверху вниз, но размер адресного пространства увеличен до 2 48 байт.
Linux использует плоскую модель памяти , и поэтому в данной архитектуре каждому процессу доступно 2 32 байт памяти. Вся виртуальная память делится на пространство пользователя и . Пространство ядра занимает один гигабайт памяти, начиная с самого старшего адреса. Всё остальное пространство, то есть, три гигабайта отведено под пространство пользователя.
На схеме справа показано представление пользовательского пространства любого процесса. Пространство ядра едино для всех процессов, так как в операционной системе может существовать только один экземпляр ядра. После запуска программы в оперативную память импортируются команды процессора (машинный код) и инициализированные данные. В то же время в старшие адреса импортируются аргументы запуска, а также переменные окружения.
В области инициализированных данных хранятся данные, доступные только для чтения. Это могут быть, например, строковые литералы.
В области неинициализированных данных, как правило, хранятся глобальные переменные.
Куча (heap) используется для выделения памяти во время работы программы. В Linux для этого существует системный вызов
mmap
.
Область стека используется для вызова процедур .
Также немаловажной деталью является наличие случайного отступа между стеком и верхней областью, а также между областью инициализированных данных и кучей. Делается это в целях безопасности, например, для предотвращения встраивания в стек других функций.
Динамически подключаемые библиотеки и отображения файлов располагаются между стеком и кучей.
В многозадачных операционных системах появилась возможность работать одновременно с несколькими процессами. Операционные системы с вытесняющей многозадачностью позволяли добиться ощущения работы нескольких процессов одновременно. При этом потребовались средства управления несколькими процессами.
Unix
— одна из первых многозадачных ОС. Каждый процесс имеет уникальный числовой идентификатор PID. Процессы в ней имеют
древовидную
иерархию, где корнем является процесс
init
c PID 1. Новый процесс можно создать системным вызовом
fork
, он будет являться точной копией
процесса-родителя
. Любой процесс кроме init всегда имеет процесс-родитель (атрибут PPID (
англ.
Parent PID)); процессы, родитель которых завершил свою работу, становятся init.
Процессы также объединяются в
группы
. За управление идентификатором группы (PGID) отвечают системные вызовы
setpgid
и
getpgid
. PGID равен PID’у лидера группы. Процесс-потомок наследует группу от родителя. Группы используются для
управления заданиями
.
Группы процессов объединяются в
сессии
. За создание новой сессии отвечает системный вызов
setsid
. Процессы из одной группы не могут принадлежать разным сессиям. Поэтому лидер группы не может стать лидером сессии: при создании сессии дочерний процесс автоматически становится лидером сессии и лидером новой группы. Сессии используются для отслеживания всех процессов, запущенных после входа пользователя.
Каждая сессия может иметь не более одного управляющего терминала . Эмулятор терминала имеет дочерним процессом оболочку команд (чаще всего bash или sh), которая перед запуском становится лидером новой сессии и устанавливает себе управляющим терминал.
Простейшей операционной системе не требуется создание новых процессов, поскольку внутри них работает одна-единственная программа, запускаемая во время включения устройства. В более сложных системах надо создавать новые процессы. Обычно они создаются:
Процесс, помимо главного рабочего состояния, может находиться в других состояниях, например ожидания.
Процесс в ОС Linux может находиться в одном из следующих состояний:
Минимум 2 этапа завершения:
Причины завершения процесса: