spin_lock & mutex_lock的差别?

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)相互排斥量的加锁和解锁必须由同一线程分别相应使用,信号量能够由一个线程释放,还有一个线程得到
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119264.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月13日 下午12:00
下一篇 2021年11月13日 下午12:00


相关推荐

  • apache 负载均衡策略_dubbo有哪几种负载均衡策略

    apache 负载均衡策略_dubbo有哪几种负载均衡策略将Apache作为LoadBalance前置机分别有三种不同的部署方式,分别是:1)轮询均衡策略的配置进入Apache的conf目录,打开httpd.conf文件,在文件的末尾加入:ProxyPass/balancer://proxy/        #注意这里以”/”结尾balancer://proxy>        BalancerMemberhttp:

    2022年10月10日
    3
  • postgresql 索引类型[通俗易懂]

    postgresql 索引类型[通俗易懂]postgresql提供了B-tree,R-tree,GiST和hash索引类型。不同的索引类型适合特定的查询类型。绝大多数数据库都支持B-tree索引类型,postgresql默认的createindex语句也是创建B-tree索引。 R-tree:R树是一种用于处理多维数据的数据结构,用来访问二维或者更高维区域对象组成的空间数据.R树是一棵平衡树。树上有两类结点:叶子结点和非

    2022年5月25日
    139
  • lock的用法_try block

    lock的用法_try blocktryLock有两个重载的方法,分别如下:booleantryLock();booleantryLock(longtime,TimeUnitunit)throwsInterruptedException;tryLock()会立马返回一个布尔值,如果获得了锁就返回false;如果没有获得锁就返回true。无论是返回true还是false,都会继续执行之后的代码。tryLock(longtime,TimeUnitunit)会等待指定的时间,如果时间到了还没获得锁就返

    2022年10月15日
    4
  • java数组返回元素位置_把返回值用数组形式返回java

    java数组返回元素位置_把返回值用数组形式返回javaimportjava.util.Scanner;importjavax.xml.soap.SAAJResult;/***@author大杨*@date2019年8月13日下午3:10:52*/publicclassLinearArray{publicstaticvoidmain(String[]args){Scannerinput=newScan…

    2025年12月10日
    7
  • IDEA热部署详解

    IDEA热部署详解IDEA 热部署 一 解析关键配置 本编博客转载自 因为自己在研究热部署 包括热部署那些文件 部署实现的包括那些操作 这一块 所以这篇好博客 http www mamicode com info detail 1699044 html 一 war 和 exploed 区别 OnUpateActio 与 OnFrameDeact nbsp 这两个选项的设置 依赖

    2026年3月17日
    2
  • Windows系统查看CUDA版本号

    Windows系统查看CUDA版本号问题:之前安装了CUDA,但不知道是哪个版本了?也不知道安装到哪了?解决方法:1.打开控制面板在按住Win键的情况下,按R键,呼唤运行栏。在运行框中输入control,如下图所示:2.进入NVIDIA控制面板3.查看系统信息验证:找到之前的安装目录确定了确实是10.1版本…

    2022年5月28日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号