中移(苏州)软件技术有限公司面试问题与解答(6)—— Linux内存管理之内存规整

news2024/12/24 2:19:31

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录

本文内容参考:

linux内存管理笔记(四十二)----内存规整

特此致谢!

本文对于中移(苏州)软件技术有限公司面试问题中的“Linux内存规整有哪几种情况,即内存规整有几种方式?内存规整是主动发生还是被动发生?”进行解答与解析。

一、为什么需要内存规整?

内存可以说是计算机系统中最为宝贵的资源了,基本属于越多越不嫌多、永远感觉不够用。当系统长时间运行后,难免会遇到内存紧张的时候,这时候就需要内核将那些不经常使用的内存页面进行回收、或者将那些可以迁移的页面进行内存规整,从而腾出连续的物理内存页面供后续分配和使用。

本回我们只围绕内存规整展开讲解。伙伴系统是以页为单位管理内存,内存碎片也是基于页面,即由大量离散且不连续的页面组成,这就是外部碎片。所以内核对于内存碎片化,需要重新规划调整(迁移),让原本不连续的物理页面变得连续,这就是内存规整技术产生的原因。

二、内存规整的基本原理

Linux使用的是虚拟地址,以提供进程地址空间的隔离。它还带来一个好处,就是像vmalloc这种分配,不用太在乎实际使用的物理内存的分配是否连续,因此也就弱化了物理内存才会面临的内存碎片化问题。但是如果使用的时kmalloc,则要求物理内存必须连续,系统中空闲内存的总量(比如空闲时10个page),大于申请的内存大小,但是没有连续的物理内存,我们就可以通过migrate(迁移/移动)空闲的page frame,来聚合形成满足需求的连续的物理内存。

对于内存规整技术,其核心的思想是把内存页面按照可移动可回收不可移动等特性进行分类。详细说明如下:

  • 可移动的页面:是指用户程序分配的内存,移动这些页面仅仅是需要修改页表映射关系,代价很低。
  • 可回收的页面:是指不可以移动但可以释放的内存。
  • 不可移动的页面:目前的内核使用的物理页面。

下面来演示一下规整(compaction)算法的工作原理。代码中会运行两个独立的扫描;一个扫描从区域的底部(bottom)开始(如下图所示从左往右进行扫描),一边扫描一边将可以移动(movable)的页框记录到一个列表中:

另一个扫描从区域的顶部(top)开始(如下图所示从右往左),创建另一个列表,用于记录可作为页框迁移目标的空闲页框位置:

最终,两个扫描会在域中间的某个位置相遇(意味着扫描结束)。

这里顺带提一下,这种方式是一个经典的算法,同时也是一道经典的面试题(虽然不在中移的面试题中,但笔者印象中遇到过两次,一次是将近十年之前的一家小公司的面试,另一次是前不久小米的面试)。

此时,剩下的工作主要是调用页面迁移(page migration)功能(从这里我们可以看到页面迁移的功能已经不仅仅只针对 NUMA 系统)将左边扫描得到的已分配的页框上的内容转移到右边空闲的空间中,产生的结果如下如下所示,规整后的内存看上去是不是很整齐?

所以Linux的物理页面规整机制,类似于磁盘整理,主要是应用了内核的页面迁移机制,是一种将可移动页面进行迁移后腾出连续物理内存的方法。

三、 内存规整触发途径

讲完内存规整的必要性以及基本原理之后,终于来到了本次主题:内存规整有几种方式(情况)?是主动发生还是被动发生?

Linux内核中触发内存规整途径有如下三种途径:

  • 手动触发

通过写1到/proc/sys/vm/compact_memory节点,会手动进行内存规整。它会扫面系统中所有的内存节点上的zone,对每个zone都会做一次内存规整。

以下是笔者在自己的Ubuntu虚拟机上手动触发内存规整的log:

ph@ph-virtual-machine:~$ ls /proc/sys/vm/
admin_reserve_kbytes         dirtytime_expire_seconds   max_map_count              mmap_rnd_compat_bits      overcommit_memory              unprivileged_userfaultfd
compaction_proactiveness     dirty_writeback_centisecs  memfd_noexec               nr_hugepages              overcommit_ratio               user_reserve_kbytes
compact_memory               drop_caches                memory_failure_early_kill  nr_hugepages_mempolicy    page-cluster                   vfs_cache_pressure
compact_unevictable_allowed  extfrag_threshold          memory_failure_recovery    nr_overcommit_hugepages   page_lock_unfairness           watermark_boost_factor
dirty_background_bytes       hugetlb_optimize_vmemmap   min_free_kbytes            numa_stat                 panic_on_oom                   watermark_scale_factor
dirty_background_ratio       hugetlb_shm_group          min_slab_ratio             numa_zonelist_order       percpu_pagelist_high_fraction  zone_reclaim_mode
dirty_bytes                  laptop_mode                min_unmapped_ratio         oom_dump_tasks            stat_interval
dirty_expire_centisecs       legacy_va_layout           mmap_min_addr              oom_kill_allocating_task  stat_refresh
dirty_ratio                  lowmem_reserve_ratio       mmap_rnd_bits              overcommit_kbytes         swappiness
ph@ph-virtual-machine:~$ 
ph@ph-virtual-machine:~$ ls /proc/sys/vm/compact_memory 
/proc/sys/vm/compact_memory
ph@ph-virtual-machine:~$ 
ph@ph-virtual-machine:~$ echo 1 > /proc/sys/vm/compact_memory 
bash: /proc/sys/vm/compact_memory: Permission denied
ph@ph-virtual-machine:~$ 
ph@ph-virtual-machine:~$ sudo echo 1 > /proc/sys/vm/compact_memory 
bash: /proc/sys/vm/compact_memory: Permission denied
ph@ph-virtual-machine:~$ ls -l /proc/sys/vm/compact_memory 
--w------- 1 root root 0  1月 30 15:47 /proc/sys/vm/compact_memory
ph@ph-virtual-machine:~$ sudo su
[sudo] password for ph: 
root@ph-virtual-machine:/home/ph# echo 1 > /proc/sys/vm/compact_memory 
root@ph-virtual-machine:/home/ph# 
  •  kcompactd内核线程

