YaChudo

Mmap

Переглядів: 0. Оновлено 11.10.2026.

У програмуванні mmap(2) — це сумісний із POSIX системний виклик в Unix, який відображає файли або пристрої в пам'ять. Він реалізує сторінкову організацію за запитом, оскільки вміст файлу не зчитується з диска негайно і спочатку взагалі не використовує фізичну RAM. Фактичне зчитування з диска виконується після звернення до певного місця, у лінивий спосіб. Після того як відображення більше не потрібне, вказівники необхідно скасувати за допомогою munmap(2). Інформацією про захист — наприклад, позначенням відображених областей як виконуваних — можна керувати за допомогою mprotect(2), а спеціальну обробку можна забезпечити за допомогою madvise(2).

У Linux, macOS та BSD mmap може створювати кілька типів відображень. Інші операційні системи можуть підтримувати лише їхню підмножину; наприклад, спільні відображення можуть бути непрактичними в операційній системі без глобальної віртуальної файлової системи (VFS) або кешу введення-виведення.

Історія

mmap та пов'язані з ним системні виклики були розроблені як частина Berkeley Software Distribution (BSD), версії Unix. Їхній API вже був описаний у системному посібнику 4.2BSD, хоча він не був реалізований ані в цьому випуску, ані в 4.3BSD.[1] Однак Sun Microsystems реалізувала цей API у випуску 4.0 своєї операційної системи SunOS.[2] Розробники BSD з Університет Каліфорнії, Берклі безуспішно просили Sun передати їм свою реалізацію; натомість 4.3BSD-Reno було випущено з реалізацією, заснованою на системі віртуальної пам'яті Mach.[3]

Відображення, підтримане файлом, та анонімне

Відображення, підтримане файлом (англ. file-backed mapping) відображає область віртуальної пам'яті процесу на файл; тобто читання з цих областей пам'яті спричиняє читання файлу. Це тип відображення за замовчуванням.

Анонімне відображення (англ. anonymous mapping) відображає область віртуальної пам'яті процесу, не підтриману жодним файлом; воно стає доступним за допомогою прапорців MAP_ANONYMOUS/MAP_ANON. Вміст ініціалізується нулями.[4] У цьому відношенні анонімне відображення подібне до malloc і використовується в деяких реалізаціях malloc для певних виділень, особливо великих.

Видимість пам'яті

Якщо відображення є спільним (встановлено прапорець MAP_SHARED), то записи у відображення видимі іншим процесам, які відобразили той самий файл. Якщо відображення є спільним і підтримується файлом (не MAP_ANONYMOUS), то запис до носія базового файлу гарантовано відбудеться лише після передачі його системному виклику msync(2), але система також може скинути його на диск у будь-який інший момент. На відміну від цього, якщо відображення є приватним (встановлено прапорець MAP_PRIVATE), зміни не будуть ані видимими іншим процесам, ані записаними у файл.

Процес, який читає базовий файл або записує до нього, не завжди бачить ті самі дані, що й інший процес, який відобразив цей файл, оскільки сегменти файлу копіюються в RAM і лише періодично скидаються на диск. Синхронізацію можна примусово виконати викликом msync(2).

Використання mmap для файлів може значно зменшити накладні витрати пам'яті для застосунків, які звертаються до одного й того самого файлу; вони можуть спільно використовувати область пам'яті, яку охоплює файл, замість завантаження файлу для кожного застосунку, якому потрібен доступ до нього. Це означає, що mmap(2) іноді використовується для взаємодії між процесами (IPC). У сучасних операційних системах mmap(2) зазвичай є кращим за засіб IPC UNIX System V — спільна пам'ять.[5]

Основна відмінність між спільною пам'яттю System V (shmem) та відображеним у пам'ять введенням-виведенням (mmap) полягає в тому, що спільна пам'ять System V є постійною: якщо процес явно не видалить її, вона зберігається в пам'яті та залишається доступною доти, доки систему не буде вимкнено. Пам'ять, відображена за допомогою mmap, не є постійною між виконаннями застосунку (якщо тільки вона не підтримується файлом).

Див. також

Примітки

  1. ↑ William Joy; Eric Cooper; Robert Fabry; Samuel Leffler; Kirk McKusick; David Mosher (1983). 4.2BSD System Manual (PDF) (Звіт). Computer Systems Research Group, University of California, Berkeley.
  2. ↑ Gingell, Robert A.; Moran, Joseph P.; Shannon, William A. Virtual Memory Architecture in SunOS.
  3. ↑ McKusick, Marshall Kirk (1999). Twenty Years of Berkeley Unix: From AT&T-Owned to Freely Redistributable. Open Sources: Voices from the Open Source Revolution. O'Reilly.
  4. ↑ mmap(2) - The Open Group Base Specifications Issue 8.
  5. ↑ Kerrisk, Michael (2010). The Linux programming interface : a Linux and UNIX system programming handbook. San Francisco: No Starch Press. с. 1116. ISBN 978-1-59327-291-3. OCLC 728672600.

Джерело: стаття у Вікіпедії та історія редагувань (автори).