Организация и функционирование компьютеров
bf1271d8

Машинная программа


Машинная программа, как уже говорилось, представляет собой последовательность машинных команд. Эти машинные команды последовательно записываются в оперативной памяти компьютера, начиная с определенного адреса. Для того чтобы компьютер начал выполнять программу, необходимо указать этот адрес. После этого машинные команды начинают поочередно переписываться в командный регистр процессора и выполняться. При выполнении команд безусловного и условного перехода порядок выполнения команд будет меняться. Когда выполнение программы дойдет до специальной команды конца программы, программа закончит свою работу.

На первом этапе развития вычислительной техники на компьютере могла работать только одна программа, которая всегда размещалась в памяти, начиная с нулевого адреса. Поэтому адреса, используемые в командах программы, всегда были одни и те же. Программисты составляли программы сразу на машинном языке, используя цифровую запись команд. Этот процесс был очень трудоемок, а програм­ма, написанная на машинном языке, имела ряд недостатков. Во-первых, исто­рически сложилось так, что в мире существует очень много типов компьюте­ров и, соответственно, много вариантов машинных языков. В результате программа на машинном языке годится только для своего компьютера. Во-вторых, программу на машинном  языке трудно читать даже профессионалу. В-третьих, в такой программе очень трудно находить ошибки и описки. Если объем программы превышает критический, программу практически невоз­можно полностью отладить. В-четвертых, даже если программа доведена до уровня, при котором она полностью отвечает поставленной задаче, малей­шие изменения в целях программы могут вызвать трудно преодолимые трудности в модификации программы.

Увеличение мощности компьютеров в сочетании с их дороговизной имело много следствий. Во-первых, системой стала работа на компьютере нескольких пользователей одновременно. Соответственно в оперативной памяти стали размещаться несколько программ, и поэтому начальный адрес программы может меняться от запуска к запуску.
При этом сбиваются рабочие адреса данных в памяти в командах программы. С этой проблемой оказалось справиться несложно. Для вычисления адреса теперь используются две характеристики: базовый начальный адрес размещения программы в памяти, который меняется от запуска к запуску, и смещение адреса относительно начала программы, которое в готовой программе неизменно. Адресный регистр процессора состоит из двух частей: одна содержит базовый адрес, другая смещение относительно начала программы. Из машинных команд извлекаются только смещения. Для конструирования фактического адреса, который и посылается по адресной шине, значение регистра базового адреса складывается со значением регистра смещения адреса. Регистр базового адреса заполняется в момент размещения программы в памяти и затем в процессе выполнения программы не меняется. Изменяется только адресный регистр смещения.

Вторым следствием увеличения мощности компьютера стало увеличение объема программ. Эта, а также некоторые другие причины, привели к усложнению структуры программы, то есть  разбиение их на более простые блоки с указанием логики использования этих блоков. Это привело к появлению концепции подпрограммы. Подпрограммой принято называть законченную программу, которая выполняет не самостоятельную, а служебную функцию. Эта функция обычно носит стандартный, повторяющийся характер и может использоваться не в одной, а во многих программах. С точки зрения использующих ее программ от подпрограммы требуется правильное выполнение возложенной на нее функции, а ее внутреннее строение роли не играет. Наличие определенной подпрограммы позволяет программисту в определенных случаях вместо самостоятельного программирования какой-то части программы просто обратиться к услугам специально созданной для этого подпрограммы, пусть даже она создана другим программистом.

Концепция подпрограмм привела к появлению и распространению библиотек подпрограмм, что привело к колоссальному увеличению производительности труда программиста.


Одновременно прогресс в технологии сохранения данных на внешних носителях привел к необходимости создания специальных служебных подпрограмм, которые бы обеспечивали эффективную работу с этими внешними устройствами. В результате появились целые комплексы служебных подпрограмм, называемых операционными системами, которые предназначены освободить программистов от программирования стандартных, рутинных операций. Это привело к настоящей революции в принципах работы компьютера. Современные компьютеры даже не начнут работать, если в них нет операционной системы.

