我有一个文件(该文件将是只读的,但该文件的权限可能不是只读的),我可以通过mmap()
(在C中)或[Go]中的syscall.Mmap()
映射到内存。如果我有多个进程映射同一个文件(可能不是同一时间),该文件是否会在内存中的不同位置多次映射到内存中?有没有一种方法可以使映射的内存持久化,以便可以被多个进程使用?
P.S。我知道shmget()
可以使一块持久的内存保留在内存中,以便可以在许多进程中重用。但是我也看到有人说它是旧的,mmap()
是新的。我很困惑,至少在某些情况下mmap()
是否可以完全取代shmget()
。但是我认为mmap()
可能无法取代shmget()
。
任何理智的操作系统都只会将一个物理页面分配给文件的每个内容。可以很容易地检查是否这样做:产生一千个进程,每个进程将一个GB的只读文件映射到内存中。然后开始从所述映射进行随机读取。除非您有1 TB的RAM,否则如果操作系统为使用映射的每个进程分配单独的物理页,它将陷入停顿。幸运的是:不会。即使只有3 GB的RAM和较旧的操作系统(如32位Windows XP),一旦读取并缓存了文件的所有内容,它也能正常工作。