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

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

问题4

问:既然spin_lock可以在进程上下文和中断上下文中使用,那么一旦进入中断,被自旋住,那么CPU岂不是被死锁住了?

备注:这个问题是笔者当年参加比特大陆面试的时候被问到的。当时他们先是问了自旋锁和信号量,我答上来了。正在心中窃喜之际,面试官突然追问了这个问题。由于此前遇到过的此类面试题都是只问到自旋锁与信号量的区别就可以了,并没有如此深入,因此当时就懵住了。说明对于自旋锁的掌握还是不够透彻。

答:

自旋锁主要针对SMP或单CPU但内核可抢占的情况;对于单CPU且内核不支持抢占的系统,自旋锁退化为空操作在单CPU且内核可抢占的系统中,自旋锁持有期间,内核的抢占将被禁止。由于内核可抢占的单CPU系统的行为实际上类似于SMP系统,因此,在这样的单CPU系统中使用自旋锁仍十分必要。另外,在多核SMP的系统中,任何一个核拿到了自旋锁,该核上的抢占调度也暂时禁止了,但是没有禁止另外一个核的抢占调度

在多核编程的时候,如果进程和中断访问同一片临界资源,则一般需要在进程上下文中调用spin_lock_irqsave()/spin_unlock_irqrestore(),在中断上下文中调用spin_lock()/spin_unlock()。这样,在CPU0上,无论是进程上下文还是中断上下文获得了自旋锁,此后,如果CPU1上不论是进程上下文还是中断上下文,想要获得同一自旋锁,都必须忙等待,这避免了一切核间并发的可能性。

额外:

由此引申出一个进阶问题。

问:在使用自旋锁的时候有哪些注意事项?

答:

驱动工程师应谨慎使用自旋锁,在使用过程中要特别注意如下几个问题:

(1)自旋锁实际上是忙等待锁,当锁不可用时,CPU一直循环执行“测试并设置”该锁,直到其可用而取得该锁。CPU在等待自旋锁时不做任何有用的工作,仅仅是等待。因此,只有在占用锁的时间极短的情况下,使用自旋锁才是合理的。当临界区很大,或者有共享设备的时候,需要较长时间占用锁,使用自旋锁会降低系统的性能。

(2)自旋锁可能导致系统死锁。引发这个问题最常见的情况是递归使用一个自旋锁,即如果一个已经拥有某个自旋锁的CPU想第二次获得该锁,则此CPU将死锁。也就是说,自旋锁不可递归。

(3)在自旋锁锁定期间不能调用可能引起进程调度的函数。如果进程获得自旋锁之后再阻塞(如调用copy_from_user、kmalloc、msleep等函数),则可能导致内核的崩溃,引发内核panic。

(4)在单核情况下编程的时候,也应该认为自己是多核的。比如,在单CPU的情况下,若中断和进程访问同一临界区,进程里调用spin_lock_irqsave()是安全的,在中断中不调用spin_lock()也没有问题。因为spin_lock_irqsave()可以保证这个CPU的中断服务程序不可能执行。但是,如果CPU是多核的,那么spin_lock_irqsave()不能屏蔽另外一个核的中断,则另外那个核就可能造成并发问题。因此不管怎样,在中断服务程序中也应该调用spin_lock()。

参考资料:

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

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

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

相关文章

Linux 研究文件描述符fd的分配规则

目标:研究fd的分配规则 方式:做实验 我们写一段代码,需要实现的功能如下:利用系统调用接口实现读入字符,并且把读入的字符打印在屏幕上。 实验1 我们需要用到read()函数。 read是系统调用接口,头文件和…

矩阵的正定(positive definite)性质的作用

1. 定义 注意,本文中正定和半正定矩阵不要求是对称或Hermite的。 2. 性质 3. 作用 (1)Axb直接法求解 cholesky实对称正定矩阵求解复共轭对称正定矩阵求解LDL实对称非正定矩阵求解复共轭对称非正定矩阵求解复对称矩阵求解LU实非对称矩阵求解…

[linux c]linux do_div() 函数用法

linux do_div() 函数用法 do_div() 是一个 Linux 内核中的宏,用于执行 64 位整数的除法操作,并将结果存储在给定的变量中,同时将余数存储在另一个变量中。这个宏通常用于内核编程中,特别是在处理大整数和性能敏感的场合。 函数原…

假期作业5

TCP和UDP区别 TCP ----稳定 1、提供面向连接的,可靠的数据传输服务; 2、传输过程中,数据无误、数据无丢失、数据无失序、数据无重复; 3、数据传输效率低,耗费资源多; 4、数据收发是不同步的; U…

APIfox自动化编排场景(二)

测试流程控制条件 你可以在测试场景中新增流程控制条件(循环、判断、等待、分组)等。进一步满足了更复杂的测试场景/流程配置的使用,最终借助自动化测试功能解决复杂场景的测试工作。 分组​ 当测试流程中多个步骤存在相关联关系时&#xf…

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

