虚拟内存技术

1 虚拟内存技术

1.1虚拟地址(逻辑地址)

    操作系统中申请的物理空间,都会映射到虚拟地址上。然后可通过虚拟地址访问物理空间。

1.2 内存页面

    操作系统分配(映射)物理空间时,以页为单位

    malloc申请的空间后台会用一定的数据结构来管理

    brk/sbrk申请的空间后台会维护一个位置

    mmap申请的空间由程序员自己管理

1.3 sbrk(int n);

     返回值:永远是移动之前的位置。

     n>0 申请n个字节的空间,将当前位置向后移n个字节

     n<0 释放n个字节的空间,将当前位置向前移n个字节

     n=0 返回当前位置,如果程序中第一次调用sbrk(0),返回一个未使用过的虚拟地址,以后用sbrk,brk分配空间时,就使用这个虚拟地址。

1.4 brk(void *p);

     返回值:0:成功,-1:失败

     将当前位置移动到指定位置(p),如果这样的移动是向前,相当于释放空间,向后移动相当于分配空间

1.5 mmap

     内存映射,mmap向操作系统申请一片内存空间,由程序员自己管理
     mmap(void *p, size_t sz, int port, int flags, int fd, off_t offset)
     p:指定映射好的空间的首地址,一般为NULL,让系统指定首地址
     sz:大小,以页面对其
     prot:
         PROT_READ,PROT_WRITE,PROT_EXEC
     flags:
         MAP_SHARED和MAP_PRIVATE必选其一,对于内存映射没有区别,区别主要在文件映射。
         MAP_ANONYMOUS,匿名映射,专门用于映射内存。如果没有此选项,默认为映射文件。
         fd:文件描述符
         off:文件偏移量
返回值:映射好的内存空间的首地址
         (void *)-1或 MAP_FAILED 代表失败
解除映射:
        相当于释放内存空间
        munmap(首地址, 大小)        




你可能感兴趣的:(C语言,虚拟内存)