Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП / ОС лекции.doc
Скачиваний:
42
Добавлен:
24.02.2016
Размер:
875.52 Кб
Скачать

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

Виртуальная и реальная память

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

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

1. Удобство для программиста. Программист имеет в своем распоряжении виртуальную память, представляющую собой адресное пространство либо совершенно плоское - с адресами, линейно возрастающими от 0 до максимального значения, либо сегментированное в соответствии с потребностями задачи. При этом он не заботится о том, как будет размещен его процесс в реальной памяти.

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

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

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

Модели виртуальной памяти.

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

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

В некоторых современных системах на базе 32-разрядных процессоров (Windows 9х, Windows NT, OS/2) обеспечивается плоская модель, в которой виртуальное адресное пространство не сегментируется. Однако, методы такового обеспечения различны. Windows 9х просто отводит каждому процессу единственный сегмент размером 4Гбайт и, таким образом, сводит плоскую модель к страничной. Сама ОС располагается в верхней части этого адресного пространства и, таким образом, не гарантируется ее надежная защита. OS/2 выделяет процессу несколько сегментов, но обеспечивает прозрачный для процесса переход между сегментами. ОС также располагается в верхней части адресного пространства, но в отдельных сегментах, таким образом, ее защита надежнее. Windows NT также создает один сегмент, но верхняя часть адресного пространства содержит не саму ОС, а только переходники – обращения к защищенным процессам ОС, порча этой части адресного пространства не приведет к порче ОС.

Дальнейшее расширение разрядной сетки процессоров может привести к появлению совершенно новых моделей памяти. Уже сейчас одна из таких моделей – одноуровневая – реализована в вычислительной системе AS/400. 64-разрядное адресное слово позволяет процессу иметь плоскую виртуальную память размером до 64 Гэксабайт (!). В AS/400 эта возможность позволяет реализовать два принципиально важных свойства модели памяти:

  • в виртуальное адресное пространство процесса включается не только ОП, но вся память - и оперативная и внешняя - имеющаяся в системе;

  • все процессы работают в одном и том же виртуальном адресном пространстве, разделяя его, защита памяти обеспечивается дополнительными программно-аппаратными средствами;

Порождение программ и процессов

Компиляция, компоновка и загрузка

Этот этап реализуется не ОС, а системами программирования, основным функциональным назначением которых является генерация объектного кода программы (машинных команд). Основным компонентом системы программирования является компилятор. На вход компилятора поступает исходный модуль – текст программы на языке программирования. Выходом компилятора является объектный модуль – программа в машинных кодах, к которой, однако, еще не подключены внешние процедуры и функции. Компилятор предварительно формирует структуру виртуального адресного пространства: определяют состав сегментов и формируют содержимое (образы) кодовых сегментов и сегментов инициализированных статических данных. С целью получения наиболее эффективного объектного кода компиляторы могут выполнять оптимизацию обрабатываемой программы. Для программ, предназначенных к выполнению на RISC-процессорах, оптимизация является обязательной, так как позволяет эффективно загрузить конвейерные линии процессора.

Формирование единой программы из нескольких объектных модулей называется компоновкой. Обеспечение обращений к внешним по отношению к модулю именам называется связыванием. Операции компоновки и связывания выполняются специальными программами - компоновщиками (редакторами связей) или связывающими загрузчиками. Операцию связывания можно выполнять на разных этапах:

  • статическое связывание этапа подготовки - выполняется компоновщиком, вызываемые модули включаются в загрузочный модуль программы;

  • статическое связывание этапа загрузки - выполняется связывающим загрузчиком, вызываемые модули подключаются к программе уже в ОП;

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

  • динамическое связывание этапа выполнения - загрузка модулей и установка связей происходит при выполнении программы и управляет ими сама программа.

Современные ОС (Windows 9х, OS/2 и т.д.) позволяют сочетать статическую компоновку и связывание с динамической. Модули, подключаемые к программам динамически, носят название библиотек динамической компоновки (dynamic link library), соответственно, файлы, содержащие образы таких модулей имеют расширения DLL. DLL широко используются для системного программного обеспечения. API ОС, средства работы с терминалом, графические средства и т.п. представляют собой библиотеки динамической компоновки, совместно используемые всеми программами. При загрузке любой программы эти модули, как правило, уже находятся в памяти.

Цикл жизни процесса

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

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

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

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

Монопольно используемые ресурсы

Свойства ресурсов и их представление

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

Ресурсы могут быть монопольно используемыми или разделяемыми. Монопольными являются ВУ и некоторые системные структуры данных.

Ресурсы могут быть повторно используемыми или потребляемыми. Примеры первых – тот же ЦП или память; примеры вторых - входные данные и сообщения.

Ресурсы обладают также свойствами дискретности и ограниченности. Первое означает, что ресурсы распределяются некоторыми неделимыми единицами. Второе - то, что число единиц ресурса всегда небесконечно (процессорное время – непрерывно и бесконечно, память всегда конечна, а непрерывность или дискретность ее зависит от принятой модели памяти)

Процесс ни в коем случае не может самостоятельно завладеть ресурсом - а только через посредство ОС. Для предоставления процессам такой возможности в составе API ОС должны быть системные вызовы получения/освобождения ресурса. При запросе на получение ресурса ОС возвращает процессу манипулятор выделенного ресурса или – если выделение ресурса невозможно – блокирует процесс до освобождения требуемого ресурса.

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

Информация о ресурсах, выделенных процессу, также хранится в блоке контекста процесса.

Монопольные ресурсы и тупики

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

  • предупреждения тупиков - какую стратегию распределения ресурсов выбрать, чтобы тупики не возникали вообще?

  • обнаружения тупиков - если не удалось применить стратегию, предупреждающую тупики, то как обнаружить возникший тупик?

  • развязки тупиков - если тупик обнаружен, то как от него избавиться?

Решение этих задач достаточно сложно и всегда сопряжено с потерями: если система применяет либеральную политику выделения ресурсов (т.е. выделяет ресурс практически по любому требованию), то тупики становятся возможными и тогда их надо обнаруживать и развязывать; если же применяется консервативная политика (отказ, если выделение ресурса может грозить возникновением тупика), то снижается эффективность использования ресурсов.

Радикальное решение, к которому стремятся современные ОС, – замена реальных монопольных ресурсов виртуальными разделяемыми. Так, например, два процесса одновременно выполняют вывод данных на принтер. Принтер является монопольным ресурсом. Но на самом деле выводимые данные процесса попадают не непосредственно на принтер, а в так называемую область спулинга на диске (разделяемый ресурс) – для каждого процесса своя область. Затем ОС сама организует последовательный вывод данных, накопленных в областях спулинга на реальный принтер.

Соседние файлы в папке ОСиСП