Moh*_*shi 1 c++ linux multithreading locks
Linux内核中页表的PMD和PTE级别有两个锁。每次线程/进程分配/映射内存时,它都应该持有这些锁之一以相应地更新页表。显然,随着线程数量的增加,持有锁的竞争也会增加。这可能会降低内存映射吞吐量,因为许多线程持有自旋锁。
我想要测量的任务是这些锁对内存映射吞吐量的最坏情况开销,但我不知道如何测量它。
我尝试在增加运行同一循环的线程数时使用mallocin an 。infinite-loop我检查/proc/{pid}/maps每组正在运行的线程以计算映射内存的数量。但我不确定这是否是正确的方法。此外,这种方法会消耗大量内存。
有没有有效的方法来衡量这些锁的最坏情况开销?
小智 5
很多评论都是正确的,但我想我可以尝试完整的回应。首先,使用 malloc 不会使您能够对页面映射进行显式控制,因为注释表示 stdlib 的 malloc 部分实际上会在第一次分配后分配一大块内存。其次,当创建新线程时,这将使用相同的地址空间,因此不会创建额外的映射。
我假设您想从用户空间执行此操作,因为从内核空间,您可以做很多事情来使这种探索有些退化(例如,您可以尝试将页面映射到同一位置)。相反,您想使用 mmap 分配匿名页面。mmap 是创建虚拟内存条目的显式调用,以便当第一次访问该特定页面时,内核实际上可以在该位置放置一些空白物理内存。第一次访问该位置会导致故障,并且第一次访问实际上会使用 PTE 和 PUD 中的锁。
确保良好的基准测试程序:
这在每个线程中意味着什么:
address = <per-thread address>
total = 0;
for(int i = 0; i < N; i++)
{
uint64_t* x = (uint64_t*) mmap((void*) address, 4096, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS, -1, 0); //Maps one page anonymously
assert(x);
*x ^= pseudo_rand(); // Accesses the page and causes the allocation
total += *x; // For fun
int res = munmap((void*) x, 4096); //Deallocates the page (similar locks)
assert(!res);
}
Run Code Online (Sandbox Code Playgroud)
最大的收获是:
mmap并显式访问分配的位置来实际控制单个页面分配。| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |