В вычислительной технике процесс — это экземпляр компьютерной программы , которая выполняется одним или несколькими потоками . Существует множество различных моделей процессов, некоторые из которых являются легковесными, но почти все процессы (даже целые виртуальные машины ) укоренены в процессе операционной системы ( ОС), которая включает в себя программный код, назначенные системные ресурсы, физические и логические разрешения на доступ и структуры данных для инициирования, управления и координации выполнения. В зависимости от ОС процесс может состоять из нескольких потоков выполнения, которые выполняют инструкции одновременно . [1] [2]
В то время как компьютерная программа представляет собой пассивный набор инструкций, обычно хранящихся в файле на диске, процесс представляет собой выполнение этих инструкций после загрузки с диска в память. Несколько процессов могут быть связаны с одной и той же программой; например, открытие нескольких экземпляров одной и той же программы часто приводит к выполнению более одного процесса.
Многозадачность — это метод, позволяющий нескольким процессам совместно использовать процессоры (ЦП) и другие системные ресурсы. Каждый ЦП (ядро) выполняет один процесс за раз. Однако многозадачность позволяет каждому процессору переключаться между задачами, которые выполняются, без необходимости ожидания завершения каждой задачи ( вытеснение ). В зависимости от реализации операционной системы переключения могут выполняться, когда задачи инициируются и ждут завершения операций ввода/вывода , когда задача добровольно уступает ЦП, при аппаратных прерываниях и когда планировщик операционной системы решает, что процесс истек, используя свою справедливую долю процессорного времени (например, с помощью Completely Fair Scheduler ядра Linux ).
Распространенная форма многозадачности обеспечивается разделением времени ЦП , которое является методом чередования выполнения пользовательских процессов и потоков, и даже независимых задач ядра - хотя последняя функция осуществима только в вытесняющих ядрах , таких как Linux . Вытеснение имеет важный побочный эффект для интерактивных процессов, которым дан более высокий приоритет по отношению к процессам, связанным с ЦП, поэтому пользователям немедленно назначаются вычислительные ресурсы при простом нажатии клавиши или при перемещении мыши. Кроме того, приложениям, таким как воспроизведение видео и музыки, дается некоторый приоритет в реальном времени, вытесняя любой другой процесс с более низким приоритетом. В системах с разделением времени переключение контекста выполняется быстро, что создает впечатление, что несколько процессов выполняются одновременно на одном процессоре. Это, казалось бы, одновременное выполнение нескольких процессов называется параллелизмом .
В целях безопасности и надежности большинство современных операционных систем предотвращают прямое взаимодействие между независимыми процессами, обеспечивая строго опосредованное и контролируемое межпроцессное взаимодействие.
В общем случае процесс компьютерной системы состоит из (или считается, что он владеет ) следующих ресурсов:
Операционная система хранит большую часть этой информации об активных процессах в структурах данных, называемых блоками управления процессами . Любое подмножество ресурсов, как правило, по крайней мере состояние процессора, может быть связано с каждым из потоков процесса в операционных системах, которые поддерживают потоки или дочерние процессы.
Операционная система разделяет свои процессы и выделяет необходимые им ресурсы, чтобы они с меньшей вероятностью мешали друг другу и вызывали сбои системы (например, взаимоблокировку или пробуксовку ). Операционная система также может предоставлять механизмы для межпроцессного взаимодействия , чтобы процессы могли взаимодействовать безопасным и предсказуемым образом.
Многозадачная операционная система может просто переключаться между процессами , создавая видимость одновременного выполнения множества процессов (то есть параллельно ), хотя на самом деле в любой момент времени на одном ЦП может выполняться только один процесс (если только ЦП не имеет нескольких ядер, тогда можно использовать многопоточность или другие подобные технологии). [a]
Обычно один процесс ассоциируется с основной программой, а дочерние процессы — с любыми побочными параллельными процессами, которые ведут себя как асинхронные подпрограммы. Говорят, что процесс владеет ресурсами, одним из которых является образ его программы (в памяти). Однако в многопроцессорных системах многие процессы могут работать из одной и той же реентерабельной программы в одном и том же месте памяти или совместно использовать ее, но говорят, что каждый процесс владеет своим собственным образом программы.
Процессы часто называют «задачами» во встроенных операционных системах. Смысл «процесса» (или задачи) — «что-то, что занимает время», в отличие от «памяти», которая является «чем-то, что занимает место». [b]
Приведенное выше описание применимо как к процессам, управляемым операционной системой, так и к процессам, определенным исчислениями процессов .
Если процесс запрашивает что-то, чего он должен ждать, он будет заблокирован. Когда процесс находится в заблокированном состоянии , он может быть выгружен на диск, но это прозрачно в системе виртуальной памяти , где области памяти процесса могут быть на самом деле на диске, а не в основной памяти в любое время. Даже части активных процессов/задач (выполняемых программ) могут быть выгружены на диск, если эти части не использовались в последнее время. Не все части выполняющейся программы и ее данные должны находиться в физической памяти, чтобы связанный с ней процесс был активным.
Ядро операционной системы , которое допускает многозадачность, требует, чтобы процессы имели определенные состояния . Названия для этих состояний не стандартизированы, но они имеют схожую функциональность. [1]
Когда процессам необходимо общаться друг с другом, они должны совместно использовать части своих адресных пространств или использовать другие формы межпроцессного взаимодействия (IPC). Например, в конвейере оболочки вывод первого процесса должен передаваться второму и т. д. Другой пример — задача, которая была разложена на взаимодействующие, но частично независимые процессы, которые могут выполняться одновременно (т. е. с использованием параллелизма или истинного параллелизма — последняя модель является частным случаем параллельного выполнения и осуществима всякий раз, когда для процессов, готовых к выполнению, доступны несколько ядер ЦП).
Возможно даже, что два или более процессов будут работать на разных машинах, которые могут работать под управлением разных операционных систем (ОС), поэтому необходимы некоторые механизмы для связи и синхронизации (называемые протоколами связи для распределенных вычислений) (например, интерфейс передачи сообщений {MPI}).
К началу 1960-х годов программное обеспечение для управления компьютером претерпело изменения от программного обеспечения для управления монитором, например, IBSYS , до программного обеспечения для управления исполнительными системами. Со временем компьютеры стали быстрее, в то время как машинное время все еще не было дешевым и не использовалось полностью; такая среда сделала многопрограммирование возможным и необходимым. Многопрограммирование означает, что несколько программ выполняются одновременно . Сначала на одном процессоре работало более одной программы в результате базовой однопроцессорной компьютерной архитектуры, и они совместно использовали скудные и ограниченные аппаратные ресурсы; следовательно, параллелизм носил последовательный характер . В более поздних системах с несколькими процессорами несколько программ могут выполняться одновременно параллельно .
Программы состоят из последовательностей инструкций для процессоров. Один процессор может выполнять только одну инструкцию за раз: невозможно запустить несколько программ одновременно. Программе может потребоваться некоторый ресурс , например, устройство ввода, которое имеет большую задержку, или программа может запустить какую-то медленную операцию, например, отправку вывода на принтер. Это приведет к тому, что процессор будет «простаивать» (не использоваться). Чтобы процессор был постоянно занят, выполнение такой программы останавливается, и операционная система переключает процессор на выполнение другой программы. Пользователю будет казаться, что программы выполняются одновременно (отсюда и термин «параллельный»).
Вскоре после этого понятие «программа» было расширено до понятия «исполняемая программа и ее контекст». Родилось понятие процесса, которое также стало необходимым с изобретением реентерабельного кода . Потоки появились несколько позже. Однако с появлением таких концепций, как разделение времени , компьютерные сети и многопроцессорные компьютеры с общей памятью , старое «мультипрограммирование» уступило место настоящей многозадачности , многопроцессорности и, позднее, многопоточности .