首页
学习
活动
专区
圈层
工具
发布

理解mmap
EN

Unix & Linux用户
提问于 2017-08-29 17:01:57
回答 1查看 19.1K关注 0票数 16

我正在查阅有关mmap 这里的文档,并试图使用这段视频实现它。

关于它的执行,我有几个问题。

  1. mmap是提供文件的映射并在物理内存中返回该位置的指针,还是返回映射表的地址?它是否也为该文件分配和锁定空间?
  2. 一旦文件被存储在内存中的那个位置上,它是否会留在那里直到调用munmap?
  3. 该文件甚至被移动到内存中,还是仅仅是一个用作重定向的映射表,并且文件实际上位于虚拟内存-(磁盘)中?
  4. 假设它被移动到内存中,如果其他进程有地址,其他进程可以访问这个空间来读取数据吗?
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2017-08-29 17:36:07

按顺序回答:

  1. 它返回指向虚拟内存中位置的指针,并分配虚拟内存地址空间,但除非您显式地锁定文件,否则不会以任何方式锁定文件(还请注意,锁定内存并不等于锁定文件中的区域)。由于分页和虚拟内存(否则,需要在调用完成之前将整个区域读入内存),mmap()的有效实现实际上只有从实际的角度才能实现。
  2. 不完全是这样,但这与下一个答案有关,所以我会在这里讨论。
  3. 有点。在大多数情况下,实际发生的情况是mmap()提供了对页面缓存中该文件的数据的复制上的访问。因此,通常对数据生存期的缓存限制是适用的:如果系统需要空间,那么页面可以从缓存中删除(如果页面是脏的,可以刷新到磁盘),并且需要再次出错。
  4. 不,是因为虚拟内存的工作方式。每个进程都有自己的虚拟地址空间,并有自己的虚拟映射。每个想要通信数据的程序都必须在同一个文件(或共享内存段)上调用mmap(),并且它们都必须使用MAP_SHARED标志。

值得注意的是,mmap()不仅适用于文件,还可以对其执行其他操作,例如:

  • 直接映射设备内存(如果您有足够的权限)。这实际上用于许多嵌入式系统,以避免为新硬件编写内核模式驱动程序的需要。
  • 映射共享内存段。
  • 显式地映射巨大的页面。
  • 分配内存,然后您可以调用madvise(2),这样您就可以做一些有用的事情,比如防止数据被复制到叉子(2)上的子进程,或者为KSM标记数据,这是Linux的内存去重叠特性。
票数 21
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/389124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档