Читаем Linux API. Исчерпывающее руководство полностью

• Обычные операции read() и write() подразумевают двойную передачу данных: сначала между файлом и кэшем буфера ядра, а затем — между этим кэшем и буфером в пользовательском пространстве. Второго этапа можно избежать, если задействовать mmap(). При вводе данные доступны пользовательскому процессу сразу, как только ядро отобразит соответствующие блоки файла в память. При выводе этому процессу всего лишь нужно изменить содержимое памяти, а диспетчер памяти ядра сам автоматически обновит исходный файл.

• Помимо экономии на передаче данных между пространством ядра и пользователя, mmap() может также снизить потребление памяти. При использовании операций read() и write() данные хранятся в двух буферах, один из которых находится в пользовательском пространстве, а другой принадлежит ядру. Вызову mmap() нужен только один общий буфер, разделяемый между пространствами ядра и пользователя. Кроме того, этот единый буфер ядра может применяться несколькими процессами, которые выполняют ввод/вывод с одним и тем же файлом, что еще больше снижает потребление памяти.

Выгода от улучшенной производительности отображения ввода/вывода в большинстве случаев проявляется при выполнении множества операций произвольного доступа к большому файлу. При последовательном доступе вызов mmap() почти (или совсем) не имеет существенных преимуществ по сравнению с операциями read() и write(), при условии, что используется буфер достаточных размеров, который позволяет избежать большого количества системных вызовов для ввода/вывода. Причина заключается вот в чем: независимо от применяемой методики все содержимое файла будет считано с диска в память всего один раз и по сравнению с этим выгода от пониженного потребления памяти и отказа от передачи данных между пространством пользователя и ядра является несущественной.

Отображение ввода/вывода в память может иметь некоторые недостатки. В случае с чтением/записью небольшого объема данных издержки от применения этой методики (то есть отображение, отказы страницы, удаление отображения и обновление буфера ассоциативной трансляции в физической памяти) могут превысить затраты на использование операций read() и write(). Кроме того, иногда ядру не удается эффективно выполнить обратную запись в изменяемое отображение (в данном случае производительность можно повысить за счет вызовов msync() или sync_file_range()).


Межпроцессное взаимодействие на основе разделяемого файлового отображения

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


Пример программы

В листинге 45.2 приводится простой пример использования вызова mmap() для создания разделяемого файлового отображения. Сначала данная программа отображает файл, заданный в виде первого аргумента командной строки. Затем она выводит значение строки, находящейся в начале отображенного участка. В завершение второй аргумент командной строки, если он был указан, копируется на соответствующий участок разделяемой памяти.

Применение данной программы показано на примере следующей сессии командной оболочки. Для начала создадим 1024-байтный файл, заполненный нулями:

$ dd if=/dev/zero of=s.txt bs=1 count=1024

1024+0 records in

1024+0 records out

Теперь воспользуемся нашей программой, чтобы отобразить этот файл и скопировать строку в отображенный участок:

$ ./t_mmap s.txt hello

Current string=

Copied "hello" to shared memory

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

Теперь опять попытаемся отобразить файл и скопировать на отображенный участок новую строку:

$ ./t_mmap s.txt goodbye

Current string=hello

Copied "goodbye" to shared memory

В завершение выведем файл (по восемь символов в строке), чтобы проанализировать его содержимое:

$ od — c — w8 s.txt

0000000 g o o d b y e nul

0000010 nul nul nul nul nul nul nul nul

*

0002000

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

Системный вызов msync(), применяемый в листинге 45.2, будет рассмотрен в разделе 45.5.


Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных