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