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

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

问题6

问:mutex_lock和mutex_lock_interruptible的区别是什么?

备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。

答:

尽管信号量已经可以实现互斥的功能,但是在Linux内核中还是真实存在着“正宗”的互斥机制——mutex。

以下3个函数用于获取互斥体(均在kernel/locking/mutex.c中):

  • mutex_lock
void __sched mutex_lock(struct mutex *lock)
{might_sleep();if (!__mutex_trylock_fast(lock))__mutex_lock_slowpath(lock);
}
EXPORT_SYMBOL(mutex_lock);
  • mutex_lock_interruptible
int __sched mutex_lock_interruptible(struct mutex *lock)
{might_sleep();if (__mutex_trylock_fast(lock))return 0;return __mutex_lock_interruptible_slowpath(lock);
}EXPORT_SYMBOL(mutex_lock_interruptible);
  • mutex_trylock
int __sched mutex_trylock(struct mutex *lock)
{bool locked;MUTEX_WARN_ON(lock->magic != lock);locked = __mutex_trylock(lock);if (locked)mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);return locked;
}
EXPORT_SYMBOL(mutex_trylock);

mutex_lock()与mutex_lock_interruptible()的不同之处为,前者引起的睡眠不能被信号打断,而后者则可以被打断。mutex_trylock()则用于尝试获得mutex,获取不到mutex时不会引起进程睡眠。

mutex的使用方法和信号量用于互斥的场合完全一样。

参考资料:

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

问题7

问:如何分配内存时指定其不被释放?

备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。

答:

一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。

在Linux中,可以使用mlock函数来防止特定区域的内存被操作系统自动回收

mlock是一个系统调用,用于将指定的内存区域锁定在物理内存中,防止其被交换到磁盘上。当内存区域被锁定时,操作系统将保证该区域的数据始终在物理内存中,从而提高访问速度和安全性。

mlock函数的原型如下:

#include <sys/mman.h>

int mlock(const void *addr, size_t len);

参数说明:

  • addr:指向要锁定的内存区域的起始地址。
  • len:要锁定的内存区域的长度,以字节为单位。

返回值:

mlock函数成功时返回0,失败时返回-1,并设置errno来指示错误类型。

注意:mlock函数需要特权权限才能使用,通常只有root用户或具有CAP_IPC_LOCK权限的用户才能调用该函数。

实例:

下面是一个示例代码,展示如何使用mlock函数将指定的内存段进行锁定:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char *buffer = (char *)malloc(1024); // 分配一个大小为 1KB 的内存空间if (mlock((void*) buffer, sizeof(buffer)) == -1) {perror("Failed to lock memory");exit(-1);} else {printf("Memory locked successfully\n");// 这里可以对已经锁定的内存进行读写等操作munlock((void*) buffer, sizeof(buffer)); // 解除内存锁定free(buffer); // 释放内存空间}return 0;
}

上述代码:

1)首先通过mlock函数分配了一个大小为1KB的内存空间;

2)然后调用mlock()函数将其锁定;

3)接着可以对已经锁定的内存进行读写等操作;

4)最后,通过munlock函数解除内存锁定并释放相应的内存空间。

mlock函数在以下情况下常常被使用:

  • 对于需要频繁访问的敏感数据,可以使用mlock来确保其始终在物理内存中,避免因为内存交换而导致的性能下降。
  • 对于包含敏感信息的内存区域,可以使用mlock来防止其被交换到磁盘上,提高数据的安全性。

底层机制:

mlock处理路径中,会将VM_LOCKED标志加入到vma->vm_flags中(由于设置的地址区域有可能跨越多个vma,所以代码中会涉及到分裂和合并的操作,实质上都会设置相关的vma->vm_flags的VM_LOCKED标志)。然后会调用__mm_populate来填充虚拟页对应的物理页,最终在faultin_page函数中试图查找vma中的每个虚拟页对应的物理页面(对应于follow_page_mask函数)。如果没有找到,会调用handle_mm_fault主动触发缺页处理。handle_mm_fault函数是内核通用的缺页异常处理例程,如vma是匿名映射,则分配物理页面然后建立页表映射关系;若vma是文件映射,则会从磁盘读取对应的文件页(如果page cache没有对应页面时)到内存的page cache,然后建立虚拟页面建立页表映射关系。

