中移(苏州)软件技术有限公司面试问题与解答(7)—— kmalloc与vmalloc的区别与联系及使用场景
接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录
本文参考以下文章:
kmalloc与vmalloc如何选择
Vmalloc与kmalloc的区别
特此致谢!
本文对于中移(苏州)软件技术有限公司面试问题中的“(6)vmalloc和kmalloc的区别?什么时候会用kmalloc、什么时候用vmalloc?”进行解答与解析。
1. kmalloc和vmalloc的区别
先来回答kmalloc和vmalloc的相同点和不同点:
- 相同点
kmalloc和vmalloc都是Linux内核中用于内存分配的函数。
- 不同点
1)kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续。也就是说kmalloc函数分配的内存,虚拟地址连续、物理地址也连续;而vmalloc函数分配的内存,虚拟地址连续、物理地址并不连续。通过页表来建立物理内存与虚拟内存之间的关系,从而可以将不连续的物理内存映射到连续的虚拟内存。
2)kmalloc能分配的大小有限,vmalloc能分配的大小相对较大。kmalloc函数用于在内核空间中分配小块(通常小于一个页面大小)的连续内存区域,这些内存区域可以用于存储内核数据结构和缓冲区等;vmalloc函数用于在内核空间中分配大块的虚拟内存区域,通常用于存储大型缓冲区和内存映射文件等。
3)kmalloc函数分配速度较快,vmalloc比kmalloc函数要慢。kmalloc分配的物理地址与虚拟地址只有一个__PAGE_OFFSET(即TASK_SIZE)偏移,不需要为地址段修改页表;vmalloc函数获得的物理内存是不连续的,因此它只能将这些物理内存页一个一个地进行映射。因此,在性能开销上会比直接映射大得多。
4)kmallloc使用的是slab内存分配机制,而vmalloc使用的是伙伴系统分配机制,这也是造成它们区别的根本所在
5)kmalloc可用于原子上下文,而vmalloc不可以。vmalloc函数中调用了kmalloc(GFP_KERNEL),因此也不能应用于原子上下文。
2. 什么时候用kmalloc、什么时候用vmalloc
由上边kmalloc和vmalloc的特点可知,它们适用于不同的内存分配场景。在Linux内核编程中,需要根据具体的内存分配需求选择适合的函数。
- kmalloc的使用场景
如果需要分配小块连续内存,可以使用kmalloc函数。
- vmalloc的使用场景
如果需要分配大块非连续虚拟内存,则需要使用vmalloc函数。vmalloc使用的正确场合是分配一大块、(虚拟地址)连续的,只在软件中存在的、用于缓冲的内存区域,不能在微处理器之外使用。
关于kmalloc和vmalloc的正确使用方法在Linux内核源码/Documentation/translations/zh_CN\core-api/memory-allocation.rst中做了详细说明,内容如下:
选择内存分配器
==============
分配内存的最直接的方法是使用kmalloc()系列的函数。而且,为了安全起见,最好使用将内存设置为零的例程,如kzalloc()。如果你需要为一个数组分配内存,有kmalloc_array()和kcalloc()辅助程序。辅助程序struct_size()、array_size()和array3_size()可以用来安全地计算对象的大小而不会溢出。
可以用 `kmalloc` 分配的块的最大尺寸是有限的。实际的限制取决于硬件和内核配置,但是对于小于页面大小的对象,使用 `kmalloc` 是一个好的做法。
用 `kmalloc` 分配的块的地址至少要对齐到ARCH_KMALLOC_MINALIGN字节。对于2的幂的大小,
对齐方式也被保证为至少是各自的大小。
用kmalloc()分配的块可以用krealloc()调整大小。与kmalloc_array()类似:以krealloc_array()
的形式提供了一个用于调整数组大小的辅助工具。
对于大量的分配,你可以使用vmalloc()和vzalloc(),或者直接向页面分配器请求页面。由vmalloc和相关函数分配的内存在物理上是不连续的。
如果你不确定分配的大小对 `kmalloc` 来说是否太大,可以使用kvmalloc()及其派生函数。它将尝试用kmalloc分配内存,如果分配失败,将用 `vmalloc` 重新尝试。对于哪些GFP标志可以与 `kvmalloc`一起使用是有限制的;请看kvmalloc_node()参考文档。注意, `kvmalloc` 可能会返回物理上不连续的内存。
如果你需要分配许多相同的对象,你可以使用slab缓存分配器。在使用缓存之前,应该用
kmem_cache_create()或kmem_cache_create_usercopy()来设置缓存。如果缓存的一部分可能被复制到用户空间,应该使用第二个函数。在缓存被创建后,kmem_cache_alloc()和它的封装可以从该缓存中分配内存。
当分配的内存不再需要时,它必须被释放。你可以使用kvfree()来处理用 `kmalloc` 、 `vmalloc`和 `kvmalloc` 分配的内存。slab缓存应该用kmem_cache_free()来释放。不要忘记用kmem_cache_destroy()来销毁缓存。
3. 函数源码
- kmalloc函数源码
kmalloc函数在include/linux/slab.h中,代码如下:
/*** kmalloc - allocate kernel memory* @size: how many bytes of memory are required.* @flags: describe the allocation context** kmalloc is the normal method of allocating memory* for objects smaller than page size in the kernel.** The allocated object address is aligned to at least ARCH_KMALLOC_MINALIGN* bytes. For @size of power of two bytes, the alignment is also guaranteed* to be at least to the size.** The @flags argument may be one of the GFP flags defined at* include/linux/gfp_types.h and described at* :ref:`Documentation/core-api/mm-api.rst <mm-api-gfp-flags>`** The recommended usage of the @flags is described at* :ref:`Documentation/core-api/memory-allocation.rst <memory_allocation>`** Below is a brief outline of the most useful GFP flags** %GFP_KERNEL* Allocate normal kernel ram. May sleep.** %GFP_NOWAIT* Allocation will not sleep.** %GFP_ATOMIC* Allocation will not sleep. May use emergency pools.** Also it is possible to set different flags by OR'ing* in one or more of the following additional @flags:** %__GFP_ZERO* Zero the allocated memory before returning. Also see kzalloc().** %__GFP_HIGH* This allocation has high priority and may use emergency pools.** %__GFP_NOFAIL* Indicate that this allocation is in no way allowed to fail* (think twice before using).** %__GFP_NORETRY* If memory is not immediately available,* then give up at once.** %__GFP_NOWARN* If allocation fails, don't issue any warnings.** %__GFP_RETRY_MAYFAIL* Try really hard to succeed the allocation but fail* eventually.*/
static __always_inline __alloc_size(1) void *kmalloc(size_t size, gfp_t flags)
{if (__builtin_constant_p(size) && size) {unsigned int index;if (size > KMALLOC_MAX_CACHE_SIZE)return kmalloc_large(size, flags);index = kmalloc_index(size);return kmalloc_trace(kmalloc_caches[kmalloc_type(flags, _RET_IP_)][index],flags, size);}return __kmalloc(size, flags);
}
- vmalloc函数源码
vmalloc函数在mm/vmalloc.c中,代码如下:
/*** vmalloc - allocate virtually contiguous memory* @size: allocation size** Allocate enough pages to cover @size from the page level* allocator and map them into contiguous kernel virtual space.** For tight control over page level allocator and protection flags* use __vmalloc() instead.** Return: pointer to the allocated memory or %NULL on error*/
void *vmalloc(unsigned long size)
{return __vmalloc_node(size, 1, GFP_KERNEL, NUMA_NO_NODE,__builtin_return_address(0));
}
EXPORT_SYMBOL(vmalloc);
至此, 中移(苏州)软件技术有限公司面试问题中的“(6)vmalloc和kmalloc的区别?什么时候会用kmalloc、什么时候用vmalloc?”就回答并解析完毕了。
相关文章:
中移(苏州)软件技术有限公司面试问题与解答(7)—— kmalloc与vmalloc的区别与联系及使用场景
接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文参考以下文章: kmalloc与vmalloc如何选择 Vmalloc与kmalloc的区别 特此致谢! 本文对于中移…...

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)
客户端流程 客户端心跳与实例往服务端注册...

