相关疑难解决方法(0)

28
推荐指数
1
解决办法
3万
查看次数

是真的,当调用realloc时,现代操作系统可能会跳过副本

在阅读/sf/answers/223334261/时,我有一个问题.Qt作者在Qt 4容器内部所说的内容:

... QVector使用realloc()以4096字节的增量增长.这是有道理的,因为现代操作系统在重新分配缓冲区时不会复制整个数据; 物理内存页面只需重新排序,只需要复制第一页和最后一页上的数据.

我的问题是:

1)现代操作系统(Linux - 对我来说最有趣; FreeBSD,OSX,Windows)及其realloc实现是否真的能够使用虚拟到物理映射的重新排序重新分配数据页面并且无需逐字节复制?

2)用于实现此内存移动的系统调用是什么?(我认为可以splice使用SPLICE_F_MOVE,但它现在有缺陷且没有操作(?))

3)它是有利可图使用这些页面重排,而不是逐字节复制,尤其是在多核多线程的世界里,虚拟到物理映射的每一个变化需要刷新(无效)改变从页表项TLB中的所有特殊数十个CPU核心与IPI?(在linux中,这就像是flush_tlb_range或者flush_tlb_page)

upd for q3:mremap vs memcpy的一些测试

memory-management realloc linux-kernel

10
推荐指数
1
解决办法
1281
查看次数

标签 统计

linux-kernel ×1

memory ×1

memory-management ×1

mmap ×1

realloc ×1