zoukankan      html  css  js  c++  java
  • spin_lock & mutex_lock的差别?

    本文由该问题引入到内核锁的讨论,归纳例如以下

    为什么须要内核锁?
    多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是能够訪问全部内核数据的,因此要对共享数据进行保护,即相互排斥处理

    有哪些内核锁机制?
    (1)原子操作
    atomic_t数据类型,atomic_inc(atomic_t *v)将v加1
    原子操作比普通操作效率要低,因此必要时才使用,且不能与普通操作混合使用
    假设是单核处理器,则原子操作与普通操作同样
    (2)自旋锁
    spinlock_t数据类型,spin_lock(&lock)和spin_unlock(&lock)是加锁和解锁
    等待解锁的进程将重复检查锁是否释放,而不会进入睡眠状态(忙等待),所以经常使用于短期保护某段代码
    同一时候,持有自旋锁的进程也不同意睡眠,不然会造成死锁——由于睡眠可能造成持有锁的进程被又一次调度,而再次申请自己已持有的锁
    假设是单核处理器,则自旋锁定义为空操作,由于简单的关闭中断就可以实现相互排斥
    (3)信号量与相互排斥量
    struct semaphore数据类型,down(struct semaphore * sem)和up(struct semaphore * sem)是占用和释放
    struct mutex数据类型,mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加锁和解锁
    竞争信号量与相互排斥量时须要进行进程睡眠和唤醒,代价较高,所以不适于短期代码保护,适用于保护较长的临界区
    相互排斥量与信号量的差别?(转载但找不到原文出处)
    (1)相互排斥量用于线程的相互排斥,信号线用于线程的同步
    这是相互排斥量和信号量的根本差别,也就是相互排斥和同步之间的差别
    相互排斥:是指某一资源同一时候仅仅同意一个訪问者对其进行訪问,具有唯一性和排它性。但相互排斥无法限制訪问者对资源的訪问顺序,即訪问是无序的
    同步:是指在相互排斥的基础上(大多数情况),通过其他机制实现訪问者对资源的有序訪问。在大多数情况下,同步已经实现了相互排斥,特别是全部写入资源的情况必然是相互排斥的。少数情况是指能够同意多个訪问者同一时候訪问资源
    (2)相互排斥量值仅仅能为0/1,信号量值能够为非负整数
    也就是说,一个相互排斥量仅仅能用于一个资源的相互排斥訪问,它不能实现多个资源的多线程相互排斥问题。信号量能够实现多个同类资源的多线程相互排斥和同步。当信号量为单值信号量是,也能够完毕一个资源的相互排斥訪问
    (3)相互排斥量的加锁和解锁必须由同一线程分别相应使用,信号量能够由一个线程释放,还有一个线程得到
  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4171529.html
Copyright © 2011-2022 走看看