面试官让你讲讲Linux内核的竞争与并发,你该如何回答?( 四 )
信号量信号量简介??信号量和自旋锁有些相似 , 不同的是信号量会发出一个信号告诉你还需要等多久 。 因此 , 不会出现傻傻等待的情况 。 比如 , 有100个停车位的停车场 , 门口电子显示屏上实时更新的停车数量就是一个信号量 。 这个停车的数量就是一个信号量 , 他告诉我们是否可以停车进去 。 当有车开进去 , 信号量加一 , 当有车开出来 , 信号量减一 。??比如 , 厕所一次只能让一个人进去 , 当A在里面的时候 , B想进去 , 如果是自旋锁 , 那么B就会一直在门口傻傻等待 。 如果是信号量 , A就会给B一个信号 , 你先回去吧 , 我出来了叫你 。 这就是一个信号量的例子 , B听到A发出的信号后 , 可以先回去睡觉 , 等待A出来 。??因此 , 信号量显然可以提高系统的执行效率 , 避免了许多无用功 。 信号量具有以下特点:
- 因为信号量可以使等待资源线程进入休眠状态 , 因此适用于那些占用资源比较久的场合 。
- 因此信号量不能用于中断中 , 因为信号量会引起休眠 , 中断不能休眠 。
- 如果共享资源的持有时间比较短 , 那就不适合使用信号量了 , 因为频繁的休眠、切换线程引起的开销要远大于信号量带来的那点优势 。
文章插图
信号量例程
struct semaphore sem; /* 定义信号量 */ sema_init( /* 申请信号量 *//* 临界区 */up( /* 释放信号量 */
互斥体互斥体简介??互斥体表示一次只有一个线程访问共享资源 , 不可以递归申请互斥体 。??信号量也可以用于互斥体 , 当信号量用于互斥时(即避免多个进程同时在一个临界区中运行) , 信号量的值应初始化为1.这种信号量在任何给定时刻只能由单个进程或线程拥有 。 在这种使用模式下 , 一个信号量有时也称为一个“互斥体( mutex)” , 它是互斥( mutual exclusion)的简称 。 Linux内核中几平所有的信号量均用于互斥 。互斥体操作函数
文章插图
互斥体例程
struct mutex lock; /* 定义一个互斥体 */ mutex_init( /* 初始化互斥体 */ mutex_lock( /* 上锁 */ /* 临界区 */mutex_unlock( /* 解锁*/
互斥体与自旋锁【面试官让你讲讲Linux内核的竞争与并发,你该如何回答?】??互斥体和自旋锁都是解决互斥问题的一种手段 。 互斥体是进程级别的 , 互斥体在使用的时候会发生进程间的切换 , 因此 , 使用互斥体资源开销比较大 。 自旋锁可以节省上下文切换的时间 , 如果持有锁的时间不长 , 使用自旋锁是比较好的选择 , 如果持有锁时间比较长 , 互斥体显然是更好的选择 。互斥体使用注意事项
- 当锁不能被获取到时 , 使用互斥体的开销是进程上下文切换时间 , 使用自旋锁的开销是等待获取自旋锁(由临界区执行时间决定) 。 若临界区比较小 , 宜使用自旋锁 , 若临界区很大 , 应使用互斥体 。
- 互斥体所保护的临界区可包含可能引起阻塞的代码 , 而自旋锁则绝对要避免用来保护包含这样代码的临界区 。 因为阻塞意味着要进行进程的切换 , 如果进程被切换岀去后 , 另一个进程企图获取本自旋锁 , 死锁就会发生 。
推荐阅读
- 120Hz高刷+300Hz触控报点 iQOO 7让你尽享丝滑
- 微信还能这么用?让你大开眼界的微信隐藏操作
- 智能水表Pleco将亮相CES:让你全面掌控家庭用水情况
- Honk:让你聊天时不用等待对方回应了
- 千元SKG颈椎按摩仪来了!“九指神器”让你放松
- 牙刷|用电动牙刷的原因有很多,你是什么原因?
- 心灵上的垃圾也需要清理,这六条能不能帮到你,让你不再浮躁
- 功率|充电器太多让你心烦?倍思帮你解决这些烦恼
- 性能还是相机?这四款四千元价位的手机让你两者兼得
- 性能、拍照超“能打”的一加8T 让你把钱全都花在刀刃上