0:05
Здравствуйте!
В сегодняшней лекции рассмотрим более подробно
логическое и физическое адресные пространства процессов.
Совокупность виртуальных адресов процесса
называется виртуальным адресным пространством.
Диапазон возможных адресов виртуального пространства
у всех процессов является одним и тем же.
Например, при использовании 32-разрядных
виртуальных адресов этот диапазон
задается границами от 0 и до числа,
равного 16-ти F в 16-тиричной системе счисления.
Тем не менее, каждый процесс имеет собственное
виртуальное адресное пространство —
транслятор присваивает виртуальные адреса
переменным и кодам каждой программе независимо.
Совпадение виртуальных адресов переменных
и команд различных процессов не приводит к конфликтам,
так как в том случае, когда эти переменные
одновременно присутствуют в памяти, операционная система
отображает их на разные физические адреса.
В том случае, когда необходимо,
чтобы несколько процессов
разделяли общие данные или коды,
операционная система отображает
соответствующие участки виртуального адресного пространства
этих процессов на один и тот же участок физической памяти.
1:40
Адрес такого типа называют линейным виртуальным адресом.
В других операционных системах виртуальное
адресное пространство делится на части,
называемые сегментами (или секциями,
или областями, или другими терминами).
В этом случае помимо линейного адреса
может быть использован виртуальный адрес,
представляющий собой пару чисел,
где первое — определяет сегмент,
а второе — смещение внутри сегмента.
Существуют и более сложные способы
структуризации виртуального адресного пространства,
когда виртуальный адрес образуется
тремя или даже более числами.
Задачей операционной системы является отображение
индивидуальных виртуальных адресных пространств
всех одновременно выполняющихся процессов
на общую физическую память.
При этом операционная система отображает
либо все виртуальное адресное пространство,
либо только определенную его часть.
2:32
Существуют два принципиально отличающихся подхода
к преобразованию виртуальных адресов в физические.
В первом случае замена виртуальных адресов
на физические выполняется один раз для каждого
процесса во время начальной загрузки программы в память.
Специальная системная программа —
перемещающий загрузчик — на основании имеющихся
у нее исходных данных о начальном адресе
физической памяти, в которую предстоит
загружать программу, а также информации,
предоставленной транслятором
об адресно-зависимых элементах программы,
выполняет загрузку программы, совмещая ее
с заменой виртуальных адресов физическими.
Второй способ заключается в том, что программа
загружается в память в неизмененном виде
в виртуальных адресах, то есть операнды инструкций
и адреса переходов имеют те значения,
которые выработал транслятор.
В наиболее простом случае, когда виртуальная
и физическая память процесса представляют
собой единые непрерывные области адресов,
операционная система выполняет преобразование
виртуальных адресов в физические по следующей схеме.
При загрузке операционная система фиксирует
смещение действительного расположения программного кода
относительно виртуального адресного пространства.
Во время выполнения программы при каждом
обращении к оперативной памяти
выполняется преобразование
виртуального адреса в физический.
Пусть, например, операционная система
использует линейно-структурированное
виртуальное адресное пространство
и пусть некоторая программа, работающая
под управлением этой операционной системы,
загружена в физическую память,
начиная с физического адреса S.
Операционная система запоминает значение
начального смещения S
и во время выполнения программы помещает его
в специальный регистр процессора.
При обращении к памяти виртуальные адреса
данной программы преобразуются в физические
путем прибавления к ним смещения S.
Например, при выполнении инструкции MOV
пересылки данных, находящихся по адресу VA,
виртуальный адрес VA заменяется физическим адресом VA + S.
Последний способ является более гибким:
в то время как перемещающий загрузчик
жестко привязывает программу
к первоначально выделенному ей участку памяти,
динамическое преобразование виртуальных адресов
позволяет перемещать программный код процесса
в течение всего периода его выполнения.
Но использование перемещающего загрузчика
более экономично, так как в этом случае преобразование
каждого виртуального адреса происходит только один раз
во время загрузки, а при динамическом преобразовании —
при каждом обращении по данному адресу.
В некоторых случаях (обычно в специализированных системах),
когда заранее точно известно, в какой области
оперативной памяти будет выполняться программа,
транслятор выдает исполняемый код
сразу в физических адресах.
Необходимо различать максимально возможное
виртуальное адресное пространство процесса
и назначенное (выделенное) процессу
виртуальное адресное пространство.
В первом случае речь идет о максимальном размере
виртуального адресного пространства, определяемом
архитектурой компьютера, на котором работает ОС,
и, в частности, разрядностью его схем адресации
(32-битная, 64-битная и т. п.).
Например, при работе на компьютерах
с 32-разрядными процессорами Intel Pentium
операционная система может предоставить каждому
процессу виртуальное адресное пространство до 4 Гбайт.
Однако это значение представляет собой только
потенциально возможный размер
виртуального адресного пространства,
который редко на практике бывает необходим процессу.
Процесс использует только часть доступного
ему виртуального адресного пространства.
Назначенное виртуальное адресное пространство
представляет собой набор виртуальных адресов,
действительно нужных процессу для работы.
Эти адреса первоначально назначает
программе транслятор на основании текста программы,
когда создает кодовый (текстовый) сегмент,
а также сегмент или сегменты данных,
с которыми программа работает.
5:55
Затем при создании процесса операционная система
фиксирует назначенное виртуальное адресное пространство
в своих системных таблицах.
В ходе своего выполнения процесс может
увеличить размер первоначального назначенного ему
виртуального адресного пространства,
запросив у операционной системы создания
дополнительных сегментов
или увеличения размера существующих.
В любом случае операционная система обычно
следит за корректностью использования процессом
виртуальных адресов — процессу не разрешается
оперировать с виртуальным адресом, выходящим
за пределы назначенных ему сегментов.
Максимальный размер виртуального адресного пространства
ограничивается только разрядностью адреса,
присущей данной архитектуре компьютера,
и, как правило, не совпадает с объемом физической памяти,
имеющимся в компьютере.
6:36
Сегодня для машин универсального назначения типична
ситуация, когда объем виртуального адресного пространства
превышает доступный объем оперативной памяти.
В таком случае операционная система для хранения
данных виртуального адресного пространства
процесса, не помещающихся в оперативную память,
использует внешнюю память, которая в современных компьютерах
представлена жесткими дисками.
Именно на этом принципе основана виртуальная память —
наиболее совершенный механизм,
используемый в операционных системах для управления памятью.
Самый простой способ "обойти" разделение
виртуальных пространств процессов —
использование разделяемой памяти.
Это специальный механизм, с помощью которого
средствами операционной системы два процесса
могут обращаться к общему участку физической памяти —
каждый через свое адресное пространство.
Для операционной системы этот способ является
наиболее простым — ведь все страницы виртуальной
памяти процессов в любом случае
проецируются на какую-то область физической памяти —
так почему бы на ту же область не проецировать
часть адресного пространства другого процесса?
Самое важное, что такое взаимодействие не требует
каких-либо накладных расходов,
процессы обмениваются информацией со скоростью
обращения к памяти.
Однако для пользователя такой способ
межпроцессного взаимодействия является труднодоступным.
Во-первых, программы, взаимодействующие
таким образом, должны изначально содержать
соответствующий код — с помощью специальных
системных вызовов обе программы должны
обозначить участки своих адресных пространств,
предназначенные для обмена информацией.
Другая сложность состоит в том, что
разделяемая память сама по себе не содержит
средств синхронизации, программы
должны согласованно изменять общий участок
памяти, чтобы не испортить данные.
Обычно для этих целей применяются семафоры
и аналогичные механизмы синхронизации.
8:11
Эту проблему мы осветили чуть ранее.
Таким образом, разделяемая память —
наиболее быстрый способ обмена,
но при этом малопригодный для широкого использования.
Обычная сфера применения разделяемой памяти —
специализированные высокопроизводительные программы.
Стоит также обратить внимание на явную
аналогию разделяемой памяти и исполнения
множества потоков в рамках одного процесса —
в операционной системе UNIX эти инструменты
построения программ используются редко
и только в связи с высокопроизводительными
вычислениями и вводом-выводом.
Вызовы POSIX для использования разделяемой памяти
являются shmem(), mmap().
Команды Win API для использования разделяемой памяти
CreateFileMapping, MapViewOfFile.
Их основные параметры представлены на слайде.
Спасибо за вниманием!