当我们想要写入数据项时,包含数据的块首先被带入缓存,然后数据项被写入到缓存中。这可能会导致缓存污染。为了避免这种情况,英特尔引入了无时间指令。如果我将使用mmap()将数据写入文件,并且永远不再读取,是否有可能避免为此创建TLB条目?是否有类似于非时间指令的指令可用?
TLB条目是CPU用来将虚拟地址映射到物理地址的必要组成部分,因此无法通过mmap()或任何类似的API避免它们。即使有可能避免在TLB中存储映射,每次访问映射内存都需要重新加载相应的页表条目,因此性能会大大降低。非临时访问仅对存储操作有意义,但页表条目是读取操作。
write
并设置缓冲区大小为大约1/2 L2缓存大小或类似大小可能会实际表现更好;您应该进行测试。(虽然内核在将您的缓冲区复制到页面高速缓存时可能不会使用NT存储)。如果文件数据确实不会在很长一段时间内被引用,则可以使用madvise(MADV_DONTNEED)
来避免页面高速缓存污染,以鼓励内核在将其写入磁盘后将其从RAM中删除。 - Peter Cordes