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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis 主从复制

    Redis 主从复制大家好,我是小林哥。又来图解Redis啦。我在前两篇已经给大家图解了AOF和RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失)。不过,由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:如果服务器发生了宕机,由于数据恢复是需要点时间,那么这个期间是无法服务新的请求的;如果这台服务器的硬盘出现了故障,可能数据就都丢失了。要避免这种单点故障,最好的办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服

    2022年8月13日
    4
  • 5G/NR SSB学习总结[通俗易懂]

    5G/NR SSB学习总结[通俗易懂]6.1SSB概念同步信号和PBCH块(SynchronizationSignalandPBCHblock,简称SSB),它由主同步信号(PrimarySynchronizationSignals,简称PSS)、辅同步信号(SecondarySynchronizationSignals,简称SSS)、PBCH三部分共同组成。6.2SSB特征…

    2022年6月30日
    37
  • linux中安装pycharm_ubuntu激活成功教程pycharm

    linux中安装pycharm_ubuntu激活成功教程pycharm前言由于学习需要,准备开始在linux环境下使用python。一开始是使用了vim作为编译器的,我承认vim确实很简洁,然而对于我这种新手来说确实是很低效,一开始用vim写代码真的是让我重新体会了一遍VC手撸C语言的感觉,而且面对了还是tf这种函数巨多的库。因此还是转去用了pycharm,可能我注定和大神无缘吧,逼格都提升不到。这篇文章主要介绍linux下的安装、环境配置和学生优惠。安装…

    2022年8月28日
    5
  • boot连接不上mysql数据库_关于springboot 连接mysql 数据库报错问题

    boot连接不上mysql数据库_关于springboot 连接mysql 数据库报错问题springboot连接MySQL运行报错:Theservertimezonevalue’Öйú±ê׼ʱ¼ä’isunrecognizedorrepresentsmorethanonetimezone.YoumustconfigureeithertheserverorJDBCdriver(viatheserverTimezoneconfi…

    2022年6月25日
    24
  • pytest报错_git撤销本地提交

    pytest报错_git撤销本地提交前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

    2022年7月31日
    7
  • main方法详解

    main方法详解学习Java有一段时间了,一直没用过博客来写写自己在学习过程中遇到的问题和学习心得,看到别人在诸如博客这样的社区写一些总结觉得挺好的。索性,今天开始自己也用起博客记录学习。一来呢,能更好的总结学习知识。二来,有问题更有机会让别人指出,对自己学习也很有帮助。话不多说,就以main方法详解开始今天的主题吧。      为了表述方便,我先把mian方法写出来:publicclassDemo

    2022年5月31日
    53

发表回复

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

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