在Linux中,lock(锁)是一种用于多任务、多线程或多进程环境中的同步机制,其核心目的是保证对共享资源(如内存、文件、设备等)的独占访问,防止因并发操作导致的数据竞争(Race Condition)或数据不一致问题。

Linux系统中的锁主要分为以下几类:
| 锁类型 | 适用场景 | 特点 |
|---|---|---|
| 文件锁(File Lock) | 进程间文件访问同步 | 支持建议性锁(Advisory)和强制性锁(Mandatory),通过fcntl()或flock()系统调用实现 |
| 互斥锁(Mutex) | 线程间共享资源保护 | 阻塞型锁,通过pthread_mutex实现,避免忙等待 |
| 自旋锁(Spinlock) | 内核短临界区保护 | 忙等待锁,适用于持有时间极短的场景 |
| 读写锁(RW Lock) | 读写分离场景 | 允许多个读操作并行,写操作独占 |
Linux的锁机制根据作用域可分为两类:
1. 内核空间锁:用于保护内核数据结构的并发安全(如自旋锁、信号量)。
2. 用户空间锁:用户态程序通过POSIX线程库(pthread)实现的锁(如互斥锁、条件变量)。
| 模式 | 技术实现 | 生效条件 |
|---|---|---|
| 建议性锁(Advisory) | fcntl(F_SETLK) / flock(LOCK_EX) | 依赖进程主动检查锁状态 |
| 强制性锁(Mandatory) | mount -o mand + fcntl(F_SETLEASE) | 内核强制拦截违规访问 |
- 文件锁:flock()、fcntl()
- 线程锁:pthread_mutex_lock()、pthread_rwlock_wrlock()
- 信号量:sem_wait()(POSIX信号量)
- 死锁风险:需避免循环等待(如A等B,B等A)
- 粒度控制:过细的锁会增加开销,过粗的锁会降低并发性
- 优先级反转:高优先级进程可能被低优先级进程持有的锁阻塞
扩展:Linux还提供了锁调试工具如lslocks(查看系统当前锁状态)和valgrind --tool=helgrind(检测线程锁错误)。同时在分布式场景下,会使用基于网络的锁服务(如Redis分布式锁)。

查看详情

查看详情