gcsfuse中的锁与偏序理论是什么关系?
摘要:gcsfuse中的锁与偏序理论 一、偏序(Partial Order)理论详解 1.1 什么是偏序关系 在数学中,一个集合 (S) 上的偏序关系 (leq) 是满足以下三个性质的二元关系: 性质 定义 说明 自反性 (forall a
gcsfuse中的锁与偏序理论
一、偏序(Partial Order)理论详解
1.1 什么是偏序关系
在数学中,一个集合 (S) 上的偏序关系 (\leq) 是满足以下三个性质的二元关系:
性质
定义
说明
自反性
(\forall a \in S: a \leq a)
每个元素与自身有关系
反对称性
(a \leq b \wedge b \leq a \Rightarrow a = b)
互相"小于等于"的两元素必相等
传递性
(a \leq b \wedge b \leq c \Rightarrow a \leq c)
关系可以传递
偏序关系与全序(total order)的区别是:偏序中不要求任意两个元素都可以比较。也就是说,可能存在元素 (a, b) 使得 (a \not\leq b) 且 (b \not\leq a)(即 (a) 和 (b) 不可比较)。
1.2 严格偏序(Strict Partial Order)
本工程中使用的是严格偏序 (<),它满足:
性质
定义
反自反性
(\forall a: \neg(a < a))(没有元素小于自身)
反对称性
(a < b \Rightarrow \neg(b < a))
传递性
(a < b \wedge b < c \Rightarrow a < c)
1.3 偏序与死锁预防
在并发编程中,死锁的必要条件之一是循环等待:线程 A 持锁 L1 等待 L2,而线程 B 持锁 L2 等待 L1。
偏序可以消除循环等待的原因是:
如果所有锁上定义了一个严格偏序 (<);
且规则要求"已持有锁 A 的情况下,只能再获取满足 (A < B) 的锁 B";
那么由传递性,永远不可能形成锁的循环链。
非正式证明:假设存在死锁循环 (L_1 \to L_2 \to \cdots \to L_n \to L_1),则意味着 (L_1 < L_2 < \cdots < L_n < L_1),但由传递性得 (L_1 < L_1),这与反自反性矛盾。
关键的是,偏序不要求所有锁之间都可以比较——只要求那些可能被同一线程先后获取的锁之间有序即可。如果两个锁永远不会被同时持有,则它们可以是不可比较的(这正是偏序比全序更灵活的地方)。
