锁通常通过测试设置和交换机器级指令来实现。是否有其他不使用这些实现的实现?
另外,我们是否可以说,针对关键部分问题的所有硬件级解决方案都可以分为三类,即中断禁用,测试设置和交换?
锁通常通过测试设置和交换机器级指令来实现。是否有其他不使用这些实现的实现?
另外,我们是否可以说,针对关键部分问题的所有硬件级解决方案都可以分为三类,即中断禁用,测试设置和交换?
Answers:
是的,您可以仅使用内存加载和存储指令来实现互斥。长期以来一直在为该问题设计更简单的解决方案。
我所知道的最早的版本称为“ Dekker解决方案”,是在Edsger W.的Dijkstra推出的。“协作顺序过程”,在F. Genuys编辑,《编程语言:北约高级研究学院》,第43-112页,学术出版社,1968年。从那时起,已经有数十种解决方案。我将只讨论一些较著名的。
兰普特,莱斯利;1974年,Comm ACM 17(8):453-455,“ Dijkstra并发编程问题的新解决方案”引入了“面包店算法”(因为它是基于人们采用数字来确定数字顺序的类比)在面包店工作)。该算法特别值得注意的特征之一是,它证明解决互斥问题根本不需要硬件原子性。重叠写入同一位置的读取可以返回任何值,并且该算法仍然有效。 兰珀特在他主页上的论文描述中对此进行了讨论。
彼得森的解决方案,彼得森,GL;“关于互斥问题的神话”,Inf。程序 来吧 ,1981年12月(3):115-116,这是专门设计的易于理解和推理的语言。最后,我的一个特别喜欢的人是莱斯利的兰珀特;“快速互斥算法”,ACM Trans。比较 Sys。,5(1):1-11,1987。在本文中,Lamport试图优化针对(常见)关键部分没有争用的互斥问题的解决方案。它保证相互排斥和僵局自由,但不保证公平。(我相信)这是第一个仅使用普通读写的互斥算法,可以在没有争用的情况下在O(1)时间内同步N个处理器。(发生争用时,它会退回到O(N)测试中。)他非正式地演示了在无争用的情况下,您能做的最好的事情是七个内存访问。(Dekker和Peterson都使用4,但是它们只能处理2个处理器,将其算法扩展到N时,它们必须添加额外的O(N)访问。)
显然,仅使用内存读写来解决互斥问题的人会因为其他人(对问题及其解决方案的理解)的缺乏而感到沮丧。彼得森论文的题目(“关于互斥问题的神话”)和兰伯特在1991年发表的简短笔记证明了这一点。1991年,Comm ACM 34(1):110,“互斥问题已得到解决”,Lamport在其主页上有些痛苦地描述。
因此,回答第二个问题:否。关键部分问题的硬件级别解决方案不止三类(仅使用加载和存储是一种,其他涉及比较和交换指令,加载链接/存储条件的)指令(使用缓存一致性协议测试原子性)和获取和添加指令。)从另一种意义上说,实际上只有一类解决方案:涉及使大量异步进程就事件的全局顺序达成一致的解决方案。
(请注意,此答案是(我对一个完全不同的问题给出的)先前答案的(广泛的)编辑。)