【转】spin_lock、spin_lock_irq、spin_lock_irqsave区别

为什么80%的码农都做不了架构师?>>>   hot3.png

转自:http://blog.csdn.net/luckywang1103/article/details/42083613

void spin_lock(spinlock_t *lock);void spin_lock_irq(spinlock_t *lock);void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);

spin_lock与spin_lock_irq区别

在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。

spin_lock的调用关系

spin_lock |+ ----->  raw_spin_lock |+------>  _raw_spin_lock|+--------> __raw_spin_lock
static inline void __raw_spin_lock(raw_spinlock_t *lock)  
{  preempt_disable();  spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);  LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);  
}  

spin_lock_irq的调用关系

    spin_lock_irq|+-------> raw_spin_lock_irq|+---------> _raw_spin_lock_irq|+------------> __raw_spin_lock_irq
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)  
{  local_irq_disable();  preempt_disable();  spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);  LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);  
}  

可以看出来他们两者只有一个差别:是否调用local_irq_disable()函数, 即是否禁止本地中断。

在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢占。

spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。

举个例子:进程A中调用了spin_lock(&lock)然后进入临界区,此时来了一个中断(interrupt),

该中断也运行在和进程A相同的CPU上,并且在该中断处理程序中恰巧也会spin_lock(&lock)

试图获取同一个锁。由于是在同一个CPU上被中断,进程A会被设置为TASK_INTERRUPT状态,

中断处理程序无法获得锁,会不停的忙等,由于进程A被设置为中断状态,schedule()进程调度就

无法再调度进程A运行,这样就导致了死锁!

但是如果该中断处理程序运行在不同的CPU上就不会触发死锁。 因为在不同的CPU上出现中断不会导致

进程A的状态被设为TASK_INTERRUPT,只是换出。当中断处理程序忙等被换出后,进程A还是有机会

获得CPU,执行并退出临界区。

所以在使用spin_lock时要明确知道该锁不会在中断处理程序中使用。

spin_lock_irq与spin_lock_irqsave区别

spin_lock_irqsave在进入临界区前,保存当前中断寄存器flag状态,关中断,进入临界区,在退出临界区时,把保存的中断状态写回到中断寄存器。

spin_lock_irq在进入临界区前不保存中断状态,关中断,进入临界区,在退出临界区时,开中断。

spin_lock_irqsave锁返回时,中断状态不会被改变,调用spin_lock_irqsave前是开中断返回就开中断。

spin_lock_irq锁返回时,永远都是开中断,即使spin_lock_irq前是关中断

转载于:https://my.oschina.net/chuqq/blog/1574545

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七年级计算机上教学计划,初一教学计划模板锦集5篇

初一教学计划模板锦集5篇时光在流逝,从不停歇,我们又将迎来新的教学工作,我们要好好计划今后的教育教学方法。那么一份同事都拍手称赞的教学计划是什么样的呢?以下是小编为大家整理的初一教学计划5篇,仅供参考&#xf…

我的世界服务器玩家在线时间,将公布上线时间?我的世界中国版网易520前瞻

【17173专稿,转载请注明出处】《我的世界》中国版最近一段时间动作不断。网易CEO丁磊在财报电话会议上公布了《我的世界》手游版会在7月份推出,结合《我的世界》中国版的公告提及:”《我的世界》中国版即将在暑期上线“。如此看来手游版和PC版…

ftpwebrequest 无法加载或初始化请求的服务提供程序_jvm之类加载机制

什么是类加载每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class"的文件,".class"文件中保存着Java代码经转换后的虚拟机指令,当需要使…

云服务器怎么设置域名,云服务器域名设置在哪里

可能不同的云服务厂商域名设置的方式略有不同,不过,大体来讲,方法应该都差不多的。下面我们以1.打开浏览器,搜索西部数码官网并登陆账号密码,到会员中心。2.进入管理中心后,在左侧的业务管理中找到3.点击服…

RHCE 学习笔记(9) 网络管理

n这一节本来按照教学大纲应该是学习SSH,不过SSH有很多网络相关的知识,因此老师把网络内容提前了一些。网络的基本知识例如IP,DNS,DHCP,路由协议等常识就不在此解释了。 RHEL查看网卡的相关信息很容易,ifcon…

用原生js封装get方法

get方法的封装 首先我们看一下用原生js来发送请求的步骤: 1.创建请求对象 .var xhrnew XMLHttpRequest(); 2.创建open方法确认请求方式和地址 xhr.open(get,url) ps(记住get方法有参数的话在url后面用?符号连接再加上参数如:url?num3,多个参数用&符号连接); 3.监听事件…

10一个应用阻止关机贴吧_手机该不该每天关机一次?看完才知道这么多年白用了...

晚上习惯关机睡觉的朋友们在哪里?举起你们的手让小编看看!那么问题来了,你为啥要关机睡觉?是担心手机“睡眠不足”,还是担心屏亮会让你忍不住的熬夜?然而,有朋友认为手机应该每天关机一次&#…

