所以,我理解如果你需要一些动态分配的内存,你可以使用malloc(),例如,你的程序将一个可变长度的文件读入一个char[],你事先不知道你的数组有多大,所以你在运行时分配内存。我试图理解什么时候你会使用mmap(),我已经读了手册页,老实说,我不明白用例是什么。有人能用简单的术语给我解释一下用例吗?先谢谢了。
gwbalxhn1#
mmap可以用于以下几个方面。首先,文件备份Map。您不必使用malloc分配内存并阅读文件,而是将整个文件Map到内存中,而无需显式读取它。现在,当您从(或写入)该存储器区域时,作用于该文件操作,透明地。为什么要这样做呢?它可以让你使用操作系统提供的分页机制轻松地处理大于可用内存的文件。即使对于较小的文件,mmmapping也可以减少内存副本的数量。mmap也可以用于匿名Map。这种Map没有文件支持,基本上是一个对内存块的请求。如果这听起来像malloc,那么你是对的。事实上,大多数malloc的实现将在内部使用匿名mmap来提供大内存区域。另一个常见的用例是让多个进程将同一个文件Map为共享Map,以获得共享内存区域。该文件不必实际写入磁盘。shm_open是实现此目的的一种方便方法。
mmap
malloc
shm_open
1tuwyuhd2#
无论何时需要读/写固定大小的数据块,使用mmap将磁盘上的数据文件Map到内存并直接访问它要简单得多(而且更快),而不是分配内存、读取文件、访问数据、可能将数据写回磁盘并释放内存。
xzlaal3s3#
考虑著名的生产者-消费者问题,生产者使用shm_open创建共享内存对象(),由于我们的目标是让生产者和消费者共享数据,因此我们使用mmap syscall将共享内存区域Map到进程的地址空间。(共享存储器对象由“名称”引用),并在调用mmap以Map地址空间(如对生产者所做的那样)之后从其读取。
3条答案
按热度按时间gwbalxhn1#
mmap
可以用于以下几个方面。首先,文件备份Map。您不必使用malloc
分配内存并阅读文件,而是将整个文件Map到内存中,而无需显式读取它。现在,当您从(或写入)该存储器区域时,作用于该文件操作,透明地。为什么要这样做呢?它可以让你使用操作系统提供的分页机制轻松地处理大于可用内存的文件。即使对于较小的文件,mmmapping也可以减少内存副本的数量。mmap
也可以用于匿名Map。这种Map没有文件支持,基本上是一个对内存块的请求。如果这听起来像malloc
,那么你是对的。事实上,大多数malloc
的实现将在内部使用匿名mmap
来提供大内存区域。另一个常见的用例是让多个进程将同一个文件Map为共享Map,以获得共享内存区域。该文件不必实际写入磁盘。
shm_open
是实现此目的的一种方便方法。1tuwyuhd2#
无论何时需要读/写固定大小的数据块,使用mmap将磁盘上的数据文件Map到内存并直接访问它要简单得多(而且更快),而不是分配内存、读取文件、访问数据、可能将数据写回磁盘并释放内存。
xzlaal3s3#
考虑著名的生产者-消费者问题,生产者使用shm_open创建共享内存对象(),由于我们的目标是让生产者和消费者共享数据,因此我们使用
mmap
syscall将共享内存区域Map到进程的地址空间。(共享存储器对象由“名称”引用),并在调用mmap以Map地址空间(如对生产者所做的那样)之后从其读取。