编写满足无锁进度保证的算法或数据结构的困难之一是动态内存分配:调用像malloc或new这样的东西不能保证以可移植的方式释放锁。然而,存在许多malloc或new的无锁实现,还有各种各样的无锁内存分配器可用于实现无锁算法/数据结构。
但是,我仍然不明白这如何才能完全满足无锁的进度保证,除非您具体地将数据结构或算法限制在某些预先分配的静态内存池上。但是,如果您需要动态内存分配,我不明白从长远来看,任何所谓的无锁内存分配程序都是真正没有锁的。问题是,无论您的无锁malloc或new有多么神奇,最终您可能会耗尽内存,此时您必须退回到要求操作系统提供更多内存。这意味着最终您必须调用brk()或mmap()或一些类似的低级级别,才能真正访问更多内存。而且无法保证这些低级别调用都是以无锁的方式实现的。
这是无法避免的(除非你使用的是像MS这样不提供内存保护的老操作系统,或者是你自己编写的完全没有锁的操作系统--这两个方案既不实用,也不可能。)那么,任何动态内存分配程序如何才能真正实现无锁呢?
发布于 2017-09-22 04:36:39
正如您已经发现的,基本的OS分配程序很可能不是无锁的,因为它必须处理多个进程和所有有趣的东西,这使得它很难不引入某种锁。
然而,在某些情况下,“无锁内存分配”并不意味着“永不锁定”,而是“统计上的锁很少,以至于它并不重要”。这对除了最严格的实时系统之外的任何事情都是好的。如果您对锁没有很高的争用,那么锁或没有锁并不是真正重要的--无锁的目的实际上并不是锁本身的开销,而是它成为一个瓶颈,系统中的每个线程或进程都必须通过这个地方来做任何有用的事情,而且当它这样做时,它必须在队列中等待--它也可能不是一个真正的队列,它可能是“谁先醒来”,或者决定谁在当前调用之后出现的其他机制。
要解决这个问题,有几种不同的选择:
https://stackoverflow.com/questions/46355935
复制相似问题