杂谈:内核同步的机制

本文深入探讨了内核同步的基本概念,如临界区、竞争条件和数据不一致性,并介绍了实现同步的各种方法,包括原子操作、自旋锁、读写自旋锁、信号量、互斥体和完成变量等。此外,还提到了内核中的禁止抢占和内存屏障等机制,以确保原子性、有序性和可见性。
摘要由CSDN通过智能技术生成

一、关于同步理论的一些基本概念

  • 临界区:访问或操作共享数据的代码段,比如synchronize大括号中的部分
  • 竞争条件:两个线程同时拥有临界区的执行权
  • 数据不一致:data unconsistency 由竞争条件引起的数据破坏
  • 同步:避免 race conditions
  • 锁:完成同步的手段,上锁解锁必须具备原子性
  • 原子性:要么全部发生,要么不发生,像原子一样不可分割
  • 有序性:禁止指令重排序
  • 可见性:一个线程内的修改,另一个线程可见

二、内核同步的常用方法(保证原子性、有序性、可见性)

  1. 原子操作——内核中类似于AtomicXXX,位于linux/types.h
  2. 自旋锁——内核中通过汇编语言支持CAS,位于asm/spinlock.h
  3. 读、写自旋——类似于ReadWriteLock,可同时读,只能一个写,读的时候是共享锁、写的时候是排他锁
  4. 信号量:类似于Semaphore。重量级锁,线程会进入wait,适合长时间持有锁情况
  5. 读写信号量:多个写,可分段写,实际比较少用。(分段锁)
  6. 互斥体(mutex):特殊的信号量(二值信号量)
  7. 完成变量——特殊的信号量(A发送型号给B,B等待在完成变量上),vfork()在子进程结束是通过完成变量叫醒父进程,类似于( CountDownLatch)
  8. BKL:大内核锁(早期,现在已经不用了)
  9. 禁止抢占——preempt_disable()
  10. 内存屏障
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值