后端性能优化的一些总结
目录 1、背景 2、优化实现 2.1查询数据表速度慢 2.2调别人接口速度慢 2.3导入速度慢、 2.4导出速度慢的做出介绍 2.5统计功能速度慢 3、总结 1、背景 系统上线后,被用户反应系统很多功能响应时长很慢。用户页面影响速度有要求,下面针对查询数据表…...

【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】
升级openssl报错: openssl vesion openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 编译安装openssl1.1.1t当执行openssl version的时候,报上述错误,将编译到的…...

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析
本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案,开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞,该漏洞源于文件server/application/api/contr…...

JAVA处理类似饼状图占比和100%问题,采用最大余额法
前言: 在做数据统计报表的时候,有两种方式解决占比总和达不到100%或者超过100%问题。 第一种方式是前端echart图自带的算分框架。 第二种方式是java后端取处理这个问题。 现存问题: 前端不通过饼状图的方式去展示各个分类的占比累加和为100%问…...
MATLAB矩阵的操作(第一部分)
矩阵的基本知识 矩阵概念 矩阵(Matrix)在数学中是一个由复数或实数组成的矩形阵列,其元素按照行和列排列。矩阵的定义可以形式化地描述为: 一个 m 行 n 列的矩阵是一个有序的数表,其中包含 m*n 个数,可以…...