В каждом работающем современном компьютере одновременно сосуществует множество программ, которые образуют несколько слоев, или уровней. На самом высшем уровне расположена одна программа, которая называется ядром операционной системы (другое ее название – диспетчер операционной системы). В некотором смысле она является единственной настоящей программой в компьютере. Ядро запускает в качестве своих подпрограмм программы, обеспечивающие различные режимы операционной системы. Те, в свою очередь, в качестве подпрограмм запускают служебные программы операционной системы – утилиты. Если пользователь компьютера хочет выполнить какую-то пользовательскую программу, то она также запускается как подпрограмма ядра операционной системы.

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




Процессор использует окружение текущей программы. Если одна программа хочет для выполнения какого-то действия обратиться к подпрограмме (говорят – вызвать подпрограмму), то это происходит следующим образом:

¨ текущая программа застывает на очередной команде и переходит в пассивное состояние;

¨     окружение текущей программы, включая значения всех регистров процессора, временно сохраняются где-нибудь в памяти;

¨     в оперативной памяти отыскивается незанятый участок, достаточный для размещения подпрограммы, и она переписывается на этот участок;

¨     создается окружение подпрограммы, оно становится текущим для процессора, заполняются необходимыми данными регистры процессора;

¨     управление передается подпрограмме, для чего в адресный регистр просто записывается адрес первой команды программы (точнее, его смещение; базовый адрес заполняется на предыдущем этапе);

¨     когда подпрограмма заканчивает свою работу, восстанавливается окружение и значения регистров программы, вызвавшей данную подпрограмму;

¨     место подпрограммы в оперативной памяти освобождается, то есть считается впредь незанятым;

¨     программа продолжает работать с той команды, на которой она остановилась.

Все эти действия, весьма нетривиальные, выполняет операционная система. Это одна из ее функций, которая называется управлением выполнением программ. Если подпрограмма, в свою очередь, вызовет третью программу, то мы будем иметь две программы, застывших в состоянии вызова, и два сохраненных окружения программ. На самом деле такая цепочка вызовов может быть достаточно длинной.

Когда программа вызывает некоторую подпрограмму, может потребоваться передать подпрограмме некоторую информацию, а затем получить обратно данные, образующие результат работы подпрограммы. Эти данные называются параметрами (соответственно входными и выходными).


Передача параметров производится операционной системой тогда же, когда происходит передача управления подпрограмме и обратно. Каждая программа дополняется стандартными блоками в начале и конце подпрограммы, которые должны выполнять необходимые действия перед началом и после окончания работы программы. В частности, в них выделяется специальное место для параметров (то есть буфер для обмена данными между программой и подпрограммой). Также вставляется в вызывающую программу стандартный блок, выполняющий все операции по обращению к подпрограмме, включая передачу и получение данных в буфере обмена в подпрограмме.

Важным элементом управления процесса вычисления в компьютере являются прерывания. Прерывание является средством обеспечения независимой параллельной работы различных устройств компьютера. С этой целью всегда, когда необходимо выполнить некоторую независимую операцию (например, ввод с клавиатуры), соответствующее устройство посылает процессору прерывание. По этому прерыванию процессор должен приостановить нормальный ход выполнения текущей программы и произвести некоторые промежуточные вспомогательные действия. Прерывание также возникает в случае появления ошибочных вычислений (например, в случае деления на ноль) или в случае сбоев при взаимодействии с устройствами компьютера. Во всех этих случаях процессор вместо выполнения очередной команды текущей программы начинает выполнять программу обработки прерывания, соответствующую номеру полученного прерывания (естественно, что все такие программы должны быть заложены предварительно в память компьютера).  После обработки прерывания процессор возвращается к выполнению текущей команды (если другое действие не предусмотрено программой обработки прерывания).

Прежде, чем выполнить очередную команду, процессор проверяет, не поступило ли какое-то прерывание. Если поступило, то сначала запрашивается подтверждение прерывания, после чего определяется тип прерывания. Затем процессор приступает к выполнению программы обработки поступившего прерывания.


