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

Управление программами


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

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

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

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

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

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

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



В операционной системе MS DOS ряд функций по управлению запуском программ связан с ее конструктивными особенностями. В этой ОС существует ограничение на общий объем используемого адресного пространства оперативной памяти (640Кб). В поздних версиях можно использовать дополнительную память (адреса от  640Кб до 1Мб). Специальные утилиты DOS позволяют разместить в этой дополнительной памяти служебные программы DOS и драйверы устройств и использовать их правильно. Прикладные программы размещаются в основной памяти (адреса до 640Кб).

При этом MS DOS не поддерживает мультизадачный режим и фактически в каждый момент времени в памяти размещена только одна прикладная программа. Для одновременного нахождения в памяти служебных программ (такие программы называются резидентными) придуман специальный механизм. Эти программы размещаются  несколько отступая от начала основной памяти, а адреса входа в эти программы располагаются в специальном векторе прерываний, который, в свою очередь, расположен в самом начале основной памяти (начиная с нулевого адреса). Чтобы вызвать такую резидентную программу, надо выполнить программное прерывание с номером, соответствующим номеру программы в векторе прерываний. Для того, чтобы защитить пространство, занятое резидентными программами, в ОС имеется специальный параметр, указывающий размер начала основной памяти, занятый резидентными программами.

Резидентной при необходимости можно сделать и пользовательскую программу, надо только помнить, что резидентные программы отнимают память у других программ.

Операционная система Windows использует такой механизм управления оперативной памятью, который позволяет отказаться от ограничений на ее объем. Windows различает виртуальную и реальную оперативную память. Размер виртуальной памяти 4 Гб. Всем работающим под Windows программам предоставляется пространство в виртуальной памяти. В реальной памяти отображается только часть виртуальной памяти, остальная ее часть хранится на диске.  Динамические таблицы содержат соответствие между блоками (страницами) виртуальной памяти и их размещением (адресами в реальной памяти или на диске).Если необходимо выполнить ту страницу программы, которая в настоящий момент находится на диске, то эта страница загружается в реальную оперативную память на какое-либо неиспользуемое в настоящий момент место. Предварительно затираемая страница реальной памяти сохраняется на диске. Эта процедура сохранения и чтения страниц называется своппингом (от англ swapping).


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