全面掌握Django的web框架Django Rest_Framework(一)
文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置(1)DRF需要以下依赖(2)创建django项目 4.序列化器的使用(1)创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…...

AOP+Redisson 延时队列,实现缓存延时双删策略
一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案,但不管是单独在修改数据库之前,还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式,即在删除缓存之后&…...

Hive中left join 中的where 和 on的区别
目录 一、知识点 二、测试验证 三、引申 一、知识点 left join中关于where和on条件的知识点: 多表left join 是会生成一张临时表。on后面: 一般是对left join 的右表进行条件过滤,会返回左表中的所有行,而右表中没有匹配上的数…...

LaTeX教程(001)-LaTeX文档结构(01)
LaTeX教程(001)- LaTeX \LaTeX LATEX文档结构(01) 说在前面 这是我本人学习《The LaTeX Companion》第三版的笔记,但并不是翻译。 书籍的第一章对 LaTeX \LaTeX LATEX及其历史进行了相当长的介绍,这是几乎每一本关于 LaTeX \LaTeX LATEX的书都会…...

SV-7041T 多媒体教学广播IP网络有源音箱
SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。同时它可以外接一个30W的无源副音箱,用在面积较大的场所。5寸进口全频低音喇…...
Linux文本三剑客awk经典案例
前言: AWK是一种专门用于文本处理的编程语言,它被广泛用于数据提取和报告生成,也是企业笔试面试常考的内容,以下34题是awk的用法案例,希望可以帮到你! 1.查看TCP连接状态 [rootnode1 ~]# netstat -nat | a…...

如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图三
Mermaid 系列 如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图一如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图二 1.如何创建甘特图 Gantt 甘特图以条形图的形式用作可视化表示。它有效地展示了项目的时间表,揭示了各个项目组件完成所需的持续时间…...
考研经验总结——政治篇
文章目录 一、前言二、学习情况三、最后 一、前言 不要提前,不要提前,不要提前, 我曾在暑假的时候上了7天左右的政治课,讲真话是很有趣的,并且对于自身的世界观、人生观和价值观的改善也是相当不错的,把我…...

春招秋招,在线测评到底难不难?
现在很多企业在春招的时候,都会有一个在线测评的环节,目的当然就是希望更加了解清楚毕业生的综合能力以及其他方面的素质,好让HR可以根据岗位筛选出能力达标的人才。所以,现在不少即将面对春招的大学毕业生,比较关心的…...

数学建模比赛中,使用大语言模型如chatgpt、文心一言该如何写Prompt(提示)?
在大型语言模型中,"prompt"(中文常译为“提示”或“引导”)是指提供给模型的输入文本,用于指示或引导模型产生特定的输出。它的作用主要是告诉模型用户想要得到什么样的信息或完成什么样的任务。 例如,在使…...

tcpdump 抓包无法落盘
文章目录 问题背景解决办法 问题背景 在嵌入式设备中(Linux系统),为了分析两个网络节点的通讯问题,往往需要用到tcpdump,抓一个.pcap的包在PC端进行分析。博主在实际操作中发现,抓包无法实时落盘。 解决办法 # 下面的命令是写在…...

【网站项目】066农家乐信息平台
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

idea/webstorm 创建Vue实例 Unresolved type Vue 处理方法
1.电脑本地安装node.js 官网下载 2. 其他: 未排除变量,前期试错(以下步骤配置了,但不确定对解决问题是否有帮助)...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...