Linux内核与驱动面试经典“小”问题集锦(2)

接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(1)

问题2

问:spin_lock和spin_lock_irq以及spin_lock_irqsave的区别是什么?也可以说它们之间有什么区别和联系?

备注:此题是自旋锁问题的进一步问题,一般都是在前边你回答出Linux内核的锁机制之后(上一回的问题1,参见Linux内核与驱动面试经典“小”问题集锦(1))的进一步提问、追问。这个问题在蔚来、比特大陆以及其它一些公司面试时问到过。

答:

spin_lock()/spin_unlock()是自旋锁机制的基础,其与关中断local_irq_disable()/开中断local_irq_enable()关中断并保存状态字local_irq_save()/开中断并恢复状态字local_irq_restore()关底半部local_bh_disable()/开底半部local_bh_enable()形成了整套自旋锁机制。其相互之间的关系如下:

  • spin_lock与spin_lock_irq的关系

spin_lock_irq() = spin_lock() + local_irq_disable()

即spin_lock_irq()是spin_lock()的同时关中断。与之相对应,

spin_unlock_irq() = spin_unlock() + local_irq_enable()

即spin_unlock_irq()是spin_unlock()的同时开中断。

  • spin_lock与spin_lock_irqsave的关系

spin_lock_irqsave() = spin_lock() + local_irq_save()

即spin_lock_irqsave()是spin_lock()的同时关中断并保存状态字。与之相对应,

spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()

即spin_unlock_irqrestore()是spin_unlock()的同时开中断并恢复状态字。

  • spin_lock与spin_lock_bh的关系

spin_lock_bh() = spin_lock() + local_bh_disable()

即spin_lock_bh()是spin_lock()的同时关底半部。与之相对应,

spin_unlock_bh() = spin_unlock() + local_bh_enable()

即spin_unlock_bh()是spin_unlock()的同时开底半部。

spin_lock_irq()、spin_lock_irqsave()、spin_lock_bh()类似函数会为自旋锁的使用“系好安全带”,以避免突如其来的中断驶入对系统造成的伤害。

问题3

问:中断中应该使用自旋锁还是信号量或互斥锁?

备注:这个问题在百度、蔚来以及其它一些公司面试时问到过。

答:

自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分。自旋锁最多只能被一个内核任务持有。在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关,内核不能被抢占。

信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠;当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。信号量只能在进程上下文中使用,因为中断上下文中是不能被调度的(即在中断上下文中释放时不能进行进程切换)。

综上,由于在中断中不能被调度,并且中断处理函数是不可重入的,因此中断中应该选择自旋锁而非信号量或互斥锁等。

额外:

这里要多说一点。如果做出上述回答后,面试官继续追问:为什么中断中不能休眠或进行调度?则原因如下:

(1)中断处理的时候不应该发生进程切换,因为在中断上下文中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断。如果在中断上下文中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断上下文中,没有进程(task_struct)的概念,因此如果真的休眠,则内核几乎肯定会死。

(2)schedule()在切换进程时,保存当前的进程上下文(CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文(在调用中断处理程序后恢复)。但在中断处理程序里,CPU寄存器的定已经变化了吧(最重要的程序计数器PC、堆栈SP等),如果此时因为睡眠或阻塞操作调用了schedule(),则保存的进程上下文就不是当前的进程上下文了。所以不可以在中断处理程序中调用schedule()以及引发schedule()的操作。

参考资料:

《Linux设备驱动开发详解 —— 基于最新的Linux 4.0内核》 宋宝华 编著,机械工业出版社

信号量和自旋锁的选择

为什么中断不能睡眠

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

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

相关文章

Unity类银河恶魔城学习记录1-14 AttackDirection源代码 P41

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttackState.cs using System.Collections; using System.Co…

C语言的malloc(0)问题

malloc(0)详解 首先来解释malloc(0)的问题,这个语法是对的,而且确实也分配了内存,但是内存空间是0,就是说返回给你的指针是不能用的,感觉奇怪吧?但是从操作系统的原理来解释就不奇怪…

6-2、T型加减速计算简化【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍简化T型加减速计算过程,使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 根据上一节内容已知 常用的晶振大小…

js中类型的值相加或相减的转换

字符串与数字相加结果是字符串 "5" 1 // 返回 "51" 1 转换为 "1" 数字字符串与数字相减 数字字符串会变成数字 "5" - 1 // 返回 4 "5" 转换为 5非数值字符串与数字相减 结果是NaN "a" -…

【Vue3】项目实战前基本知识

Vue3ViteTypeScriptpinia Vue3更新点新建项目方式一新建项目方式二vite-demo目录讲解安装常用扩展 vue3书写风格动态css也可以这样使用 虚拟DOMRef全家桶ref小知识1ref小知2,可以直接操作Dom recative全家桶数组赋值方式一数组赋值方式二 to系列全家桶Vue3的响应式原…

Spring实现事务二

. 上一次我们讲到,Spring实现事务的方式有两种,并且,为实现这两种方式,我们做了一些准备工作,那么接下来,我将带着大家,来继续学习事务的相关知识 编程式事务 SpringBoot内置了两个对象 DataSourceTransactionManager 事务管理器. 用来获取事务(开启事务), 提交或回滚事务 Tr…

[Angular 基础] - 指令(directives)

[Angular 基础] - 指令(directives) 这里假设已经知道如何创建 Angular 组件以及数据绑定,不然可以参考前两篇笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) 就像中文翻译一样,dire…

