php 自旋锁,Linux内核自旋锁使用笔记

自旋锁(Spinlock)是Linux内核中一种用于保护临界区的同步机制。它通过不断循环检查锁的状态来获取锁,与Mutex相比,自旋锁不会引起调度,因此在中断处理中更适用。自旋锁适用于临界区小且持有时间短的情况,长时间持有会导致CPU资源浪费。本文介绍了自旋锁的初始化、判断锁状态、获取与释放锁的函数,以及不同类型的中断处理中如何使用自旋锁。
摘要由CSDN通过智能技术生成

原理

首先,spinlock是一把锁,它的功能与其他锁的作用类似,都是对用于临界区进行原子读写。使用这把锁时,原理上就是不停的循环检查锁的状态,直到可用的时候进入临界区。

与mutex的区别

Spinlock只进行虚幻检查,在内核中仍然允许抢占。

Mutex会立即引起调度,因而在一些中断处理函数中会出问题。

注意:

由于是循环检查而已,因此临界区的大小应该限制,否则非常影响效率。

选择自旋锁时,要注意考虑中断(软中断与硬中断;timer中断属于软中断)

函数和宏定义

头文件

#include

静态初始化

spinlock_t a_lock = SPIN_LOCK_UNLOCKED;

宏定义和函数

动态初始化:

spin_lock_init(&a_lock);

判断自旋锁是否上锁:

spin_is_locked(&a_lock);

等待直到spinlock解锁

spin_unlock_wait(&a_lock);

进入和退出临界区

spin_lock(&a_lock);

spin_unlock(&a_lock);

保存状态寄存器值地进入和退出临界区

int flags;

spin_lock_irqsave(&a_lock, flags);

spin_unlock_irqrestore(&a_lock, flags);

屏蔽硬件中断地进入和退出临界区

spin_lock_irq(&a_lock);

spin_unlock_irq(&a_lock);

屏蔽底半部中断地进入和退出临界区

spin_lock_bh(&a_lock);

spin_unlock_bh(&a_lock);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值