Операционные системы 2011 (1114689), страница 18
Текст из файла (страница 18)
Решение данной проблемы может бытьдовольно простым: необходима функция управления временем. Это означает, чтооперационная система должна контролировать время использования центральногопроцессора программами пользователей. Для этих целей компьютеру требуетсяпрерывание по таймеру. Резюмируя, можно сказать, что для реализациимультипрограммного режима необходимо наличие аппарата прерываний, и этот аппарат,как минимум, должен включать в себя аппарат прерывания по таймеру. В этом случаезацикленная программа автоматически будет периодически прерываться, управлениепериодически будет передаваться операционной системе (ОС может, например, считатьвремя, которое текущий процесс использовал за последний сеанс работы с ЦП). Это даствозможность операционной системе принять решение – поставить на счет другуюпрограмму либо снять со счета (например, по команде пользователя) эту зависшуюпрограмму.
Существуют две стратегии работы со временем. Первая стратегия (котораяиспользуется в Windows, в «ширпотребовской» Unix) состоит в том, что любой процессберёт время ЦП до тех пор, пока его не убьют. Тем не менее, при этой стратегиизацикленная программа не будет никому мешать, т.к. ОС будет периодически получатьуправление и переключать процессы. Другая стратегия (которая обычно применяется длявысокопроизводительных машин) основывается на том, что процесс предварительнооговаривает, сколько времени ему может потребоваться. Если процесс пытаетсяпревысить это время, то ОС считает, что процесс зациклился.Задание для размышления – попробовать смоделировать корректнуюмультипрограммную систему, которая будет работать, имея аппарат защиты памяти,специальный режим и только прерывание по таймеру.
Например, вместо того, чтобыиметь прерывание по завершению обмена, можно периодически (по таймеру) простосчитывать какие-то регистры и их анализировать.Итак, требуются три аппаратных средства компьютера, необходимых дляподдержки мультипрограммного режима: аппарат защиты памяти, специальные режимыисполнения команд и аппарат прерываний, состоящий, как минимум, из аппаратапрерывания по таймеру.
Отметим, что специальных режимов может быть больше двух:т.е. часть команд доступна всем программам, часть команд могут выполняться лишь взащищенном режиме, еще часть — в более защищенном режиме, и т.д.Может возникнуть резонный вопрос, как происходит включение режимасупервизора. Ответ здесь будет зависеть от архитектуры конкретной системы.
Например,в некоторых архитектурах считается, что операционная система занимает некотороепредопределенное адресное пространство физической памяти. И если управлениепопадает на эту область, то включается режим операционной системы. А вот выключениережима операционной системы может происходить программно: например, операционнаясистема, запуская процесс, может предварительно программным способом установить егов непривилегированный режим.581.2.6.2 Проблемы, возникающие при исполнении программРассмотрим круг проблем, которые, так или иначе, возникают при исполнениипрограмм. Эти проблемы приводят к снижению эффективности системы.Вложенные обращения к подпрограммам (Рис.
45). Несколько лет назадпроводились исследования, которые анализировали распределение времени исполненияпрограммы на разных компонентах программного кода, и выяснилось, что в системах,рассчитанных не только (и не столько) на выполнение математических вычислений(например, в системах обработки текстовой информации), порядка 70% времени тратитсяна обработку входов и выходов из подпрограмм. Это объясняется тем, что при обращениик подпрограмме необходимо зафиксировать адрес возврата, сформировать параметры,передаваемые вызываемой подпрограмме, как-то сохранить регистровый контекст (т.е.сохранить содержимое тех регистров, которые использовались в программе на данномтекущем уровне).g:.........CALL f(x).........Сохранение/восстановлениерегистров, используемых вподпрограмме g.Рис.
45. Вложенные обращения к подпрограммам.Накладные расходы при смене обрабатываемой программы. Это аналогичнаяпроблема, связанная со сменой обрабатываемых программ (или процессов): операционнаясистема должна сохранить контексты процессов. К этому необходимо добавить, что всовременных компьютерах количество одновременно обрабатываемых процессов оченьвелико, что лишь увеличивает объем возникающих накладных расходов.Перемещаемость программы по ОЗУ.
Рассмотрим процесс полученияисполняемого кода программы (Рис. 46). После того, как исходный текст программыпопадает на вход компилятору, образуется объектный модуль. А уже из пользовательскихмодулей и библиотечных формируется исполняемый код, т.е. тот модуль, который можнозагрузить в оперативную память и начать его исполнять, причем момент созданияисполняемого модуля и момент запуска его на исполнение разнесены во времени.Возникает проблема привязки исполняемого модуля к тому адресному пространству, вкотором он будет исполняться (Рис. 47).
Исторически первые исполняемые модулинастраивались на те адреса оперативной памяти, в рамках которых эти исполняемыемодули должны были исполняться. Это означает, что если память в данный момент занятадругой программой, то эту программу поставить на счет не удастся (пока память неосвободится). И, соответственно, возникает проблема перемещаемости программы поОЗУ: ресурс свободной памяти в ОЗУ может быть достаточно большим, чтобы в нейразместилась вновь запускаемая программа, но в силу привязки каждой программы кконкретным адресам ОЗУ эту программу запустить не удается.59Рис. 46. Процесс получения исполняемого модуля программы.Рис.
47. Перемещаемость программы по ОЗУ.Фрагментация памяти. Положим, что предыдущая проблема, связанная сперемещаемостью программы, решена в нашей системе: любой исполняемый модульможет быть загружен в произвольное место ОЗУ для дальнейшего выполнения, нопрограмма загружается в непрерывный фрагмент памяти. В этом случае возникает инаяпроблема.Пусть наша система функционирует в мультипрограммном режиме. И в началеработы были загружены в ОП и запущены на исполнение Программа 1, Программа 2 ит.д., вплоть до некоторого номера K. Со временем некоторые задачи завершаются, а,соответственно, место, занимаемое ими в ОЗУ, высвобождается. Операционная системаспособна оценивать свободное пространство оперативной памяти и из буфера программ,готовых к исполнению, выбрать ту программу, которая может поместиться в свободныйфрагмент памяти.
Но зачастую размер загружаемой программы несколько меньше тогофрагмента, который был свободен. И постепенно проявляется т.н. проблемафрагментации оперативной памяти (Рис. 48). В некоторый момент может оказаться,что в ОЗУ находится несколько процессов, между которыми имеются фрагментысвободной памяти, каждый из которых (по отдельности) не достаточен для того, чтобызагрузить какую-либо готовую к исполнению программу. При этом количество подобныхфрагментов может быть настолько большим, что суммарно свободное пространство ОЗУпозволило бы разместить в нем хотя бы один готовый к исполнению процесс. Такимобразом, система начинает деградировать: имея ресурс свободной памяти, мы не можемего использовать, а это означает, что система используется в усеченном качестве.60Буфер программ,ожидающих началаобработкиОСПрограмма N1V1своб.1Программа N2V1прог.Программа 2V2прог.V2своб.2Проблема фрагментации:Viпрог.
> Vjсвоб., i, j,несмотря на то, что i:n……Программа KKПрограмма 1V jсв об.Vi прог.j 1деградация системыVKсвоб.Программа LVLпрог.Рис. 48. Фрагментация памяти.После того, как мы указали основные проблемы, возникающие при исполнениипрограмм, рассмотрим, какие аппаратные средства применяются для разрешения этихпроблем.1.2.6.3 Способы решения проблем мультипрограммного режима: регистровыеокнаОдно из более или менее новых решений, предназначенное для минимизациинакладных расходов, связанных с обращениями к подпрограммам, основано наиспользовании в современных процессорах т.н.
регистровых окон (register windows). Эторешение нацелено на решение проблем сохранения/ восстановления регистров. Суть этогорешения заключается в следующем (Рис. 49). В процессоре имеется некоторое количествоK физических регистров общего назначения, предназначенных для использования впользовательских программах. Эти регистры пронумерованы от 0 до K–1. В каждыймомент времени программе доступно т.н. регистровое окно, состоящее из L регистров(L<K). Соответственно, все K физических регистров разделяются на регистровые окнанекоторым способом.
Один из способов предполагает, что с нулевого физическогорегистра начинается нулевое физическое окно, причем в этом нулевом физическом окнепрограмме пользователя доступны физические регистры с номерами от 0 до L–1. Первоефизическое окно представляет собою очередные L регистров, которые внутри окна такжеимеют нумерацию от 0 до L–1, но в реальности им соответствуют физические регистры сномерами, начинающимися с L–1. Т.е. окна организованы таким способом, что последнийрегистр предыдущего окна отображается на тот же физический регистр, что и нулевойрегистр следующего окна.При обращении из текущей программы в другую программу автоматическипроисходит смена окна, т.е.