【已解决】pt文件转onnx后再转rknn时得到推理图片出现大量锚框变花屏

前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn,rknn模型能正常转换,…

gem5学习(18):ARM DVFS建模——ARM DVFS modelling

目录 一、Voltage Domains 1、灵活方法:使用命令行标志 2、不太灵活方法:创建 CpuCluster 的子类 二、Clock Domains 三、Adding Clock Domains to an existing simulation 四、The DVFS Handler 1、the number of Voltage Domains does not matc…

养好花草鱼鸟,也能旺家

不少朋友家里既养了鱼鸟,也养了花草,平时逗逗鸟喂喂鱼再赏赏花,真是非常惬意的生活,而用养鱼的水养植物,花草植物会长得格外茂盛。根据这一原理,很多人喜欢在养一些水培花草的时候,顺便养几尾小…

基于SpringBoot+Vue的外卖点餐管理系统

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

SSM框架,Maven的学习(下)

依赖传递和依赖冲突 依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。当我们引入一个库或框架时,构建工具(如 Maven、Gradle&…

2024.02.05

复习单向,双向链表,并且实现两种链表的增加和删除功能。 单链表头插 Linklist insert_head(datatype element,Linklist head) { //创建新节点 Linklist screate_node(); if(NULLs) return head; s->dataelement; //1,判断链表为空 if(NULLhea…

第三篇:SQL数据模型、通用语法和语法分类

一,SQL数据模型 (一)关系型数据库(RDBMS) 1.概念 (百度百科)指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这…

【蓝桥杯选拔赛真题64】python数字塔 第十五届青少年组蓝桥杯python 选拔赛比赛真题解析

python数字塔 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要求 (注:input()输入函数的括号中不允许添加任何信息) 提示信息: 数字塔是由 N 行数堆积而成,最顶层只有一个数,次顶层两个数,以此类推。相邻层之间的数用线连接,下一层的每个数与它上一层左上…

网络安全大赛

网络安全大赛 网络安全大赛的类型有很多,比赛类型也参差不齐,这里以国内的CTF网络安全大赛里面著名的的XCTF和强国杯来介绍,国外的话用DenCon CTF和Pwn2Own来举例 CTF CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相…

EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)

目录 小球视频 图像输出函数 loadimage用于从文件中读取图片 putimage在当前设备上绘制指定图像。 initgraph 函数 图片输出 代码详解: 1. 初始化图形界面 2. 设置背景颜色并清除屏幕 3. 加载并显示图片 4. 等待用户输入并退出程序 图形界面中的小球 1…

在云计算环境下保护Java应用程序的有效措施

云计算(Cloud)技术是近年来计算机科学的一个重要突破。大多数组织已经通过将自己的应用程序移入云平台而获益。不过,如何保证应用程序在第三方服务器上的安全性,是一项艰巨的挑战。 在本文中,我们将重点讨论Java&…

C++ dfs搜索枚举(四十八)【第八篇】

曾经我们讲过枚举算法,那假设我们把枚举算法应用到搜索里呢? 1.搜索枚举 以前我们在进行枚举的时候是用了多层循环嵌套,但是当枚举的变量过多或者是输入的数量的时候就很难利用循环完成枚举了,不过我们可以尝试利用搜索进行枚举。…

自动化诊断测试之CANoe.DIVA入门

目录 0 前言 1 CANoe.DIVA基础 2 CANoe.DIVA TIPs 0 前言 写在前面:如对本文有任何疑问欢迎评论区讨论,希望和大家一起进步。同时HIL测试群欢迎大家加入如有需要也可私信我拉你。VT和DIVA都可以做UDS的自动化测试,但相对VT来说使用DIVA生成…