作业2.7

一、填空题 1、在下列程序的空格处填上适当的字句&#xff0c;使输出为&#xff1a;0&#xff0c;2&#xff0c;10。 #include <iostream> #include <math.h> class Magic {double x; public: Magic(double d0.00):x(fabs(d)) {} Magic operator(__const Magic&…

2024年2月11日(星期天)骑行金色螳川

2024年2月11日 (星期天&#xff0c;年初二) 骑行金色螳川(赏油菜花&#xff09;&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门囗集合 &#xff0c;家…

Redis 命令大全

文章目录 启动与连接Key&#xff08;键&#xff09;相关命令String&#xff08;字符串&#xff09;Hash&#xff08;哈希&#xff09;List&#xff08;列表&#xff09;Set&#xff08;集合&#xff09;Sorted Set&#xff08;有序集合&#xff09;其他常见命令HyperLogLog&…

校准大麦服务器时间,实现本地时间和服务器时间同步,无缝衔接抢购

文章目录 引言js实现python实现引言 在使用大麦进行商品抢购倒计时,涉及到一个问题,就是时间的准确性,如果使用本地手机或者电脑的时间与服务器时间不同步,即使是1秒或者百毫秒内的误差,都会影响抢购的成功准确率。 因此,针对上述问题,我们提出了一种解决方法,将本地…

【Leetcode】LCP 30. 魔塔游戏

文章目录 题目思路代码结果 题目 题目链接 小扣当前位于魔塔游戏第一层&#xff0c;共有 N 个房间&#xff0c;编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums&#xff0c;其中正数表示道具补血数值&#xff0c;即血量增加对应数值&#xff1b;负数表示怪…

2024牛客寒假算法基础集训营1部分题解

// 能力有限&#xff0c;做多少发多少。 A-DFS搜索 题目描述 最近&#xff0c;fried-chicken完全学明白了DFS搜索&#xff08;如上图所示&#xff09;&#xff01;于是学弟向他请教DFS搜索&#xff0c;fried-chicken热心的进行了讲解&#xff1a; 所谓DFS搜索&#xff0c;就…

yolov8使用旋转框自己做数据集检测

主要在数据集制作&#xff0c;训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具&#xff0c;这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件&#xff0c;然后把dota的xml文件转换成dota的txt文件…

Windows小脚本

Windows11切换回Windows10右键 打开cmd控制台&#xff0c;输入以下命令&#xff1a; reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve taskkill /f /im explorer.exe & start explorer.exe 恢复到Windows…

文献速递:肿瘤分割---- 弱监督肝肿瘤分割,使用Couinaud区段标注

文献速递&#xff1a;肿瘤分割---- 弱监督肝肿瘤分割&#xff0c;使用Couinaud区段标注 01 文献速递介绍 肝癌是世界上导致癌症死亡的主要原因之一&#xff0c;也是第二大常见的癌症死因。本稿件于2021年10月28日收到&#xff0c;2021年11月24日修订&#xff0c;2021年12月1…

Qt 字符串类应用与常用基本数据类型

目录 操作字符串 查询字符串 Qt 常见数据类型 操作字符串 创建一个控制台项目 &#xff08;1&#xff09;QString提供一个二元的 “” 操作符&#xff0c;主要用于组合两个字符串。QString str1 "Hello World 传递给QString一个 const char* 类型的ASCII字符串 “He…

『 C++ - STL 』unordered_xxx系列关联式容器及其封装(万字)

文章目录 &#x1f3a1; unordered系列关联式容器&#x1f3a1; 哈希表的改造&#x1f3a2; 节点的设置与总体框架&#x1f3a2; 迭代器的封装&#x1f3a0; 迭代器的框架&#x1f3a0; operator()运算符重载&#x1f3a0; 其余成员函数/运算符重载 &#x1f3a2; 迭代器begin(…

freertos 源码分析五 任务调度一

vTaskStartScheduler 创建空闲进程&#xff0c; 调用适配xPortStartScheduler(); void vTaskStartScheduler( void ) {xReturn xTaskCreate( prvIdleTask,configIDLE_TASK_NAME,configMINIMAL_STACK_SIZE,( void * ) NULL,portPRIVILEGE_BIT,&xIdleTaskHandle );if( xRet…

C++之std::tuple(一) : 使用精讲(全)

相关系列文章 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 深入理解可变参数(va_list、std::initializer_list和可变参数模版) std::apply源码分析 目录 1.简介 2.std::ignore介绍 3.创建元组 3.1.…

什么是元数据、IDC

元数据&#xff08;metadata&#xff09;是描述对象的数据&#xff0c;对对象的属性、操作及联系的描述性信息。现实世界的一本书可以当作是一个对象&#xff0c;而描述这本书的信息&#xff0c;比如书名、作者、出版时间、页数、分类等等都是对象的属性。书可以看&#xff0c;…