Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8.10.11.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.95 Mб
Скачать

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

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

Виртуальная память предоставляет удобный механизм совместного ис­пользования памяти. Так как у каждого процесса есть отдельное адресное про­странство, ОС достаточно загрузить компилятор только один раз, и, когда он будет вызван другим процессом, диспетчер виртуальной памяти просто отобра­зит виртуальные адреса этого процесса на физические страничные фреймы, в которых уже находится компилятор (см. рис. 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), после чего выполняет чтение и запись по произвольным смещениям внутри файла. Диспетчер виртуальной памяти автоматически подка­чивает нужные порции файла и записывает изменения обратно на диск.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]