in_interrupt()是判断当前进程是否处于中断上下文,这个中断上下文包括底半部和硬件中断处理过程,
函数实现:
#define in_interrupt() ({ const int __cpu = smp_processor_id(); /
(local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
判断中断计数和底半部计数是否〉0,如果只希望判断是否在硬件中断上下文,则可以使用:in_irq()。
local_irq_disable() , local_irq_enable() , local_irq_save() 和 local_irq_restore() 为中断处理函数,主要是在要进入临界区时禁止中断和在出临界区时使能中断。local_irq_disable() 和 local_irq_enable() 配对使用;而 local_irq_save() 则和 local_irq_restore() 配对使用。
local_irq_disable() 和 local_irq_save() 都可以禁止中断,但不同的是后者可以保存中断状态。
local_irq_restore() 在使能中断的同时还恢复了由 local_irq_save() 所保存的中断状态。
这 4 个宏定义在 include/linux/Irqflag.h 中:
#define local_irq_enable() \
do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
#define local_irq_disable() \
do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
#define local_irq_save(flags) \
do { raw_local_irq_save(flags); trace_hardirqs_off(); } while (0)
#define local_irq_restore(flags) \
do { \
if (raw_irqs_disabled_flags(flags)) { \
raw_local_irq_restore(flags); \
trace_hardirqs_off(); \
} else { \
trace_hardirqs_on(); \
raw_local_irq_restore(flags); \
} \
} while (0)
其中,raw_local_irq_disable() 在 include/asm-i386/Irqflag.h定义为:
1
|
static inline void raw_local_irq_disable(void){ native_irq_disable(); }
|
从 native_irq_disable() 的名字可以看到是”禁止本地中断“ 。禁止本地中断并不保护运行在另一个CPU上的中断处理程序对该数据结构的并发访问。native_irq_disable() 同样定义在 include/asm-i386/Irqflag.h 中:
1
|
static inline void native_irq_disable(void){ asm volatile("cli": : :"memory");}
|
指令 cli 会清除 eflags 控制寄存器中的IF标志,这样就禁止了中断。
同样可以看到 local_irq_enable() 的最终定义为:
1
|
static inline void native_irq_enable(void){ asm volatile("sti": : :"memory");}
|
指令 cli 会设置 eflags 控制寄存器中的IF标志,这样就使能了中断。
有时候,为了避免中断处理程序对 eflags 寄存器内容的破坏,在进入临界区时使用 local_irq_save() 来保存 eflags 寄存器(将 elfags 保存在一个变量中)以及在出临界区时用 local_irq_restore() 来恢复 eflags 寄存器。同样在 include/asm-i386/Irqflag.h 有定义:
对应于 local_irq_save() 有:
1
|
static inline unsigned long native_save_fl(void){ unsigned long f; asm volatile("pushfl ; popl %0":"=g" (f): /* no input */); return f;}
|
上面,先将 eflags 压入栈中,然后再弹出到 f 变量中将其保存起来。
对应于 local_irq_restore() 有:
1
|
static inline void native_restore_fl(unsigned long f){ asm volatile("pushl %0 ; popfl": /* no output */ :"g" (f) :"memory", "cc");}
|
上面,将变量 f 压入栈,然后弹到 eflags 中。另外,cc 是因为汇编指令会修改 eflags 寄存器时而采用。
对于单 CPU,非抢占的情况,假如有:
local_irq_disable()
/* 临界区代码 */
local_irq_enable()
这里,如果当执行到 local_irq_disable() 时,中断已经被禁止。那么在退出临界区时,再执行 local_irq_enable() 时会使所有的中断都打开,这样是可能带来副作用的,修正这种情况的办法是使用 local_irq_save() 和 local_irq_restore()。
1、可能情况一 创建数据库的时候不要选默认数据库默认的Default字符集 选utf8字符集_springfranework.dao.dataintegrityviolationexception:could not execute st
为什么80%的码农都做不了架构师?>>> ...
DevExpress技术交流群2:775869749欢迎一起进群讨论DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。DevExpress Reporting v20.1版本增强了许多控件功能,本文将为大家介绍增强的WinForms / WPF报表功能等,欢迎下载v20.1体验!DevExpress Repo..._vs中比较好用的报表程序
在写接口时,同一个控制器里session可以随意获取可以用,但是跨方法就获取不到了,怎么回事呢?修改app/Http/Kernel.php文件即可一、解决办法 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookies._lavarel session 换接口后拿不到数据
1.在岁23-28岁时:经常写代码写到天亮。(不是为了工作,是因为爱好。)2.经常会因为一个或多个if else而纠结,到底该用还是不该用,用了是不是会有点损耗性能。3.曾经因为一个程序问题,晚上无法入睡,起来解决了问题才能安然入睡。4.当你做某个方面做出了点成绩,你会欣喜若狂,尽管没有给你带来任何经济利益。5.当你在某方面有自己独立的创新或框架时,你会找个同行分享_一个程序员的经方之路
背景:本来一个页面涉及到多个类别的统计,最初的代码是每一个类别做一个sql来count出数目,可想而知,最后的加载速度和体验都是不好,能明显感觉至少5、6秒甚至更多的响应时间之前的代码://136集团客户故障分析统计 public List getGroupAnalysisCount(String nowmonth) throws WMSException { // 按136客户名称_sum case when优化
成都链安科技有限公司(后文简称Beosin成都链安)自2018年3月29日成立来,一直坚守“让区块链生态更安全”的使命,专注区块链安全领域,致力于成为区块链安全生态的技术..._北京链安和成都链安
作者:Truly日期:2007.8.8今天抽空继续调整了SandCastle的部分代码,现在可以初步看到一些jscript格式的说明文档了,不过还是不很完美,由于没有SandCastle的源码,极大的影响了调试修改的过程。下面是生成的文档的一个抓图,大家可以通过点击这里查看我生成的文档。//BootstrappingtheSysnamespace.Can'tusereg...
1.项目需要搭建一个SFTP服务器,文末会提供一个资源工具,用的是freeSSHd软件。2 安装这里就不在赘述,一路下一步即可。3 打开设置后SSH中,默认端口为22,我改为了10097防止冲突4.打开User中选择Add添加用户设置即可5.公用秘钥的选择6.本地服务地址,sftp目录指向哪里,也就是上传的文件要去哪个目录6.启动SSH服务即可到此,sftp已经创建完毕。可以使用xftp进行验证,或者看下篇文章结合使用java进行图片上传。..._window xftp需要安装服务端吗
Java Interface简介正如大家所了解到的, 对象通过它们公开的方法来定义它们与外部世界的交互。方法形成了对象与外部世界的接口;例如,电视机前面的按钮是你和塑料外壳另一侧电线之间的接口。你按下“电源”按钮来打开和关闭电视。在其最常见的形式中,接口是一组具有空主体的相关方法。接口中只能定义抽象方法,这些方法默认为 public abstract 的,因而在声明方法时可以省略这些修饰符。试图在...
1、自定义协议package com.tcp.serverone;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;import java.util.Arrays;/** * <pre> TCP粘包拆包 * 自己定义的协议 * 数据包格式 * +——----——-...
使用递归,实现一个整数的数位求和编程思路:1、键入要计算的数字;2、调用函数DigitSum(int n)实现数位求和;2.1、若n大于0,则返回n % 10 + DigitSum(n / 10);2.2、若n小于等于0,则返回0;3、打印结果。3.1、若n小于等于0,则返回输入不合法;3.2、若n大于0,打印结果。具体代码如下:#define _CRT_SECURE_NO_W..._递归计算位数之和