Пользовательские программы могут в качестве подпрограмм запускать другие подпрограммы, которые будут образовывать более низкий слой, и т.д. Однако использование подпрограмм приводит к некоторым проблемам непосредственно на машинном уровне. Дело в том, что современная технология работы процессора подразумевает, что для правильного функционирования каждой работающей программы кроме самой программы, расположенной где-то в оперативной памяти, необходимо задать некоторое окружение программы. Сама программа не меняется от запуска к запуску, а меняется ее окружение. В качестве примера можно привести базовый начальный адрес текущего размещения программы в памяти. (На самом деле программы состоят из трех сегментов: собственно программы (программного кода), сегмента данных и служебного сегмента, называемого стеком; поэтому окружение программы содержит три базовых адреса.). Процессор использует окружение текущей программы. Если одна программа хочет для выполнения какого-то действия обратиться к подпрограмме (говорят – вызвать подпрограмму), то это происходит следующим образом:
• текущая программа застывает на очередной команде и переходит в пассивное состояние;
• окружение текущей программы, включая значения всех регистров процессора, временно сохраняются где-нибудь в памяти;
• в оперативной памяти отыскивается незанятый участок, достаточный для размещения подпрограммы, и она переписывается на этот участок;
• создается окружение подпрограммы, оно становится текущим для процессора, заполняются необходимыми данными регистры процессора;
• управление передается подпрограмме, для чего в адресный регистр просто записывается адрес первой команды программы (точнее, его смещение; базовый адрес заполняется на предыдущем этапе);
• когда подпрограмма заканчивает свою работу, восстанавливается окружение и значения регистров программы, вызвавшей данную подпрограмму;
• место подпрограммы в оперативной памяти освобождается, то есть считается впредь незанятым;
• программа продолжает работать с той команды, на которой она остановилась.
Все эти действия, весьма нетривиальные, выполняет операционная система. Это одна из ее функций, которая называется управлением выполнением программ. Если подпрограмма, в свою очередь, вызовет третью программу, то мы будем иметь две программы, застывших в состоянии вызова, и два сохраненных окружения программ. На самом деле такая цепочка вызовов может быть достаточно длинной.
Когда программа вызывает некоторую подпрограмму, может потребоваться передать подпрограмме некоторую информацию, а затем получить обратно данные, образующие результат работы подпрограммы. Эти данные называются параметрами (соответственно входными и выходными). Передача параметров производится операционной системой тогда же, когда происходит передача управления подпрограмме и обратно. Каждая программа дополняется стандартными блоками в начале и конце подпрограммы, которые должны выполнять необходимые действия перед началом и после окончания работы программы. В частности, в них выделяется специальное место для параметров (то есть буфер для обмена данными между программой и подпрограммой). Также вставляется в вызывающую программу стандартный блок, выполняющий все операции по обращению к подпрограмме, включая передачу и получение данных в буфере обмена в подпрограмме.
Важным элементом управления процесса вычисления в компьютере являются прерывания. Прерывание является средством обеспечения независимой параллельной работы различных устройств компьютера. С этой целью всегда, когда необходимо выполнить некоторую независимую операцию (например, ввод с клавиатуры), соответствующее устройство посылает процессору прерывание. По этому прерыванию процессор должен приостановить нормальный ход выполнения текущей программы и произвести некоторые промежуточные вспомогательные действия. Прерывание также возникает в случае появления ошибочных вычислений (например, в случае деления на ноль) или в случае сбоев при взаимодействии с устройствами компьютера. Во всех этих случаях процессор вместо выполнения очередной команды текущей программы начинает выполнять программу обработки прерывания, соответствующую номеру полученного прерывания (естественно, что все такие программы должны быть заложены предварительно в память компьютера). После обработки прерывания процессор возвращается к выполнению текущей команды (если другое действие не предусмотрено программой обработки прерывания).
8th Май 2011
|
Теги:
|