【IT专家】使用mmap实现文件映射 | 您所在的位置:网站首页 › 3050能玩巫师3吗 › 【IT专家】使用mmap实现文件映射 |
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
使用
mmap 实现文件映射
2011/12/09 2233 1 文件映射
传统文件访问方式是 , 首先用
open 系统调用打开文件 , 然后使用
read, write 以及
lseek 等调用进行顺序或者随即的
I/O. 这种方式是非常低效的 , 每一次
I/O 操作都需
要一次系统调用 . 另外 , 如果若干个进程访问同一个文件 , 每个进程都要在自己的地
址空间维护一个副本 , 浪费了内存空间 . 系统调用
mmap() 可以将某文件映射至内存
( 进程空间 ) ,如此可以把对文件的操作转为对内存的操作,以此避免更多的
lseek() 与
read() 、 write() 操作,这点对于大文件或者频繁访问的文件而言尤其受益。
文件映射一方面给用户提供了一组措施 , 好似用户将文件映射到自己地址空间的
某个部分 , 使用简单的内存访问指令读写文件;另一方面 , 它也可以用于内核的基本
组织模式 , 在这种模式种 , 内核将整个地址空间视为诸如文件之类的一组不同对象的
映射 .
2Linux 中
VM 的实现
一个进程应该包括一个
mm_struct(memory manage struct), 该结构是进程虚拟地
址空间的抽象描述 , 里面包括了进程虚拟空间的一些管理信息 : start_code, end_code, start_data, end_data, start_brk, end_brk 等等信息 . 另外 , 也有一个指向进程虚存区表
(vm_area_struct: virtual memory area) 的指针 , 该链是按照虚拟地址的增长顺序排列的 . 在
Linux 进程的地址空间被分作许多区 (vma), 每个区 (vma) 都对应虚拟地址空间上一
段连续的区域 , vma 是可以被共享和保护的独立实体 , 这里的
vma 就是前面提到的内
存对象 . 下面是
vm_area_struct 的结构 , 其中 , 前半部分是公共的 , 与类型无关的一
些数据成员 , 如 : 指向
mm_struct 的指针 , 地址范围等等 , 后半部分则是与类型相关
的成员 , 其中最重要的是一个指向
vm_operation_struct 向量表的指针
vm_ops, vm_pos 向量表是一组虚函数 , 定义了与
vma 类型无关的接口 . 每一个特定的子类 , 即每种
vma 类型都必须在向量表中实现这些操作 . 这里包括了 : open, close, unmap, protect, sync, nopage, wppage, swapout 这些操作 .
struct vm_area_struct { /* 公共的 , 与
vma 类型无关的
*/ struct mm_struct * |
CopyRight 2018-2019 实验室设备网 版权所有 |