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

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

http://blog.csdn.net/sunnytina/article/details/7615520
 
为什么需要内核锁?
多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理
有哪些内核锁机制?
(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)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到
你可能感兴趣的文章
组策略--受限制的组
查看>>
SQL Server数据库快照的工作方式
查看>>
解决Android版Firefox字体显示过大的问题
查看>>
[Command] alias - 别名
查看>>
Fedora 10编程开发工具
查看>>
paip..禁用mmseg 的默认词库. . 仅仅使用自定义词库from数据库.
查看>>
C# 仿金山毒霸启动和关闭淡入淡出效果
查看>>
[转载][Groovy] Groovy与Java的区别(一)
查看>>
使用mysqladmin ext了解MySQL运行状态【转】
查看>>
使用Bootstrap3和Ladda UI实现的多种按钮“加载中”效果体验
查看>>
[译]MVC网站教程(三):动态布局和站点管理
查看>>
CSS侧边栏宽度不动(更改页面宽度时),内容区宽度自适应
查看>>
传统媒体:广告都去哪儿了?
查看>>
排列生成算法注意事项
查看>>
Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
查看>>
那些最好的轮子 - PHP篇
查看>>
采用Unity快速开发高质量游戏的若干优化建议
查看>>
10 001st prime number
查看>>
C#-MessageBox全部函数重载形式及举例
查看>>
滑板控制器
查看>>