Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Управление памятью Модель mmap

Модель mmap

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

Процесс создает сегмент разделяемой памяти, используя чтобы отобразить файл, на который ссылаются посредством дескриптора fd, начиная с файлового смещения offset в свое адресное пространство, начиная с addr и в продолжение len байтов с правами доступа prot. Параметр flags дает процессу возможность указать, хочет ли он сделать разделяемое или индивидуальное отображение. Изменения, сделанные в разделяемом отображении, записываются обратно в файл и видны другим процессам. Изменения, сделанные в индивидуальном отображении, обратно в файл не записываются и не видны другим процессам. Два процесса, которые хотят разделять участок памяти, запрашивают разделяемое отображение одного и того же файла в свое адресное пространство. Таким образом, разделяемые объекты идентифицирует существующее и хорошо понятное пространство имен файловой системы. Содержимое файлов используется в качестве начальных значений сегмента памяти. Все изменения, сделанные в отображении, отражаются обратно в содержании файла, поэтому в области разделяемой памяти можно поддерживать долгосрочное состояние даже между различными вызовами разделяющих процессов.

Некоторые приложения хотят использовать разделяемую память исключительно в качестве краткосрочного механизма межпроцессного взаимодействия. Им нужна область памяти, которая изначально заполнена нулями и содержание которой игнорируется после ее использования. Такие процессы не хотят после завершения работы с памятью ни платить относительно высокую цену на старте, связанную с подкачкой содержимого файла для инициализации сегмента разделяемой памяти, ни платить цену при завершении, связанную с записью модифицированных страниц обратно в файл. Хотя FreeBSD на самом деле предоставляет в качестве механизма взаимодействия для такой краткосрочной разделяемой памяти ограниченную и причудливую схему именования интерфейса System V shmem, дизайнеры в конечном счете решили, что все именование объектов для mmap должно использовать пространство имен файловой системы. Чтобы предоставить эффективный механизм для краткосрочной разделяемой памяти, они создали резидентную файловую систему виртуальной памяти для временных объектов. Если нет недостатка в памяти, файлы, созданные в резидентной файловой системе виртуальной памяти, целиком находятся в оперативной памяти. Таким образом, устраняется цена как начальной страничной подкачки, так и последующей обратной записи. Обычно резидентная файловая система виртуальной памяти монтируется в /tmp. Два процесса, желающие создать временную область разделяемой памяти, создают в/tmp файл, который они оба могут потом отобразить в свои адресные пространства.

Когда отображение больше не нужно, его можно удалить, используя munmap(caddr_t address, size_t length);

Системный вызов munmap удаляет любые отображения, которые существуют в адресном пространстве, начиная с addr и на протяжении len байтов. Между предыдущими отображениями и последующим munmap ограничений нет. Указанный диапазон может быть подмножеством предыдущего mmap, или он может заключать область, содержащую множество созданных mmap файлов. При завершении процесса система выполняет неявное munmap для всего его адресного пространства.

В ходе первоначального отображения процесс может установить защиту страницы, чтобы разрешить чтение, запись и/или выполнение. Процесс может изменить эти права доступа, используя

Mprotect(caddr_t address, int length, int protection);

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

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

Mlock(caddr_t address, size_t length);

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

Когда процесс завершил работу с критичным ко времени использованием заблокированной mlock области, он может освободить страницы, используя

Munlock(caddr_t address, size_t length);

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

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

Msync(caddr_t address, int length);

Обратно в файловую систему записываются лишь модифицированные страницы внутри указанного диапазона адресов. Системный вызов msync не оказывает никакого воздействия на анонимные области.


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 55 гостей онлайн

Реклама на сайте:

Сайт: http://www.weblancer.net/projects/ category_id=10.

Без очередей гинекологические клиники в санкт петербурге.

Лучшие натяжные потолки Вы можете выбрать в салоне "7 Небо".