- •36. Подсистема Win32. 32-х разрядный api. Подсистема Win32
- •37. Структура.
- •38. Конструктивные изменения.
- •39. Api: ms-dos и 16-ти разрядной Windows. Виртуальные dos-машины. Api: ms-dos и 16-ти разрядной Windows.
- •Виртуальные dos-машины
- •44. Диспетчер. Виртуальная память. Диспетчер.
- •Виртуальная память
- •45. Средства пользовательского режима: управление памятью, совместное использование. Средства пользовательского режима
- •Управление памятью
- •Совместное использование памяти
- •46. Совместное использование: секции, проекции и проецируемые файлы. Секции, проекции и проецируемые файлы
- •47. Объект-секция. Способы защиты памяти. Объект-секция
- •Защита памяти
- •48. Собственная память процесса. Совместное использование памяти. Собственная память процесса
- •Совместное использование памяти
- •49. Адресное пространство. Подкачка страниц. Адресное пространство
- •Подкачка страниц
- •50. Механизмы подкачки страниц. Механизмы подкачки страниц
- •51. Стратегия подкачки и рабочие наборы. Стратегия подкачки и рабочие наборы
Совместное использование памяти
Важная задача любой системы управления памятью — обеспечить возможность совместного использования памяти двумя процессами, если им это необходимо или если это может повысить эффективность функционирования ОС. Например, когда два процесса выполняют компиляцию программы на С, можно сэкономить память, если загружать в нее только одну копию компилятора. (Конечно, каждому процессу также нужна персональная память для хранения собственных данных и кода.)
Виртуальная память предоставляет удобный механизм совместного использования памяти. Так как у каждого процесса есть отдельное адресное пространство, ОС достаточно загрузить компилятор только один раз, и, когда он будет вызван другим процессом, диспетчер виртуальной памяти просто отобразит виртуальные адреса этого процесса на физические страничные фреймы, в которых уже находится компилятор (см. рис. 6—4).
Аналогично, если два взаимодействующих процесса создают совместно используемый буфер памяти, то виртуальное адресное пространство каждого из них может быть отображено на одни и те же физические страничные фреймы, занятые буфером. В примере с компилятором диспетчер виртуальной памяти не позволяет ни одному процессу изменять страницы, занятые компилятором. В обоих процессах соответствующие виртуальные страницы помечаются "только для чтения". Однако в случае с буфером возможность записи в него может потребоваться потокам обоих процессов. Следовательно, страницы помечаются признаком "чтение/запись". Конечно, при таком совместном использовании структур данных необходимо синхронизировать доступ потоков к совместно используемой памяти, чтобы предотвратить одновременный их доступ и повреждение данных .
46. Совместное использование: секции, проекции и проецируемые файлы. Секции, проекции и проецируемые файлы
Как и все остальные компоненты Windows NT, диспетчер виртуальной памяти является полностью параллельным. Он выполняется одновременно на всех процессорах многопроцессорного компьютера, и его структуры данных совместно используются потоками, выполняющимися на разных процессорах. Таким образом, создание эффективного решения для совместного использования памяти в Windows NT важно не только для программ пользовательского режима, но и для самой системы.
Совместно используемую память (shared memory) можно определить как память, видимую более чем одним процессом и присутствующую в нескольких виртуальных адресных пространствах. Подход Windows NT к совместному использованию ресурсов состоит в том, что они реализуются в виде защищенных объектов, и память не является исключением. Объект-секция (section object), который подсистема Win32 делает доступным для своих клиентов как объект-проекцию файла (file mapping object), представляет собой блок памяти, совместно используемый двумя или более процессами. Поток одного из процессов создает объект-секцию и присваивает ему имя, чтобы потоки других процессов могли открыть его описатели. Открыв описатель объекта—секции, поток может отобразить секцию целиком или частично в виртуальное адресное пространство, свое собственное или другого процесса.
Объект-секция NT может быть довольно большим и занимать десятки, сотни, даже тысячи страниц. Для экономии своего виртуального адресного пространства процесс может отобразить только нужную ему часть секции; эта отображенная часть называется проекцией (view) секции. Проекция служит окном в совместно используемую область памяти, и разные процессы могут отображать разные проекции секции или даже несколько проекций, как показано на рис. 6-5.
Проекции секции позволяют процессу работать с большими блоками памяти, для отображения которых целиком у него может не хватить виртуального адресного пространства. Например, у фирмы может быть большая база данных с информацией о ее сотрудниках. Программа базы данных создает объект—секцию, содержащий эту базу целиком. При обработке запроса к базе данных программа отображает проекцию секции с базой данных, считывает данные в свое адресное пространство, убирает отображение проекции, после чего отображает новую проекцию секции. Программа как бы перемещает "окно" по этой большой секции, считывая данные из всех частей базы и не переполняя при этом свое виртуальное адресное пространство.
Как и в случае собственной памяти, содержимое совместно используемой памяти откачивается на диск, когда физической памяти становится недостаточно, При удалении из памяти большинства страниц, как совместно используемых,
Рис. 6-4. Совместное использование памяти.
Рис. 6-5. Отображение проекций секции.
так и нет, диспетчер виртуальной памяти записывает их в файл подкачки. Однако объект-секция может откачиваться и в проецируемый файл (mapped file). Примером такого файла является база данных сотрудников фирмы. Программа базы данных использует объект-секцию для переноса содержимого файла в виртуальную память. Затем она может работать с файлом как с большим массивом, отображая различные проекции секции и производя чтение и запись в память, а не в файл. Этот процесс называется также проекционным файловым вводом-выводом (mapped file I/O). Когда программа обращается к недействительной странице (к такой, которая не находится в физической памяти), происходит страничная ошибка, и диспетчер виртуальной памяти автоматически перемещает эту страницу из проецируемого файла в память. Если приложение модифицировало страницу, то диспетчер виртуальной памяти записывает изменения обратно на диск в процессе обычной откачки страниц.
Исполнительная система NT использует проецируемые файлы для загрузки в память исполняемых образов, а системный диспетчер кэша — для чтения и записи кэшируемых страниц. Система ввода-вывода использует проецирование файлов при обработке запросов ввода-вывода, предоставляя диспетчеру виртуальной памяти выполнять запись изменений на диск в процессе обычной откачки страниц.
Для приложений Win32 проецируемые файлы служат удобным способом прямого (в дополнение к последовательному) доступа к большим файлам. Приложение создает для файла объект-проекцию файла Win32 (соответствующий объекту-секции NT), после чего выполняет чтение и запись по произвольным смещениям внутри файла. Диспетчер виртуальной памяти автоматически подкачивает нужные порции файла и записывает изменения обратно на диск.
