Lock

乐观与悲观

Q1: 乐观锁和悲观锁的优缺点以及适用场景是什么?操作系统中有哪些场景使用了乐观锁或者悲观锁?


自旋与互斥

Q2: 什么是自旋锁?自旋锁相比于互斥锁的优缺点?操作系统中有哪些地方使用了自旋锁?

ghostrace

自旋锁定义: 自旋锁是一种非阻塞锁,当线程尝试获取锁失败时不会进入阻塞队列等待,而是持续“自旋”(轮询),直到获取锁成功。

优缺点


可重入锁

Q3: 什么是可重入锁?在多线程编程中的作用是什么?操作系统中是否支持类似机制?

可重入锁定义: 可重入锁是一种允许同一个线程多次获取的锁,即一个线程在持有锁的情况下可以重复获取而不会导致死锁。内部通过计数器记录锁的获取和释放次数。

作用

操作系统中的可重入机制


分布式锁

Q4: 分布式锁在什么情况下会出现问题?如何解决这些问题?

解决方案


信号量

Q5: 什么是信号量?与互斥锁的主要区别是什么?可以举例说明吗?

信号量: 信号量(Semaphore)是一种计数器,用于管理对共享资源的访问权限。它允许多个线程同时访问固定数量的资源。

互斥锁对比信号量

关键区别

操作系统中的应用


自旋锁性能陷阱+NUMA+MCS锁+qspinlock

Q6: 自旋锁的使用中如何避免性能陷阱?在 NUMA 架构(非一致性内存访问)中它会带来什么影响?

性能陷阱

在自旋锁中,线程会不断占用 CPU 流水线进行轮询等待,这可能导致:

性能优化方法

NUMA 架构中的问题

 

MCS

MCS锁(Mellor-Crummey Scott Lock)是一种基于队列的公平自旋锁。它的核心理念是:

假设线程T1\T2\T3按顺序请求锁

 

QSpinLock

QSpinlock是Linux内核中使用的高效队列自旋锁。它结合了票据锁和MCS锁的优点:

QSpinlock的关键优化是pending位,用于处理低竞争场景:

 

 


Q7: 什么是读写锁的“饥饿”问题?如何设计避免线程饥饿的公平读写锁?

饥饿问题

 

避免饥饿的公平读写锁设计

操作系统中的实际应用

 

 


分布式锁一致性、Paxos、Raft

Q8: 分布式锁的实现中为什么要保证多副本写一致性?如果网络分区这种极端情况发生,如何继续保证锁的一致性?

 

多副本写一致性的意义

分布式锁需要保证强一致性,如果多副本状态不一致,可能导致以下问题:

 

一致性模型的选择

常用的一致性模型:Etcd、ZooKeeper。

最终一致性:如 Dynamo-based 系统,在特定场景下可能引入不一致风险。

 

保证锁的一致性方法:

 

Q: 什么是分布式共识?

A: 在一个由多个节点组成的分布式系统中,共识算法需要确保:(1) 一致性:所有非故障节点最终就某个值达成一致 (2) 终止性:算法最终能产生结果 (3) 合法性:输出的值必须是某个节点提议的值

Paxos 算法详解

基本角色:

核心流程:两阶段提交

 

Raft算法详解

Raft 将共识问题分解为三个子问题:(1)领导者选举:选出一个Leader (2)日志复制:Leader复制日志到其他节点 (3)安全性:确保系统一致性

Raft 通过五个规则保证安全性:

 

网络分区时的一致性方案

脑裂问题:在分布式锁网络分区时,不同分区可能产生多个活动主节点(Leader),导致多个线程之间的锁失效。

解决方案

 


MCS锁和CLH锁

Q9: 请比较 MCS 锁和 CLH 锁,分别适用于什么场景?操作系统中的应用是什么?

特性MCS 锁CLH 锁
队列结构显式队列节点隐式队列
锁状态存储本地变量前驱节点变量
CPU 缓存一致性优化
高并发支持
空间复杂度O(n)(每个线程独立变量)O(1)(节点少)

适用场景

操作系统中的应用

 


RDMA分布式锁

Q10: 在 RDMA 环境中,如何实现高效的分布式锁?能够简述其实现原理和挑战吗?

常见实现模式:

  1. Centralized Lock Server(集中式锁服务)

    • 由一个锁服务器维护锁状态,所有客户端通过 RDMA 读取和更新锁。

    • 实现:

      • 锁状态存储在锁服务器的内存中。

      • 客户端通过 RDMA COMPARE_AND_WRITE 操作远程修改锁状态。

    • 优点:

      • 逻辑简单。

      • 高性能(RDMA 的低延迟)。

    • 缺点:

      • 单点瓶颈(可能导致锁服务器负载过大)。

  2. Distributed Ownership(分布式所有权)

    • 将锁分布在多台机器上,每个锁由单个节点初始化。

    • 实现:

      • 每台服务器维护一部分锁状态。

      • 客户端通过 RDMA 请求对应锁所在节点尝试锁获取。

    • 优点:

      • 锁状态分散,减少了集中瓶颈。

    • 缺点:

      • 锁的分布管理增加了复杂性。

 

RDMA 实现分布式锁的挑战:

 

 


RDMA锁的比较

Q11: 请描述两种基于 RDMA 的锁实现:基于原子性操作的(e.g., CAS)锁与基于队列锁的分布式锁各自的优缺点?

在 RDMA 中,分布式锁实现主要分为两类:基于原子操作(CAS-based Lock)**基于队列锁(Queue-based Lock)

基于原子操作的锁(CAS-based Lock):

 

基于队列的锁(Queue-based Lock)

实现原理:

 


RDMA ABA

Q12: 在 RDMA 中如何避免锁等待队列的翻转问题(如 ABA 问题)?实际应用中有哪些解决方案?

锁队列翻转问题(ABA 问题):

常见解决方案:

  1. 加版本号解决 ABA 问题:

    • 在锁变量中引入版本号。

    • 例如,锁存储为 64 位,低 32 位存储锁标志,高 32 位存储版本号:

      • 修改操作(CAS)时,必须同时更新版本号。

    • 基于乐观锁和 CAS 双重检查:

      • 在获取锁之前,线程先读取一次检查锁状态,并在执行操作时再次验证状态是否一致。

      • 这种方式结合了乐观锁和 CAS 的优点。

    • 使用内存屏障提高一致性:

      • 在锁状态更新之后,确保发布内存屏障(Memory Barrier),阻止重排序错误。

    • 使用分布式事务或 Raft 算法: 如果锁的状态较复杂,可以整合分布式事务或共识算法(如 Raft)更新队列状态。

 


RDMA分布式锁设计因素

Q13: 假设你需要在 RDMA 环境下实现一个高并发的分布式锁服务,你会如何衡量性能?有哪些关键指标?