我在RHEL 5.8上有一个多线程应用程序,它通过MMAP读取大文件(每个文件大约500MB),并对它们进行一些处理;一个线程执行MMAP,其他线程执行处理。当文件不再在文件系统上时,将执行munmap以释放内存。
我的问题是munmap(有时关闭文件)会减慢其他线程的速度,在不同的内存上执行操作,所以我想知道是否有更好的方法来实现这一点。我有两个想法:把内存分成更小的块,然后把更小的块(这可能吗?),或者根本不使用munmap并自己分配/释放内存,如果文件不再在文件系统上,则可以选择缓存内存块,并将其重新用于下一个文件。
谢谢你的意见。
最佳答案
它变慢的实际原因是munmap()
在系统调用的整个过程中使用mm->mmap_sem锁。其他一些操作可能会因此而受阻,例如(但不限于)fork()
/mmap()
。对于不为内存中已有的页实现无锁get_user_pages_fast()
操作的体系结构,这一点尤其重要,因为一堆futex操作(支持pthread原语)将调用get_user_pages_fast()
,而默认实现将尝试对mmap_sem
进行读锁。
关于linux - munmap在Linux上的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9819186/