博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spin_lock & mutex_lock的差别?
阅读量:5818 次
发布时间:2019-06-18

本文共 1113 字,大约阅读时间需要 3 分钟。

本文由该问题引入到内核锁的讨论,归纳例如以下
为什么须要内核锁?
多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是能够訪问全部内核数据的,因此要对共享数据进行保护,即相互排斥处理
有哪些内核锁机制?
(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)相互排斥量的加锁和解锁必须由同一线程分别相应使用,信号量能够由一个线程释放,还有一个线程得到
你可能感兴趣的文章
【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
查看>>
ExtTree学习笔记(转载)
查看>>
算法-快速排序
查看>>
sqlserver-触发器-判断更新了哪个字段。
查看>>
PowerShell 脚本中的密码
查看>>
Atitit.jquery 版本号新特性attilax总结
查看>>
Extjs4.10Model模型具体解释
查看>>
【Git】Git与GitHub 入门【转】
查看>>
url传递中文的解决方案
查看>>
dump_stack 实现分析【转】
查看>>
linux信号机制 - 用户堆栈和内核堆栈的变化【转】
查看>>
排序算法总结之插入排序
查看>>
支持断点续传的文件上传插件——Huploadify-V2.0来了
查看>>
译】SQL Server误区30日谈-Day4-DDL触发器就是INSTEAD OF触发器
查看>>
网站高并发及高并发架构详解
查看>>
setTimeout(0) 即将退役
查看>>
JS Web的Flex弹性盒子模型
查看>>
在PostgreSQL中,如何模拟Oracle的hint效果
查看>>
The specified child already has a parent错误
查看>>
SAP BW ODS无效字符自动处理程序
查看>>