Модель процесса
В этой модели все выполняемое на компьютере программное обеспечение, иногда включая операционную систему, сведено к ряду последовательных процессов, или, для краткости, просто процессов. Процесс — это просто экземпляр выполняемой программы, включая текущие значения счетчика команд, регистров и переменных.
Концептуально у каждого процесса есть свой, виртуальный, центральный процессор. Разумеется, на самом деле настоящий центральный процессор постоянно переключается между процессами, но чтобы понять систему, куда проще думать о наборе процессов, запущенных в (псевдо) параллельном режиме, чем пытаться отслеживать, как центральный процессор переключается между программами. Это постоянное переключение между процессами называется мультипрограммированием, или многозадачным режимом работы.
На рис. 1,а показан компьютер, работающий в многозадачном режиме и имеющий в памяти четыре программы. На рис. 1,б показаны четыре процесса, каждый со своим собственным алгоритмом управления (то есть со своим собственным логическим счетчиком команд), и каждый из этих процессов работает независимо от всех остальных. Понятно, что на самом деле имеется только один физический счетчик команд, поэтому при запуске каждого процесса его логический счетчик команд загружается в реальный счетчик. Когда работа с процессом будет на некоторое время прекращена, значение физического счетчика команд сохраняется в логическом счетчике команд, размещаемом процессом в памяти. На рис. 1,в показано, что за достаточно длительный период наблюдения продвинулись вперед все процессы, но в каждый отдельно взятый момент времени реально работает только один процесс.
Рис. 1. Четыре программы, работающие в многозадачном режиме (а). Концептуальная модель четырех независимых друг от друга последовательных процессов (б). В отдельно взятыймомент времени активна только одна программа (в)
Будем исходить из того, что в нашем распоряжении имеется лишь один центральный процессор. Хотя все чаще такие предположения противоречат истине, поскольку новые кристаллы зачастую являются многоядерными, имеющими два, четыре и более ЦП.
Поскольку центральный процессор переключается между процессами, скорость, с которой процесс выполняет свои вычисления, не будет одинаковой и, скорее всего, не сможет быть вновь показана, если тот же процесс будет запущен еще раз. Поэтому процессы не должны программироваться с использованием каких-либо жестко заданных предположений относительно времени их выполнения.
Рассмотрим, к примеру, процесс ввода-вывода, запускающий ленту стримера для восстановления файлов из ранее сделанных резервных копий. Стример выполняет холостой цикл 10 000 раз, чтобы лентопротяжный механизм набрал скорость, а затем выдает команду на чтение первой записи. Если центральный процессор решит переключиться на другой процесс во время холостого цикла, может случиться так, что процесс работы с лентой возобновится только тогда, когда первая запись уже минует считывающую головку. Когда у процесса есть подобные критичные для его работы требования, касающиеся реального масштаба времени, то через определенное количество миллисекунд должны происходить конкретные события, и для того, чтобы они произошли, должны быть предприняты специальные меры. Но, как правило, на большинство процессов не влияют ни установленный режим многозадачности центрального процессора, ни относительные скорости выполнения различных процессов.
Разница между процессом и программой довольно тонкая, но существенная. Представим себе программиста, решившего заняться кулинарией и испечь пирог на день рождения дочери.
У него есть рецепт пирога, а на кухне есть все ингредиенты: мука, яйца, сахар, ванильный экстракт и т. д. В данной аналогии рецепт — это программа (то есть алгоритм, выраженный в некой удобной форме записи), программист — это процессор (ЦП), а ингредиенты пирога — это входные данные. Процесс — это действия, состоящие из чтения рецепта нашим кулинаром, выбора ингредиентов и выпечки пирога.
Теперь представим, что на кухню вбегает сын программиста и кричит, что его ужалила пчела. Программист запоминает, на каком месте рецепта он остановился (сохраняется состояние текущего процесса), достает книгу советов по оказанию первой помощи и приступает к выполнению изложенных в ней инструкций. Перед нами процессор, переключенный с одного процесса (выпечки) на другой процесс, имеющий более высокую степень приоритета (оказание медицинской помощи), и у каждого из процессов есть своя программа (рецепт против справочника по оказанию первой помощи). После извлечения пчелиного жала программист возвращается к своему пирогу, продолжая свои действия с того места, на котором остановился.
Ключевая идея здесь в том, что процесс — это своего рода действия. У него есть программа, входные, выходные данные и состояние. Один процессор может совместно использоваться несколькими процессами в соответствии с неким алгоритмом планирования, который используется для определения, когда остановить один процесс и обслужить другой.
Стоит отметить, что если программа запущена дважды, то считается, что ею заняты два процесса. Например, зачастую возможно дважды запустить текстовый процессор или одновременно распечатать два файла, если одновременно доступны два принтера. Тот факт, что два работающих процесса запущены от одной и той же программы, во внимание не принимается, поскольку это два разных процесса.
Операционная система может позволить им использовать общий код, поэтому в памяти будет присутствовать только одна копия этого кода, но это чисто техническая деталь, не меняющая концептуальную ситуацию, касающуюся двух работающих процессов.
