mutex_lock
多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理。
mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加锁和解锁。
(1)mutex和spin lock的区别和应用(sleep-waiting和busy-waiting的区别):
信号量mutex是sleep-waiting。 就是说当没有获得mutex时,会有上下文切换,将自己、加到忙等待队列中,直到另外一个线程释放mutex并唤醒它,而这时CPU是空闲的,可以调度别的任务处理。
(2)而自旋锁spin lock是busy-waiting。就是说当没有可用的锁时,就一直忙等待并不停的进行锁请求,直到得到这个锁为止。这个过程中cpu始终处于忙状态,不能做别的任务。
总结:
(1)Mutex适合对锁操作非常频繁的场景,并且具有更好的适应性。尽管相比spin lock它会花费更多的开销(主要是上下文切换),但是它能适合实际开发中复杂的应用场景,在保证一定性能的前提下提供更大的灵活度。
(2)spin lock的lock/unlock性能更好(花费更少的cpu指令),但是它只适应用于临界区运行时间很短的场景。而在实际软件开发中,除非程序员对自己的程序的锁操作行为非常的了解,否则使用spin lock不是一个好主意(通常一个多线程程序中对锁的操作有数以万次,如果失败的锁操作(contended lock requests)过多的话就会浪费很多的时间进行空等待)。
(3)更保险的方法或许是先(保守的)使用 Mutex,然后如果对性能还有进一步的需求,可以尝试使用spin lock进行调优。毕竟我们的程序不像Linux kernel那样对性能需求那么高(Linux Kernel最常用的锁操作是spin lock和rw lock)。
转载于:https://www.cnblogs.com/Caden-liu8888/p/7728951.html
mutex_lock相关推荐
- spin_lock amp; mutex_lock的差别?
本文由该问题引入到内核锁的讨论,归纳例如以下 为什么须要内核锁? 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是能够訪问全部内核数据的,因此要对共享数据进行保护,即相互排斥处理 有 ...
- Linux那些事儿 之 戏说USB(31)驱动的生命线(三)
准备工作该做的都做了,别嫌太麻烦,什么事情都要经过这么一个阶段,大家都明白.现在看看第二阶段的重头戏,看看设备是怎么从Address进入Configured的.1501行,如果已经在Configure ...
- Linux那些事儿 之 戏说USB(30)驱动的生命线(二)
core配置设备使用的是message.c里的usb_set_configuration函数 int usb_set_configuration(struct usb_device *dev, int ...
- Linux那些事儿 之 戏说USB(25)设备的生命线(八)
回到struct usb_hcd,继续努力的往下看. 7行,又见kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看drivers/usb/core/hcd ...
- 学习《Linux设备模型浅析之设备篇》笔记(三)
文件/drivers/base/core.c static struct kobject *get_device_parent(struct device *dev, struct device *p ...
- 学习《Linux设备模型浅析之设备篇》笔记(二)
文件/drivers/base/platform.c int __init platform_bus_init(void) { int error; early_platform_cl ...
- kernfs_link_sibling
文件/fs/kernfs/dir.c /** * kernfs_link_sibling - 链接kernfs_node到sibling rbtree(兄弟红黑树)上 * @kn: kernfs_ ...
- kernfs_addrm_start kernfs_add_one
linux内核版本3.14.3 文件/fs/kernfs/dir.c /** * kernfs_addrm_start - 为kernfs_node添加/删除准备 * @acxt: 指向要使用的k ...
- linux设备:初始化
本文转载自 http://blog.china unix.net/uid-24631445-id-3419097.html 不过本人在此将源码修改为3.14.3的源码了 当按下开机键后,电脑经过自检, ...
最新文章
- Oracle 原理: 物化视图,快照,实体化视图。
- android 权限管理框架,Android 运行时权限管理最佳实践
- 学习Winform了解到switch和if-else的妙处
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(开发环境介绍)
- mysql 数据仓库 元数据_数据仓库中的元数据管理
- js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别
- LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美
- 斩获VCR竞赛榜第一,腾讯微视推出BLENDer单模型,超越多模型最好效果
- python整数类型没有取值范围限制_python综述(一),复习
- android9三星功能,三星开启安卓9.0测试:One UI Beta计划
- android 罗盘陀螺仪,电子罗盘有什么用,安卓智能手机的感应器的问题! 电子罗盘与陀螺仪有......
- 五分钟学会PowerDesigner创建概念数据模型
- Python [:] list slicing列表切片
- [Vuetify] Multiple instances of Vue detected
- 在工程图中如何进行虚拟相交点标注
- CodeCademy | Python | 6. Pyglatin
- Cubieboard2折腾手记(一)
- 在Visual Paradigm如何创建电路图?
- Java Swing事件处理——键盘事件及监听处理 KeyListener 按键测试
- 电脑录音,台式电脑如何录音_怎么电脑录音-win7之家