多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理。

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相关推荐

  1. spin_lock amp; mutex_lock的差别?

    本文由该问题引入到内核锁的讨论,归纳例如以下 为什么须要内核锁? 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是能够訪问全部内核数据的,因此要对共享数据进行保护,即相互排斥处理 有 ...

  2. Linux那些事儿 之 戏说USB(31)驱动的生命线(三)

    准备工作该做的都做了,别嫌太麻烦,什么事情都要经过这么一个阶段,大家都明白.现在看看第二阶段的重头戏,看看设备是怎么从Address进入Configured的.1501行,如果已经在Configure ...

  3. Linux那些事儿 之 戏说USB(30)驱动的生命线(二)

    core配置设备使用的是message.c里的usb_set_configuration函数 int usb_set_configuration(struct usb_device *dev, int ...

  4. Linux那些事儿 之 戏说USB(25)设备的生命线(八)

    回到struct usb_hcd,继续努力的往下看. 7行,又见kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看drivers/usb/core/hcd ...

  5. 学习《Linux设备模型浅析之设备篇》笔记(三)

    文件/drivers/base/core.c static struct kobject *get_device_parent(struct device *dev, struct device *p ...

  6. 学习《Linux设备模型浅析之设备篇》笔记(二)

    文件/drivers/base/platform.c int __init platform_bus_init(void) {         int error; early_platform_cl ...

  7. kernfs_link_sibling

    文件/fs/kernfs/dir.c /**  * kernfs_link_sibling - 链接kernfs_node到sibling rbtree(兄弟红黑树)上  * @kn: kernfs_ ...

  8. kernfs_addrm_start kernfs_add_one

    linux内核版本3.14.3 文件/fs/kernfs/dir.c /**  * kernfs_addrm_start - 为kernfs_node添加/删除准备  * @acxt: 指向要使用的k ...

  9. linux设备:初始化

    本文转载自 http://blog.china unix.net/uid-24631445-id-3419097.html 不过本人在此将源码修改为3.14.3的源码了 当按下开机键后,电脑经过自检, ...

最新文章

  1. Oracle 原理: 物化视图,快照,实体化视图。
  2. android 权限管理框架,Android 运行时权限管理最佳实践
  3. 学习Winform了解到switch和if-else的妙处
  4. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(开发环境介绍)
  5. mysql 数据仓库 元数据_数据仓库中的元数据管理
  6. js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别
  7. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美
  8. 斩获VCR竞赛榜第一,腾讯微视推出BLENDer单模型,超越多模型最好效果
  9. python整数类型没有取值范围限制_python综述(一),复习
  10. android9三星功能,三星开启安卓9.0测试:One UI Beta计划
  11. android 罗盘陀螺仪,电子罗盘有什么用,安卓智能手机的感应器的问题! 电子罗盘与陀螺仪有......
  12. 五分钟学会PowerDesigner创建概念数据模型
  13. Python [:] list slicing列表切片
  14. [Vuetify] Multiple instances of Vue detected
  15. 在工程图中如何进行虚拟相交点标注
  16. CodeCademy | Python | 6. Pyglatin
  17. Cubieboard2折腾手记(一)
  18. 在Visual Paradigm如何创建电路图?
  19. Java Swing事件处理——键盘事件及监听处理 KeyListener 按键测试
  20. 电脑录音,台式电脑如何录音_怎么电脑录音-win7之家

热门文章

  1. 深入探讨 Java 类加载器(一)
  2. 使用MFC里的类的方法
  3. Fov手术会不会在手术中新增手术边界
  4. kill不掉 spark-submit
  5. 修改win7编码为utf-8
  6. datagrip中运行sql语句
  7. leetcode刷题集:栈与队列
  8. Html爱情表白动画
  9. MySql---数据库笔记(功能齐全)
  10. 查看linux系统是32位还是64位