Совместное использование




Управление памятью

Функции ОС по управлению памятью

Перемещение

Защита

Совместное использование

Логическая организация

Физическая организация

Типы адресов

Управление памятью

Функции ОС по управлению памятью

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

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

Функциями ОС по управлению памятью в мультипрограммной системе являются:

· Отслеживание свободной и занятой памяти;

· Выделение памяти процессам и освобождение памяти по завершении процессов;

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

· Настройка адресов программы на конкретную область физической памяти.

Помимо первоначального выделения памяти процессам при их создании ОС должна также заниматься динамическим распределением памяти, то есть выполнить запросы приложений на выделение им дополнительной памяти во время выполнения. После того, как приложения перестают нуждаться в дополнительной памяти, оно может возвратить её системе.

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

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

Перемещение

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

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

Защита

Защита памяти реализуется ОС в тесном взаимодействии с аппаратными средствами.

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

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

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

Совместное использование

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

Логическая организация

Фактически всегда основная память в компьютерной системе организована как линейное (одномерное) адресное пространство, состоящее из последовательности байтов или слов. Анало­гично организована и вторичная память на своем физически уровне. Хотя такая организация и отражает особенности используемого аппаратного обеспечения, она не соответствует способу, которым обычно создаются программы. Большинство программ организованы в виде модулей, некоторые из которых неизменны (только для чтения, только для исполнения), а другие содержат данные, которые могут быть изменены. Если операционная сис­тема и аппаратное обеспечение компьютера могут эффективно работать с пользовательскими программами и данными, представленными модулями, то это обеспечивает ряд преимуществ:

Модули могут быть созданы и скомпилированы независимо друг от друга, при этом все ссылки из одного модуля во второй разрешаются системой во время работы программы.

Равные модули могут получить разные степени защиты (только для чтения, только для исполнения) за счет весьма умеренных накладных расходов.

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

Физическая организация

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

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

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

2. В многозадачной среде программист при разработке программы не знает, какой объем памяти будет доступен программе, и где эта память будет располагаться.

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

Типы адресов

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

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

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

 

Рис. 1. Память и отображения

 

Для идентификации переменных и команд на разных этапах жизненного цикла программы используются разные имена (рисунок 2):

1. Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.

2. Виртуальные адреса вырабатываются при переводе программы на машинный язык и получении исполнимого модуля.

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

Переход от виртуальных адресов к физическим может осуществляться двумя способами.

В первом случае замену виртуальных адресов на физические делает специальная системная программа «перемещающий загрузчик» при загрузке задачи в ОП.

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

 

  Символьные адреса Идентификация переменных в программе на алгоритмическом языке
транслятор
  Виртуальные адреса Условные адреса, вырабатываемые транслятором
1) перемещающий загрузчик – статическое преобразование 2) динамическое преобразование аппаратными средствами
  Физические адреса Номера ячеек физической памяти

 

Рис. 2.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-12-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: