内存映射
内存映射指的是将 : 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系。当然,也可以多个进程同时映射到一个对象上面。
实现过程
- 内存映射的实现过程主要是通过Linux系统下的系统调用函数:mmap()
- 该函数的作用 = 创建虚拟内存区域 + 与共享对象建立映射关系
- 其函数原型、具体使用 & 内部流程 如下
/** * 函数原型 */
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
/**
* 具体使用(用户进程调用mmap())
* 下述代码即常见了一片大小 = MAP_SIZE的接收缓存区 & 关联到共享对象中(即建立映射)
*/
mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);
/**
* 内部原理
* 步骤1:创建虚拟内存区域
* 步骤2:实现地址映射关系,即:进程的虚拟地址空间 ->> 共享对象
* 注:
* a. 此时,该虚拟地址并没有任何数据关联到文件中,仅仅只是建立映射关系
* b. 当其中1个进程对虚拟内存写入数据时,则真正实现了数据的可见
*/
优点
进程在读写磁盘的时候,大概的流程是:
以write 为例:
进程(用户空间) -> 系统调用,进入内核 -> 将要写入的数据从用户空间拷贝到内核空间的缓存区 -> 调用磁盘驱动 -> 写在磁盘上面。
使用mmap之后
进程(用户空间)--> 读写映射的内存 --> 写在磁盘上面。
(这样的优点是 避免了频繁的进入内核空间,进行系统调用,提高了效率)
共享内存
共享内存是一种ipc的方式,用于进程通信。共享内存位于 进程空间的 栈和堆之间。一般默认的大小是32M。
实现api
shmget 函数