Эта программа прежде всего запоминает состояние регистров процессора и некоторых других параметров текущей программы, а затем выполняет действия, специфицированные прерыванием. В заключение программа обработки прерывания востанавливает состояние регистров процессора

Прерывание работы процессора по запросу внешних устройств устраняет необходимость выполнения им неэффективных операций по проверке готовности внешних устройств к обмену данными и снижает затраты времени на ожидание готовности периферийного устройства   к обмену. Прерывания необходимы при обмене данными с большим числом асинхронно работающих внешних устройств. Запросы на прерывание бывают немаскируемыми и маскируемыми. Немаскируемые запросы реализуются аппаратно и поступают в процессор по специально выделенным для этого линиям шины управления. Немаскируемые запросы обладают наивысшим приоритетом. К ним относятся запросы от схем питания и аппаратуры контроля правильности передачи данных. Снижение уровня питания представляет опасность потери информации в ОЗУ. Наиболее надежные серверы для хранения информации содержат емкостные фильтры, которые при отключении электричества поддерживают уровень питания на время, достаточное для сохранения данных из ОЗУ. Схемы контроля питания подают запрос прерывания и совершают переход к подпрограмме аварийной перезаписи во внешнее ЗУ.

Маскируемые запросы поступают от внешних устройств и означают запросы на внеочередное выполнение каких-либо штатных действий, например, операций ввода-вывода. В блоке управления процессора есть разряд, содержащий флаг разрешения прерывания. Специальная машинная команда устанавливает этот флаг в такое состояние, которое запрещает прерывание. Другая команда разрешает прерывания. Момент появления запроса на прерывание не связан с выполнением основной программы. Процессор продолжает выполнять текущую команду основной программы. Он должен запомнить результат выполнения этой команды и номер команды возврата и приступить к выполнению прерывающей программы, и с этой целью в специальный стек записывается результат выполнения команды основной программы и номер команды возврата.



Размещение программ, подпрограмм  и данных может быть статическим и динамическим. При статическом размещении оно происходит в момент запуска программы и сохраняется на все время работы программы. При динамическом размещении память подпрограмме выделяется в момент обращения к ней, и освобождается после окончания работы подпрограммы. Выделение и освобождение памяти – это еще одна функция операционной системы, которая называется управлением памятью. Память для данных выделяется и освобождается по специальным командам, адресованным операционной системе. Фактически это обращение к специальным подпрограммам операционной системы.

При наличии определенной операционной системы на компьютере работает одна программа – ядро этой операционной системы. Все прочие программы, в том числе и пользовательские, являются ее подпрограммами. Ядро операционной системы решает, какую программу запустить, как разместить программы и данные и т.д. Однако в конечном итоге ядро операционной системы управляется пользователем с помощью команд (как в MS DOS)  или различных манипуляций с мышью и клавиатурой (как в Windows).

Операционная система Windows ориентирована на мультизадачный режим выполнения программ. Программы, предназначенные для работы под управлением Windows, могут обмениваться сообщениями с ядром операционной системы и друг с другом. Считается, что основное состояние каждой программы – состояние ожидания. В этом состоянии программа находится до тех пор, пока к ней не придет сообщение с указанием выполнить то или иное действие. Это сообщение присылается от операционной системы или от другой программы. После выполнения требуемого действия программа снова оказывается в состоянии ожидания. Еще раз подчеркнем, что все это только модель описания работы компьютера. Например, тот факт, что программа находится в состоянии ожидания, означает, что память, выделенная ей, не освобождается, а все необходимые сведения о программе хранятся в соответствующей таблице операционной системы.

Контрольные вопросы по теме.

1. Какие функции выполняет оперативная память?

2. Что такое адрес оперативной памяти?

3. Какие функции выполняет процессор?

4. Какую роль в компьютере выполняют порты ввода-вывода?

5. Для чего нужна шина адреса?

6. Как процессор выполняет машинную команду?

7. Как процессор узнает очередность выполнения команд?

8. Каковы причины разбиения программ на подпрограммы?

9. Для чего нужны прерывания?

10.    Что такое мультизадачность?

11.    Что означает функция управления памятью?


Содержание раздела