2011. Машбук (1114722), страница 18
Текст из файла (страница 18)
После того, как исходный текст программыпопадает на вход компилятору, образуется объектный модуль. А уже из пользовательскихмодулей и библиотечных формируется исполняемый код, т.е. тот модуль, который можнозагрузить в оперативную память и начать его исполнять, причем момент созданияисполняемого модуля и момент запуска его на исполнение разнесены во времени.Возникает проблема привязки исполняемого модуля к тому адресному пространству, вкотором он будет исполняться (Рис. 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. Т.е.
окна организованы таким способом, что последнийрегистр предыдущего окна отображается на тот же физический регистр, что и нулевойрегистр следующего окна.При обращении из текущей программы в другую программу автоматическипроисходит смена окна, т.е. текущей программе становится доступно другое окно,состоящее тоже из L регистров. Структура регистрового окна представима в видеследующей последовательности регистров (Рис. 50).
Первая группа регистров – регистрыформальных параметров (включая адреса возврата), вторая – регистры локальныхпараметров, третья – регистры фактических параметров. Каждый из регистров окнаотображается на один из регистров базового регистрового файла. Далее, следующеерегистровое окно, которое получит программа при обращении к подпрограмме, имеетпересечение с текущим окном, через начало и конец регистрового окна. Это означает, чтоесли в текущей программе мы загрузили значения на регистры, через которые будемпередавать фактические параметры, то при обращении к подпрограмме она в своём новом61окне получит фактические параметры через соответствующие формальные параметры.При этом локальные регистры текущей подпрограммы сохранять не нужно.Итак, весь имеющийся регистровый файл, состоящий из K физических регистров,разбит на N окон, в каждом из которых регистры имеют номера от 0 до L–1.Соответственно, в системе организована логика таким способом, что все окнарасположены в циклическом списке: нулевое окно пересекается с первым, первое — совторым, и так далее, вплоть до N–1-ого окна, которое пересекается снова с нулевым.Также в системе имеется команда смены окна.
Соответственно, при обращении кподпрограмме через пересекающиеся точки передаются адреса возвратов, а внутри окнаможно работать с регистрами, причем при обращении к подпрограмме не встаетнеобходимость их сохранения.Имеются два управляющих регистра: указатель текущего окна (CWP) и указательсохранённого окна (SWP).
Суть заключается в том, что количество регистровых оконограничено. И если глубина вложенности больше, чем количество регистровых окон, товозникает проблема. В этом случае какое-то окно необходимо сохранить в ОП или стеке,чтобы потом его использовать. При этом эффективность, естественно, начнёт падать.Считается, что наиболее оптимальный эффект оптимизации достигается при четырехокнах – это означает, что средний уровень вложенности подпрограмм не более четырех.Недостатком такого решения является фиксированный размер каждого окна, что напрактике часто оказывается неоптимальным (т.к.
иногда требуется больше регистров,иногда — меньше).Ниже на Рис. 51 приведены простейшая последовательность действий при входе ивыходе из подпрограмм. Простой пример работы с двумя регистровыми окнамипредставлен на Рис. 52.62000Окно 0Окно 1L–1…L–10Окно N–1Окно 0L–1Окно 1…Окно N–10K–1МножествофизическихрегистровL–1Виртуальные регистрыРис. 49. Регистровые окна.Рис.
50. Структура регистрового окна.63CWP — указательтекущего окна (currentwindow pointer)SWP — указательсохраненного окна(saved window pointer)ннететдаРис. 51. Регистровые окна. Вход и выход из подпрограммы.Рис. 52. Пример работы с регистровыми окнами.Модель организации регистровой памяти в Intel Itanium (Рис. 53). Рассмотримболее эффективную модель работы с регистровыми окнами.
В современных компьютерахимеется возможность варьирования размера регистрового окна. В частности, в 64разрядных процессорах Itanium компании Intel размер окна динамический. В данномпроцессоре в регистровом файле, состоящем из 128 регистров, первые 32 регистра (сномерами от 0 до 31) являются общими, а на регистрах с номерами от 32 по 127организуются регистровые окна, причем окно может быть произвольного размера(например, от регистра GR до регистра с номером 32+N, где N=0..95).
Такая организацияпозволяет оптимизировать работу с точки зрения входов-выходов из функций и заменыфункциональных контекстов.64Рис. 53. Модель организации регистровой памяти в Intel Itanium.1.2.6.4 Способы решения проблем мультипрограммного режима: системныйстекБудем рассматривать системы, в которых имеется аппаратная поддержка стека.