ajax无刷新评论的思路,ajax学习——ajax版无刷新评论(数据库)

//Comment.htm无刷新评论type"text/javascript">//加载评论$(function() {$.post("GetComment.ashx",function(data, status) {if (status ! "success") {$("#ulComment").append($("加载数据失败"));return;}var lines …

python 找出监听的端口号对号显示

刚好做运维平台,领导也有个要求是实时的查看,任意一台主机的端口开启状态,实际上我已经做了脚本发邮件每天diff的功能,但是为了方便展示还是写了这个脚本: 脚本内容: 123456789101112131415161718192021222…

彩虹系统怎么弄服务器,用云服务器彩虹挂机

用云服务器彩虹挂机 内容精选换一换当云服务器网络异常、防火墙未放行本地远程桌面端口、云服务器CPU负载过高等场景均可能导致云服务器无法正常登录。当您的云服务器无法远程登录时,我们建议您首先检查是否可以通过控制台远程登录。再参考排查思路检查登录异常的原…

欧拉路HDU3018

欧拉路,欧拉回路,讲的实际上就是一笔画的问题。 给定n个点,m条边,如果能一笔把所有边都连上就是欧拉路,如果起点和终点是同一点,就是欧拉回路。 欧拉路的特征:对于无向图,如果所有点…

awt jtable 多线程加载图片_Java项目实战之天天酷跑(三):缓冲加载游戏界面

前文,我们完成了开始游戏界面的搭建。本文将实现缓冲加载界面的搭建。并搭建与前面俩界面间的桥梁。实现输入正确用户名密码后,进入开始游戏界面,点击开始游戏按钮后,进入缓冲加载界面的功能。界面示意图:具体要求&…

本地修改指向服务器,本地修改指向服务器

本地修改指向服务器 内容精选换一换已获取服务器管理员帐号与密码。打开CMD运行窗口,输入gpedit.msc,打开本地组策略编辑器。打开组策略在指定RD会话主机服务器的授权模式下拉列表中选择按用户。设置允许RD最大连接数位999999。设置结束已断开连接的会话…

expect 批量修改服务器用户密码

每个技术人员离职,留下的人 就要修改他的服务器账号密码,很麻烦,故写次脚本偷懒 change.sh 如下 12345678910#!/bin/bashfor i in awk {print $1} account.txt dojawk -v l"$i" {if(l$1)print $2} account.txt aawk -v l"$i&q…

虚拟机安装服务器2008,VMware Workstation 虚拟机安装64位windows 2008 R2 系统

偶看现在使用的电脑是 惠普 康柏 Elite 8300 MT Mini Tower,操作系统 Windows 7 旗舰版 64位基本硬件展示处理器 英特尔 第三代酷睿 i5-3470 3.20GHz 四核主板 惠普 3397内存 8 GB ( 记忆科技 DDR3 1600MHz / 镁光 DDR3 1600MHz )主硬盘 西数 WDC WD5000AAKX-60U6A…

黑客入门之单机游戏外挂

转载于: http://www.cnblogs.com/huipengbo/p/6887170.html 一.本文以植物大战僵尸外挂的编写为例,介绍单机游戏外挂的编写和使用过程。 1.启动单机游戏如:植物大战僵尸如下图 2.想明白我们写外挂的目的:让我们有充足的阳光数量来使用&#x…

巨无霸Win8PE X64服务器维护专用,【13年4月4日】维护版win8pe【32位+64位+纯64位】(支持BIOS+EFI)...

因为单独一个PE是不够用的,已经制作了合盘,可BIOS启动,也可EFI启动。详情移步》欢迎下载使用,觉得好的话,请回帖支持一下,您的支持,就是我的动力。。。。预祝大家新的一年合家欢乐!工…

centos7修改服务器密码忘记,Centos7忘记root密码怎么修改

Centos7忘记root密码怎么修改一、 reboot重启机器,当出现引导界面时,按e进入内核编辑界面。二、 往下翻,到LANGzh_CN.UTF-8后面添加 \rd.break(别忘了空格)三, 修改完成后,按下CtrlX组合键来运行这个修改后的内核程序(…

1.移动端测试知识笔记(面试必备,测试点,adb命令)

移动端测试: 移动应用,特性(功能) 满足 需求(产品文档,隐性需求) 一。App功能测试: 死活背下来1.业务逻辑正确性测试: 产品文档,隐性需求- 写成测试用例 2.兼容性测试: 1.系统版本&#xff1a…

Day 3 网络基础

网络基础 一、什么是互联网协议及为何要有互联网协议 ? 互联网协议:指的就是一系列统一的标准,这些标准称之为互联网协议。互联网的本质就是一系列的协议,总称为‘互联网协议’(Internet Protocol Suite)。 互联网协议…