Reference:
spin_lock_bh()与spin_unlock_bh()
Linux内核自旋锁
Linux自旋锁
Spinlock - Wikipedia, the free encyclopedia

本文地址:https://segmentfault.com/a/1190000005354100


原理

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

与mutex的区别

Spinlock只进行虚幻检查,在内核中仍然允许抢占。
Mutex会立即引起调度,因而在一些中断处理函数中会出问题。

注意:
  由于是循环检查而已,因此临界区的大小应该限制,否则非常影响效率。
  选择自旋锁时,要注意考虑中断(软中断与硬中断;timer中断属于软中断)

函数和宏定义

头文件

#include <linux/spinlock.h>

静态初始化

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);

Linux内核自旋锁使用笔记相关推荐

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

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

  2. linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程

    本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法. 背景技术: linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁 ...

  3. Linux内核自旋锁

    Linux内核自旋锁 自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU ...

  4. linux内核自旋锁解释,LINUX内核笔记:自旋锁

    目录 1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自 ...

  5. Linux 内核自旋锁

    为什么需要内核自旋锁? 现在很多CPU都是几核几核的了,如果有一个变量A,CPU-X正在访问,突然CPU-Y也过来访问他,这时候就可能出现问题,因为这个A非常重要,可能导致系统崩溃,中断异常等. 我们 ...

  6. linux内核自旋锁API

    我们大概都了解,锁这种机制其实是为了保护临界区代码的,关于使用和定义,我总结的API如下: #include <linux/spinlock.h>定义自旋锁 spinlock_t lock ...

  7. linux内核 自旋锁示例,自旋锁(示例代码)

    一.什么是自旋锁 一直以为自旋锁也是用于多线程互斥的一种锁,原来不是! 自旋锁是专为防止多处理器并发(实现保护共享资源)而引入的一种锁机制.自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用 ...

  8. linux内核自旋锁的代码分析

    前面看操作系统导论这本书,其中锁的历史变化有点感悟,现在追一下linux内核锁的代码. 一.自旋锁 1.锁的结构体 系统自旋锁结构体如下: typedef struct spinlock {union ...

  9. Linux ARM平台开发系列讲解(自旋锁) 3.3.1 Linux内核自旋锁描述

    1. 概述 原子操作只能对整形变量或者位进行保护,但是,在实际的使用环境中怎么可能只有整形变量或位这么简单的临界区.举个最简单的例子,设备结构体变量就不是整型变量,我们对于结构体中成员变量的操作也要保 ...

最新文章

  1. 现代内存编号解读(转)
  2. 正则表达式基础(一)
  3. Eclipse中使用Git
  4. python交互式编程入门先学什么_为什么 Python 对于编程入门学习来说,是一门很棒的语言...
  5. sqlplus(数据泵)导入导出dmp实践使用
  6. php 增加mysql 索引,【PHP】为什么 MySQL 添加索引后就可以提高查询速度
  7. JavaScript 编程精解 中文第三版 七、项目:机器人
  8. WCF Ria Service“操作失败,指定的命名链接在配置中找不到”错误解决方法
  9. ati.c ATI顯卡開發源代碼
  10. js 获取浏览器 滚动的高度
  11. 操作系统介绍,为什么使用虚拟机,虚拟机使用原理透彻解释
  12. 打开ps显示计算机内存不足怎么办,如何解决PS内存不足的问题
  13. html botton定位的俩种方法
  14. CSRF与钓鱼链接攻击
  15. 基于 Selenium 掘金自动签到、抽奖的定时任务
  16. design pattern : Facade
  17. [ANT]apache ant 安装说明
  18. LATEX以及宏包的下载和安装(附下载链接)
  19. Virgo与Maven整合开发环境搭建(三)
  20. 全球首位数字航天员“小诤”亮相中国空间站;湖南三安半导体产业园项目投产 | 全球TMT...

热门文章

  1. 图像偏色检测算法,速度快,效果好,共享给大家。
  2. 润乾报表新功能静态页面和report4包分离
  3. 牛客第七场 Sudoku Subrectangles
  4. Github上如何在组织中创建代码仓库,并如何授予该组织中某个小组权限?
  5. CCommandLineInfo类
  6. mysql主从复制实战
  7. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
  8. 标准C++中string类用法总结
  9. apache 启动故障(httpd: apr_sockaddr_info_get() failed fo)
  10. vue+elementUI项目的踩坑~~持续更新