匿名内存映射和共享内存是否只从物理内存分配空间?

匿名内存映射和共享内存是否只从物理内存分配空间?

在Linux中,

  • 当使用 mmap() 进行匿名内存映射或使用 malloc() 时,它们是仅从物理内存分配“空间”,还是从物理内存或交换或它们的组合分配“空间”? (我猜是后者)

  • 当使用 System V 共享内存时,它(例如 shmget())是否仅从物理内存、或物理内存或交换或其组合创建共享内存段? (我猜是前者,因为共享内存据说是一种快速的IPC机制)

  • 当使用 POSIX 共享内存时,它(例如 shm_open())是否仅从物理内存、或者物理内存、交换或其组合创建共享内存对象? (我猜是前者,因为共享内存据说是一种快速的IPC机制)

谢谢。

答案1

如果他们分配记忆无论如何,他们只是将其保留为交换空间。

mmapmalloc、 并shmget在调用进程的地址空间中分配空间;在 Linux 上,mmapshmget可以在交换空间中保留空间(除非指定MAP_NORESERVE或)。SHM_NORESERVE他们不分配支持身体的记忆。shm_open也不分配内存:它用于打开现有对象,或创建新的 0 长度对象。

当地址空间中的地址被取消引用时,分配实际的内存页。如果可能的话,这种分配总是发生在物理内存中;否则该进程将无法在那里读取或写入。分配并写入非锁定内存后被换掉,但如果有的话,那会在以后发生。

(“预留”是指为进程预留相应的存储空间;“分配”是指为进程分配特定的资源,例如虚拟地址空间中的地址或内存中的页面。)

相关内容