对于一些对时间有严格要求的应用场景,访问时按需分配和调页机制的时延可能是未知的,内核中提供了mlock相关的系统调用,用于将虚拟内存区域对应的物理页面“锁在”内存中。内核对应mlock锁住的页面实际上它主要做了两步比较重要的操作:(1)调用mlock的时候就将所需要的物理页面准备好;(2)内存回收时当扫描到相关的物理页面时,将其放入不可回收的lru链表。第一步保证访问的虚拟地址对应的物理页面在内存中,第二步保证了锁住的页面不会被回收

参考资料:

一文剖析mlock锁原理

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

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

相关文章

前端JavaScript篇之数组的遍历方法有哪些?forEach和map方法有什么区别?

目录 数组的遍历方法有哪些&#xff1f;forEach和map方法有什么区别&#xff1f;forEach()map()filter()for…ofevery() 和 some()find() 和 findIndex()reduce() 和 reduceRight()forEach和map方法有什么区别总结 数组的遍历方法有哪些&#xff1f;forEach和map方法有什么区别…

【Unity】QFramework通用背包系统优化:使用Odin优化编辑器

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第四章时&#xff0c;笔者使用了Odin插件&#xff0c;对Item和ItemDatabase的SO文件进行了一些优化&#xff0c;使物品页面更加紧凑、更易拓展。 核心逻辑和功能没有改动&#xff0c;整体代码量减少…

深度学习(15)--PyTorch构建卷积神经网络

目录 一.PyTorch构建卷积神经网络(CNN)详细流程 二.graphviz torchviz使PyTorch网络可视化 2.1.可视化经典网络vgg16 2.2.可视化自己定义的网络 一.PyTorch构建卷积神经网络(CNN)详细流程 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;是一种深度学…

PHP入门指南:进阶篇

PHP入门指南&#xff1a;进阶篇 PHP入门指南&#xff1a;进阶篇1. 面向对象编程&#xff08;OOP&#xff09;1.1 类和对象的基本概念1.2 构造函数和析构函数1.3 属性和方法的访问控制1.4 继承与多态 2. 错误和异常处理2.1 错误处理机制2.2 异常处理机制2.3 自定义异常类 3. PHP…

k8s弃用docker后使用ctr导入镜像

很多公司的k8s安装比较早,在生产环境一般很少升级,因此还是老版本,在使用新版本的时候,容易陷入老版本的思维中,从而掉坑,这里记录一下整个排查过程,希望对遇到类似的同学起到一定的帮助。 k8s 抛弃弃用docker 学习容器技术的过程中,我看到有不少同学留言问 Kubernet…

公司大数据展示模板【大屏可视化项目案例-23】

文章目录 一.公司大数据展示模板【大屏可视化项目案例-23】1.1 项目背景1.2 项目效果截图二.项目页面分析2.1 呈现效果页面分析2.2 页面加载时隐藏加载动画2.3 样式布局三.本案例完整源码下载一.公司大数据展示模板【大屏可视化项目案例-23】 1.1 项目背景 随着业务规模的不断…

Hadoop搭建(完全分布式)

节点分布&#xff1a; bigdata-masterbigdata-slave1bigdata-salve2 NameNode NodeManager NodeManager SecondaryNameNodeDataNodeDataNodeResourceManagerNodeManagerDataNode 目录 一、jdk安装&#xff1a; 二、hadoop安装 一、jdk安装&#xff1a; jdk-8u212链接&am…

信息隐藏研究新动向

信息隐藏有三十年的研究历史&#xff0c;在隐写、数字水印、可逆数据隐藏等方面&#xff0c;国内外发展了一系列新技术与新方法。随着深度学习时代的来临&#xff0c;信息隐藏研究出现了新的变化。一方面&#xff0c;深度学习技术在信息隐藏的发展中发挥了重要作用&#xff1b;…