Linux内核会为每个NUMA节点分配一个kswapd内核线程,用于回收不经常使用的页面。同时,和页面回收kswapd内核线程一样,还会为每个内存节点创建一个kcompactd内核线程(名称为"kcompactd0",“kcompactd1"等),用于内存的规整。

NUMA节点描述符struct pglist_data中的struct task_struct *kcompactd成员,用于指向Linux内核为NUMA节点分配的kcompactd进程。而wait_queue_head_t kcompactd_wait成员用于kcompactd进程周期性规整内存时使用到的等待队列。

  • 直接内存规整

和页面回收一样,当页面分配器发现在低水位的情况下无法满足页面分配时,会进入慢速路径,在慢速路径中,除了唤醒kswapd内核线程外,还会调用函数__alloc_pages_direct_compact(),尝试整合出一大块空闲内存。

到此就可以比较完美地回答面试的问题了,Linux内存规整有三种情况即方式。其中,kcompactd内核线程以及直接内存规整方式属于被动发生,而手动触发方式属于主动发生(从人的角度看,如果从系统的角度看刚好反过来)。

当然,关于内存规整与内存回收,还有太多细节以及代码需要深入。不过此处重点解答回答面试题,因此在这里不做展开了。关于这方面的详细内容,笔者将会在《Linux内存管理有什么》专栏中予以全面解析。

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

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

相关文章

安卓视图基础

目录 设置视图的宽高 设置视图的间隔 设置视图的对齐方式 设置视图的宽高 设置视图的间隔 设置视图的对齐方式 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"a…

【日常问题】Failed to enable unit: Unit file docker.service does not exist.

Failed to enable unit: Unit file docker.service does not exist. 1. 问题原因 笔者问题的产生是因为在ubuntu20.04下采用snapd安装的docker&#xff0c;因此 systemctl restart docker.servicesystemd并不能找到守护进程docker.service 同时使用docker命令时还会产生若干…

asp.net 404页面配置、 asp.net MVC 配置404页面、iis 配置404页面,指定404错误页面,设置404错误页面

通过标题的三个问题 1、asp.net 404页面配置、 2、asp.net MVC 配置404页面、 3、iis 配置404页面&#xff1b; 可以看出&#xff0c;这是一篇了不得的问题&#xff0c;并进行全面讲解&#xff1b; 除了围绕以上三个核心问题外&#xff0c;我们也对以下2个核心场景也作出分析…

EDI报文到Excel转换方案详解

EDI目前已广泛应用于电子、物流、汽车、零售等行业。 越来越多的交易伙伴要求建立EDI连接&#xff0c;通过EDI来对接上下游交易伙伴&#xff0c;收发业务单据。 当我们与新的交易伙伴建立EDI连接时&#xff0c;有多种实施方案可供选择&#xff0c;如果您的单据量较少&#xf…

Kore.ai获10亿元融资,提供定制化类ChatGPT助手

1月31日&#xff0c;生成式AI和企业对话平台Kore.ai在官网宣布&#xff0c;获得1.5 亿美元&#xff08;约10.7亿元&#xff09;融资。本次由FTV Capital 领投&#xff0c;英伟达等跟投。 Kore.ai主要提供银行、医疗、零售、营销、人力资源等多种领域的&#xff0c;定制化类Cha…

哪个牌子的头戴式耳机好?推荐性价比高的头戴式耳机品牌

随着科技的不断发展&#xff0c;耳机市场也呈现出百花齐放的态势&#xff0c;从高端的奢侈品牌到亲民的平价品牌&#xff0c;各种款式、功能的耳机层出不穷&#xff0c;而头戴式耳机作为其中的一员&#xff0c;凭借其优秀的音质和降噪功能&#xff0c;受到了广大用户的喜爱&…

微信公众号在线客服源码系统,开发组合PHP+MySQL 带完整的安装代码包以及搭建教程

移动互联网的快速发展&#xff0c;微信公众号成为了企业与用户之间的重要沟通桥梁。为了满足企业对微信公众号在线客服的需求&#xff0c;小编给大家分享一款基于PHP和MySQL的微信公众号在线客服源码系统。这套系统能够帮助企业快速搭建自己的微信公众号在线客服平台&#xff0…

༺༽༾ཊ—Unity之-02-抽象工厂模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用 抽象工厂模式 创建 人物与宠物 模型&#xff0c; 首先资源商店下载 人物与宠物…

中科大计网学习记录笔记(二):网络核心

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

AI 时代如何增强数据保护,来听 Commvault 怎么说

在数据赛道持续火爆&#xff0c;全行业都重视数据产生的价值的时候&#xff0c;数据泄露与窃听、篡改、加密等勒索软件攻击也日益严重。截至 2023 年 10 月&#xff0c;全球勒索软件攻击数量同比增长了 37.75%。 已经连续 12 次被权威分析机构 Gartner 评为企业备份和恢复软件解…

protobuf之带有repeated成员实例使用(四)

1protoc转换为.h和.cc文件 protobuf之实例使用&#xff08;三&#xff09;-CSDN博客 2 .proto文件 syntax "proto2"; package contacts;//定义联系人message message PeopleInfo {required string name 1; //姓名required int32 age 2; //年龄requir…

FPGA高端项目:Xilinx Artix7系列FPGA 多路视频缩放拼接 工程解决方案 提供4套工程源码+技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案我已有的FPGA视频拼接叠加融合方案本方案的Xilinx Kintex7系列FPGA上的ov5640版本本方案的Xilinx Kintex7系列FPGA上的HDMI版本 3、设计思路框架设计框图…

【服务端性能测试】测试方案设计(实操需要准备的内容)

一般性能测试流程都是&#xff1a;获取测试需求——>测试需求分析——>测试方案设计——>压测环境搭建&#xff08;目前是线上&#xff09;——>测试数据准备——>测试脚本准备、调试——>测试脚本执行——>监控数据录入——>测试结果跟开发一起分析—…

springboot141夕阳红公寓管理系统的设计与实现

基于Spring Boot的夕阳红公寓管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的…

如何在树莓派安装运行Nginx实现无公网ip环境访问内网静态网站

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

从零开始复现GPT2(四):训练代码的实现

源码地址&#xff1a;https://gitee.com/guojialiang2023/gpt2 GPT2 模型Configuration类定义 Recorder训练框架Trainer训练代码GPT2TrainingSpec 类train_gpt2_model 函数add_subparser 函数 模型 Configuration 这段代码定义了一个名为 TrainConfig 的 Python 类&#xff0c…

TypeScript(十) Map对象、元组、联合类型、接口

1. Map对象 1.1. 简述 Map对象保存键值对&#xff0c;并且能够记住键的原始插入顺序。   任何值都可以作为一个键或一个值。 1.2. 创建 Map 使用Map类型和new 关键字来创建Map&#xff1a; 如&#xff1a; let myMap new Map([["key1", "value1"],[&…

docker私有库

1.registry私有仓库 拉取registry镜像 docker pull registry 修改docker配置文件并重启 vim /etc/docker/daemon.json {"insecure-registries": ["172.16.23.23:5000"], #添加&#xff0c;注意用逗号结尾"registry-mirrors": ["ht…

网络编程之ip地址

目录 1、概念&#xff1a; 2、所属的tcp/ip协议的层 3、IP地址查询 &#xff08;1&#xff09;Linux &#xff08;2&#xff09;windows 4、IP地址结构组成及分类 &#xff08;1&#xff09;组成&#xff08;网络位主机位&#xff09; &#xff08;2&#xff09;分类 1、…

Linux进程控制:进程创建与等待

目录 一、fork函数 1.1fork函数的调用与功能 1.2fork函数的返回值与写实拷贝 1.3fork的常规用法与失败原因 二、进程终止 2.1进程的退出场景和常见退出方法 2.2_exit函数与exit函数 2.2.1_exit函数 2.2.2exit函数 2.3return退出 三、进程等待 3.1wait及waitpid的方法…