MALLOC_MMAP_THRESHOLD
全部标签 如果我创建一个mmap(2)文件,其prot参数仅为PROT_READ并且支持它的文件也被读取-仅且不变,MAP_SHARED和MAP_PRIVATE之间是否存在任何性能差异(或任何差异)?内核会在两者之间做一些不同的事情吗?(文档仅提及“更新”方面的行为差异,但因为它是PROT_READ,所以不可能没有更新。我想知道是否还有其他差异?) 最佳答案 在MAP_PRIVATE下,Linux联机帮助页指出未指定在映射区域中是否可见调用mmap()后对文件所做的更改。MAP_SHARED不是这种情况。所以如果你需要映射的内容和文件的内容一
如果我创建一个mmap(2)文件,其prot参数仅为PROT_READ并且支持它的文件也被读取-仅且不变,MAP_SHARED和MAP_PRIVATE之间是否存在任何性能差异(或任何差异)?内核会在两者之间做一些不同的事情吗?(文档仅提及“更新”方面的行为差异,但因为它是PROT_READ,所以不可能没有更新。我想知道是否还有其他差异?) 最佳答案 在MAP_PRIVATE下,Linux联机帮助页指出未指定在映射区域中是否可见调用mmap()后对文件所做的更改。MAP_SHARED不是这种情况。所以如果你需要映射的内容和文件的内容一
我在Linux2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。我有一个客户端进程(从父进程派生,即服务器),它将结构(消息)写入(在派生之后)创建的内存映射区域:消息*m=mmap(NULL,sizeof(message),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)然后这个指针被写入一个队列(以链表的形式)到另一个共享内存区域,这是服务器和客户端进程共有的(因为if是在fork之前用上面相同的代码创建的)。然后服务器读取该区域,服务器获取指向消息的指针并对其进行处理。问题是*m是在
我在Linux2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。我有一个客户端进程(从父进程派生,即服务器),它将结构(消息)写入(在派生之后)创建的内存映射区域:消息*m=mmap(NULL,sizeof(message),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)然后这个指针被写入一个队列(以链表的形式)到另一个共享内存区域,这是服务器和客户端进程共有的(因为if是在fork之前用上面相同的代码创建的)。然后服务器读取该区域,服务器获取指向消息的指针并对其进行处理。问题是*m是在
与使用malloc相比,使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存有什么缺点?对于函数作用域中的数据,无论如何我都会使用堆栈内存,因此不会使用malloc.我想到的一个缺点是对于动态数据结构,例如树和链表,您经常需要分配和释放小块数据。使用mmap会很昂贵,原因有两个,一个是在4096字节的粒度上分配,另一个是需要进行系统调用。但是在其他场景下,你觉得malloc比mmap好吗?其次,我是否高估了mmap对于动态数据结构的劣势?mmap优于malloc我能想到的一个优点是,当您执行munmap时,内存会立即返回给操作系统,而使用malloc/free
与使用malloc相比,使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存有什么缺点?对于函数作用域中的数据,无论如何我都会使用堆栈内存,因此不会使用malloc.我想到的一个缺点是对于动态数据结构,例如树和链表,您经常需要分配和释放小块数据。使用mmap会很昂贵,原因有两个,一个是在4096字节的粒度上分配,另一个是需要进行系统调用。但是在其他场景下,你觉得malloc比mmap好吗?其次,我是否高估了mmap对于动态数据结构的劣势?mmap优于malloc我能想到的一个优点是,当您执行munmap时,内存会立即返回给操作系统,而使用malloc/free
malloc是确定性的吗?假设我有一个fork进程,即另一个进程的副本,并且在某个时候它们都调用了malloc函数。分配的地址在两个进程中是否相同?假设执行的其他部分也是确定性的。注意:这里我只谈虚拟内存,不谈物理内存。 最佳答案 它根本没有理由是确定性的,事实上,它不是确定性的可能有一些好处,例如increasingthecomplexityofexploitingbugs(另请参见thispaper)。这种随机性有助于使漏洞更难编写。要成功利用缓冲区溢出,您通常需要做两件事:将有效载荷传送到可预测/已知的内存位置使执行跳
malloc是确定性的吗?假设我有一个fork进程,即另一个进程的副本,并且在某个时候它们都调用了malloc函数。分配的地址在两个进程中是否相同?假设执行的其他部分也是确定性的。注意:这里我只谈虚拟内存,不谈物理内存。 最佳答案 它根本没有理由是确定性的,事实上,它不是确定性的可能有一些好处,例如increasingthecomplexityofexploitingbugs(另请参见thispaper)。这种随机性有助于使漏洞更难编写。要成功利用缓冲区溢出,您通常需要做两件事:将有效载荷传送到可预测/已知的内存位置使执行跳
我想使用mmap在Linux下运行的C程序中实现程序状态某些部分的持久化,方法是使用带有MAP_SHARED标志集的mmap()将固定大小的结构与众所周知的文件名相关联。出于性能原因,我宁愿根本不调用msync(),并且没有其他程序会访问该文件。当我的程序终止并重新启动时,它将再次映射同一个文件并对它进行一些处理以恢复它在终止之前所处的状态。我的问题是:如果我从不在文件描述符上调用msync(),即使我的进程被SIGKILL终止,内核是否会保证所有对内存的更新都将写入磁盘并随后可恢复?此外,即使我的程序从不调用msync(),内核是否会定期将页面写入磁盘而产生一般系统开销?编辑:我已经
我想使用mmap在Linux下运行的C程序中实现程序状态某些部分的持久化,方法是使用带有MAP_SHARED标志集的mmap()将固定大小的结构与众所周知的文件名相关联。出于性能原因,我宁愿根本不调用msync(),并且没有其他程序会访问该文件。当我的程序终止并重新启动时,它将再次映射同一个文件并对它进行一些处理以恢复它在终止之前所处的状态。我的问题是:如果我从不在文件描述符上调用msync(),即使我的进程被SIGKILL终止,内核是否会保证所有对内存的更新都将写入磁盘并随后可恢复?此外,即使我的程序从不调用msync(),内核是否会定期将页面写入磁盘而产生一般系统开销?编辑:我已经