依次回答问题:
- 它返回一个指向虚拟内存中位置的指针,并分配了虚拟内存地址空间,但是除非您明确锁定它,否则文件不会以任何方式被锁定(还请注意,锁定内存与锁定文件中的区域不同。文件)。实际上,由于有分页和虚拟内存,从实际的角度来看,mmap()的有效实现实际上是可能的(否则,在调用完成之前,它需要将整个区域读入内存中)。
- 不完全是,但这与下一个答案有关,因此我将在此进行介绍。
- 有点儿。大多数情况下,实际上发生的是mmap()提供对页面缓存中文件数据的写时复制访问。因此,通常存在对数据生存期的缓存限制(如果系统需要空间,则可以从缓存中删除页面(如果页面脏了,则刷新到磁盘),并且需要再次进行故障处理。
- 否,因为虚拟内存的工作原理。每个进程都有自己的虚拟地址空间和自己的虚拟映射。每个要传递数据的程序都必须在同一文件(或共享内存段)上调用mmap(),并且它们都必须使用该
MAP_SHARED
标志。
值得注意的是,mmap()不仅适用于文件,还可以使用它执行其他操作,例如:
- 直接映射设备内存(如果您有足够的特权)。实际上,这在许多嵌入式系统上都可以使用,以避免需要为新硬件编写内核模式驱动程序。
- 映射共享内存段。
- 明确映射大页面。
- 分配内存,然后可以在其上调用madvise(2)(这又使您可以做一些有用的事情,例如防止将数据复制到fork(2)上的子进程,或将数据标记为KSM(Linux的内存重复数据删除功能))。
mmap
但您正在使用它