94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级经验数据获取的逆向分析 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;c4351a5b346d8953a1a8e3ec…

SpringCloud-Eureka原理分析

Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中&#xff0c;服务的动态注册和发现是必不可少的组成部分&#xff0c;而Eureka正是为了解决这一问题而诞生的。 一、为何需要Eureka 在微服务架构中&#xff0c;服务之间的协同合作和高效通信是至关重要…

CentOS下安装vlc

一、引言 vlc是一跨多媒体播放器&#xff0c;可以播放本地媒体文件和网络串流&#xff0c;帮助我们排查音视频开发过程中遇到的问题。大部分情况下&#xff0c;我们只需要在Windows系统下安装vlc就可以了。但有一种情况是需要在Linux下安装vlc的&#xff1a;我们的音视频拉流软…

华为配置内部人员接入WLAN网络示例(802.1X认证)

配置内部人员接入WLAN网络示例&#xff08;802.1X认证&#xff09; 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 用户接入WLAN网络&#xff0c;使用802.1X客户端进行认证&#xff0c;输入正确的用户名和密…

Day10案例演示

Day10案例演示 在 AppInfoScanner所在的文件中运行cmd&#xff0c;输入 python -m pip install -r requirements.txt安装环境 具体用法可移步&#xff1a;https://github.com/kelvinBen/AppInfoScanner 以下仅以android类型示范 python app.py android -i <Your apk fil…

【Git版本控制 02】分支管理

目录 一、创建分支 二、切换分支 三、合并分支 四、删除分支 五、合并冲突 六、分支策略 七、bug分支 一、创建分支 # 当前仓库只有 master 一个主分支 # 可通过 git branch 是进行分支管理的命令&#xff0c;可通过不同参数对分支进行查看、创建、删除(base) [rootloc…

第一个 Angular 项目 - 静态页面

第一个 Angular 项目 - 静态页面 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目&#xff0c;目前因为还没有学到数…

【服务器部署】Docker环境的安装

基于CentOS系统的服务器环境下安装Docker环境&#xff0c;安装步骤参考官方指南&#xff1a;https://docs.docker.com/engine/install/centos/ 配置库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-c…

Asp .Net Core 系列:Asp .Net Core 集成 Panda.DynamicWebApi

文章目录 简介Asp .Net Core 集成 Panda.DynamicWebApi配置原理什么是POCO Controller&#xff1f;POCO控制器原理ControllerFeatureProvider实现自定义判断规则IApplicationModelConventionPanda.DynamicWebApi中的实现ConfigureApiExplorer()ConfigureSelector()ConfigurePar…

ChatGPT在肾脏病学领域的专业准确性评估

ChatGPT在肾脏病学领域的专业表现评估 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为一个先进的机器学习模型&#xff0c;在多个领域显示出了其对话和信息处理能力的潜力。近期发表在《美国肾脏病学会临床杂志》&#xff08;影响因子&#xff1a;9.8&#xff09;上的一项…

Linux 设置自动挂载磁盘

目录 查看硬盘信息 临时挂载&#xff08;重启后失效&#xff09; 自动挂载 查看硬盘信息 1. 先使用以下命令查看硬盘信息 sudo fdisk -l 2.根据上面查到的硬盘信息&#xff0c;查需要挂载的硬盘的uuid sudo blkid &#xff08;查全部&#xff09; 或 sudo blkid 要挂载的分…

S7-1200PLC通讯问题总结

文章目录 一、硬件1.串口通信RS232RS485RS422 2.网口通信 二、协议1.串口通信协议2.网口通信协议 三、程序编写1.S7通信PUTGET 2.开放式以太网通信 一、硬件 可分为PLC与PLC通信&#xff0c;PLC与上位机通信&#xff0c;PLC与变频器通信&#xff0c;PLC与仪器仪表通信&#xf…