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)相互排斥量的加锁和解锁必须由同一线程分别相应使用,信号量能够由一个线程释放,还有一个线程得到

时间: 2024-10-08 10:44:26

spin_lock & mutex_lock的差别?的相关文章

关于linux的几道题,你能回答几个?--回答1~13题

1.memcmp可否用来比较结构体?strcmp和memcpy的区别? 参考:http://www.cnblogs.com/cxz2009/archive/2010/11/11/1875125.html [email protected]:/study/linuxknowledge# cat memcmptest.c #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unist

spin_lock &amp; mutex_lock的区别? .

为什么需要内核锁? 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理   有哪些内核锁机制? (1)原子操作 atomic_t数据类型,atomic_inc(atomic_t *v)将v加1 原子操作比普通操作效率要低,因此必要时才使用,且不能与普通操作混合使用 如果是单核处理器,则原子操作与普通操作相同 (2)自旋锁 spinlock_t数据类型,spin_lock(&lock)和spin_unlock(&lo

Linux内核spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

转自:http://blog.csdn.net/wh_19910525/article/details/11536279 在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆.首先看一下代码是如何实现的. spin_lock的调用关系 spin_lock  ----->  raw_spin_lock 1 static inline void __raw_spin_lock(raw_spinlock_t *lock) 2 { 3 preempt_dis

spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】

转自:http://blog.csdn.net/luckywang1103/article/details/42083613 void spin_lock(spinlock_t *lock); void spin_lock_irq(spinlock_t *lock); void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); 1.spin_lock与spin_lock_irq区别 在Linux内核中何时使用spin_lock,何

spin_lock、spin_lock_irq、spin_lock_irqsave区别

void spin_lock(spinlock_t *lock); void spin_lock_irq(spinlock_t *lock); void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); 1.spin_lock与spin_lock_irq区别 在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆.首先看一下代码是如何实现的. spin_lock的调用关系 spin_lo

清华校长陈吉宁最新演讲:平庸与卓越的差别

本文是清华大学陈吉宁校长于在 2015 年第一次研究生毕业典礼暨学位授予仪式上的讲话,原文标题:选择与坚持.演讲非常精彩,值得您细细阅读. 亲爱的同学们: 今天,共有 1318 名同学获得博士.硕士学位.首先,我代表学校,向同学们奋力拼搏完成学业表示祝贺!同时,向悉心指导你们的老师.辛勤培育你们的家人和一路支持你们的亲友,致以诚挚的敬意和衷心的感谢! 最近我一直在思考,在今天这个场合,给大家讲点什么.大家知道,在过去几次毕业典礼上,我曾经讲过理想.担当.良知.敬畏等这样一些关于价值信念的话题,勉

offsetTop和scrollTop的差别

近期想写个组件,结果被这两个属性搞的有点晕,查了下文档和资料,对这两个属性总结例如以下: 一直以来对offsetLeft,offsetTop,scrollLeft,scrollTop这几个方法非常迷糊,花了一天的时间好好的学习了一下.得出了下面的结果:1.offsetTop     :当前对象到其上级层顶部的距离.不能对其进行赋值.设置对象到页面顶部的距离请用style.top属性. 2.offsetLeft    :当前对象到其上级层左边的距离.不能对其进行赋值.设置对象到页面左部的距离请用s

JAVA与C++,C与C++的差别

首先来分析JAVA与C++的差别: JAVA是纯面向对象的语言,而C++是基于面向对象过程的语言. JAVA有着垃圾回收机制.它的语法是C++的子集,即JAVA有的C++都有.而C++有的JAVA不全有. JAVA也分内置类型和自己定义类型.在局部开辟空间,赋值之后才干使用.JAVA的类型都视为对象.无运算符.无自增自减操作,把运算符当作函数 JAVA还有垃圾回收机制.反射机制. 接着分析C与C++差别: C仅有成员变量,没有方法之说:而C++有自己的成员变量和成员函数: 后者有引用,函数重载.

多进程与多线程差别

 在Unix上编程採用多线程还是多进程的争执由来已久,这样的争执最常见到在C/S通讯中服务端并发技术 的选型上,比方WEBserver技术中.Apache是採用多进程的(perfork模式,每客户连接相应一个进程,每进程中仅仅存在唯一一个运行线程), Java的Web容器Tomcat.Websphere等都是多线程的(每客户连接相应一个线程,全部线程都在一个进程中). 从Unix发展历史看,伴随着Unix的诞生进程就出现了.而线程非常晚才被系统支持,比如Linux直到内核2.6.才支持符合P