zoukankan      html  css  js  c++  java
  • mmap

    总结:

    1、内存与文件、设备;

    2、文件支持的映射;

    3、定时刷新与强制刷新;

    4、内存共享与声明周期;

    mmap

    In computingmmap(2) is a POSIX-compliant Unix system call that maps files or devices into memory. It is a method of memory-mapped file I/O. It implements demand paging, because file contents are not read from disk initially and do not use physical RAM at all. The actual reads from disk are performed in a "lazy" manner, after a specific location is accessed. After the memory is no longer needed, it is important to munmap(2) the pointers to it. Protection information can be managed using mprotect(2), and special treatment can be enforced using madvise(2).

    In LinuxMac OS X and the BSDsmmap can create several types of mappings. Other operating systems may only support a subset of these, for example, shared mappings may not be practical in an operating system without a global VFS or I/O cache.

    History

    mmap and associated systems calls were designed as part of the Berkeley Software Distribution (BSD) version of Unix. Their API was already described in the 4.2BSD System Manual, even though it was neither implemented in that release, nor in 4.3BSD.[1] Sun Microsystems had implemented this very API, though, in their SunOSoperating system. The BSD developers at U.C. Berkeley requested Sun to donate its implementation, but these talks never led to any transfer of code; 4.3BSD-Reno was shipped instead with an implementation based on the virtual memory system of Mach.[2]

    File-backed and anonymous

    File-backed mapping maps an area of the process's virtual memory to files; i.e. reading those areas of memory causes the file to be read. It is the default mapping type.

    Anonymous mapping maps an area of the process's virtual memory not backed by any file. The contents are initialized to zero.[3] In this respect an anonymous mapping is similar to malloc, and is used in some malloc(3) implementations for certain allocations. However, anonymous mappings are not part of the POSIX standard, though implemented by almost all operating systems by the MAP_ANONYMOUS and MAP_ANON flags.

    Memory visibility

    If the mapping is shared (the MAP_SHARED flag is set), then it is preserved across a fork(2) system call. This means that writes to a mapped area in one process are immediately visible in all related (parent, child or sibling) processes. If the mapping is shared and backed by a file (not MAP_ANONYMOUS) the underlying file media is only guaranteed to be written after it is msync(2)'ed.

    If the mapping is private (the MAP_PRIVATE flag is set), the changes will neither be seen by other processes nor written to the file.

    A process reading from or writing to the underlying file will not always see the same data as a process that has mapped the file, since the segment of the file is copied into RAM and periodically flushed to disk. Synchronization can be forced with the msyncsystem call.

    mmap(2)ing files can significantly reduce memory overhead for applications accessing the same file; they can share the memory area the file encompasses, instead of loading the file for each application that wants access to it. This means that mmap(2) is sometimes used for Interprocess Communication (IPC). On modern operating systems mmap(2) is typically preferred to the System V IPC Shared Memory facility.

    The main difference between System V shared memory (shmem) and memory mapped I/O (mmap) is that SystemV shared memory is persistent: unless explicitly removed by a process, it is kept in memory and remains available until the system is shut down. mmap'd memory is not persistent between application executions (unless it is backed by a file).

    Example of usage under the C programming language

    #include <sys/types.h>
    #include <sys/mman.h>
    #include <err.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    /* Does not work on OS X, as you can't mmap over /dev/zero */
    int main(void)
    {
            const char str1[] = "string 1";
            const char str2[] = "string 2";
            pid_t parpid = getpid(), childpid;
            int fd = -1;
            char *anon, *zero;
    
            if ((fd = open("/dev/zero", O_RDWR, 0)) == -1)
                    err(1, "open");
    
            anon = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
            zero = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    
            if (anon == MAP_FAILED || zero == MAP_FAILED)
                    errx(1, "either mmap");
    
            strcpy(anon, str1);
            strcpy(zero, str1);
    
            printf("PID %d:	anonymous %s, zero-backed %s
    ", parpid, anon, zero);
            switch ((childpid = fork())) {
            case -1:
                    err(1, "fork");
                    /* NOTREACHED */
            case 0:
                    childpid = getpid();
                    printf("PID %d:	anonymous %s, zero-backed %s
    ", childpid, anon, zero);
                    sleep(3);
    
                    printf("PID %d:	anonymous %s, zero-backed %s
    ", childpid, anon, zero);
                    munmap(anon, 4096);
                    munmap(zero, 4096);
                    close(fd);
                    return EXIT_SUCCESS;
            }
    
            sleep(2);
            strcpy(anon, str2);
            strcpy(zero, str2);
    
            printf("PID %d:	anonymous %s, zero-backed %s
    ", parpid, anon, zero);
            munmap(anon, 4096);
            munmap(zero, 4096);
            close(fd);
            return EXIT_SUCCESS;
    }
    

    sample output:

    PID 22475:      anonymous string 1, zero-backed string 1
    PID 22476:      anonymous string 1, zero-backed string 1
    PID 22475:      anonymous string 2, zero-backed string 2
    PID 22476:      anonymous string 2, zero-backed string 2
    

    See also

    • Virtual memory for when there is more address space than physical memory
    • Paging for the implementation of virtual memory
    • Page cache for a disk caching mechanism utilized by mmap
    • Demand paging for a scheme implemented by mmap

    https://en.wikipedia.org/wiki/Mmap

  • 相关阅读:
    JavaScript系列:《JavaScript高级程序设计》,chapter2, 在html中使用JavaScript
    Java系列:JVM指令详解(下)(zz)
    Java系列:JVM指令详解(上)(zz)
    Java系列:关于Java中的桥接方法
    REST: C#调用REST API (zz)
    Activiti系列:为什么Activiti 5.18 的REST的api总是返回404错误
    timeSeries db之:使用Metrics监控应用程序的性能 (zz)
    Java系列:国际化(zz)
    通过数据库方式访问excel 2007及其以后(xlsx)文件的连接字符串
    java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10737638.html
Copyright © 2011-2022 走看看