Linux内核分析与应用4-内存管理

news2024/11/17 13:48:02

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看

留此记录,蜻蜓点水,可作抛砖引玉


alt

4.1 Linux内存管理机制

lscpu[2] 命令, 类似是优化后的 cat /proc/cpuinfo

alt
alt

实现虚拟内存的几种机制:

alt
alt

当 程序一旦跑起来,那就变成了一个进程

一个进程的用户地址空间由两个数据结构来描述, mm_structvma_area_struct ,前者对进程整个用户空间进行描述,后者对用户空间的各个内存区进行描述

  • 内存映射区(MMR,Memory Mapping Region)

  • 虚拟内存区(VMA)


对于mm_struct,最新版本的内核代码定义在[mm_types.h]这个文件中

alt
alt

对于vma_area_struct :

alt

mm_struct结构是由一个个VMA组成的

alt

参考<深入理解Linux内核>第8,9章




4.2 进程用户空间管理机制


写时复制技术(copy on write)

调用do_mmap()创建一个"虚存区"

虚存区分三种: 私有映射,共享映射,匿名映射

alt
alt

上图显示了该进程 各个区的 起始地址

alt

请页机制,实现虚存管理的重要手段.

当一个进程运行的时候,CPU访问的是用户空间的虚地址, Linux仅把当前要使用的少量页面装入到内存, 需要时通过请页机制将特定的页面调入到内存;当访问的页不在内存时,就产生一个页故障,并报告故障的原因.

alt

如果是编程引起的异常,而且还发生在内核态,那需要毫不含糊地杀死该进程; 如果发生在用户态,说明是一个无效的内存引用,程序要停止执行; 如果是一个真正的缺页引起的异常,而且有合法的权限,这时会进入到缺页异常处理程序

alt

do_page_fault()函数


用户进程访问内存 分析:

用户态进程独占 虚拟地址空间,两个进程的虚拟地址空间完全可能是相同的. 在访问用户态虚拟内存空间时,如果没有映射到物理地址,这时就需要通过请页机制发出缺页异常的请求, 缺页异常陷入内核,分配物理地址空间,与用户态虚拟地址空间就建立起了映射关系

alt
alt



4.3 物理内存的 分配与回收机制(上)


当我们说一个进程在执行的时候, 我们在说什么呢?

从操作系统角度看,一看进程最关键的特征,是其拥有独立的虚拟地址空间.

alt
alt
alt
alt

"请页机制":可以为进程请求物理内存

malloc()从堆中分配一块内存,并将首地址返回给用户.

alt

"低端内存"和"高端内存"

alt
alt
  • 伙伴算法: 负责大块连续物理内存的分配和释放,以页框为基本单位. 该机制可以避免外部碎片.

  • per-CPU页框高速缓存: 内核经常请求和释放单个页框,该缓存包含预先分配的页框,用于满足本地CPU发出的单一页框请求.

  • slab缓存: 服务小块物理内存的分配,并且它也作为高速缓存,主要针对内核中经常分配并释放的对象.

  • vmalloc机制: 使得内核通过连续的线性地址来访问非连续的物理页框,这样可以最大限度的使用高端物理内存.


slab分配机制 -- 分配小块内存

alt
alt


内核空间非连续内存区的分配

alt
alt

alt

最后都要调用"伙伴算法"


参考<深入理解Linux内核>第三版第八章


思考:

  1. 用户空间(进程)是否有高端内存概念?

  2. 64位 内核中有高端内存的说法吗?

  3. 在32位和64位系统上,用户进程能访问多少物理内存? 内核代码能访问多少物理内存?



4.4 物理内存的 分配与回收机制(下)


alt
alt

UMA架构与NUMA架构下的自旋锁(CLH锁与MCS锁)

Linux内核学习笔记:SMP、UMA、NUMA[3]

NUMA 的结构比 SMP 的结构更有优势,为什么现在的电脑不用 NUMA 的结构呢?[4]


alt
alt
alt
alt

从用户态到内核态的内存分配:


当用户程序通过系统调用,申请内存时,首先陷入内核,建立虚拟地址空间的映射,获得一块虚拟内存区VMA. 当进程对这块虚存区进行访问时,如果物理内存尚未分配,此时发生一个缺页异常,通过getfreepage申请一个或者多个物理页面,并将此物理内存和虚拟内存的映射关系写入页表.


思考:

在物理内存为1G的计算机中,能否malloc(1.6G)? 为什么?


参考资料

[1]

Linux 内核分析与应用: https://next.xuetangx.com/course/XIYOU08091001441/1516763

[2]

lscpu: https://blog.csdn.net/chenghuikai/article/details/72832016

[3]

Linux内核学习笔记:SMP、UMA、NUMA: https://blog.csdn.net/tiangwan2011/article/details/7298785

[4]

NUMA 的结构比 SMP 的结构更有优势,为什么现在的电脑不用 NUMA 的结构呢?: https://www.zhihu.com/question/19908227

本文由 mdnice 多平台发布

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

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

相关文章

IDEA在创建包时如何把包分开实现自动分层

IDEA在创建包时如何把包分开实现自动分层 文章目录 IDEA在创建包时如何把包分开实现自动分层一、为什么要把包分开二、建包时如何把包自动分开三、如何编写配置文件路径&#xff1f; 一、为什么要把包分开 一开始的时候&#xff0c;我也一直以为包连在一起和分开没什么区别&am…

二叉搜索树/二叉排序树/二叉查找树

文章目录 1.概念2.操作3.实现3.1框架3.2BSTree.h3.3test.cpp 1.概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;…

python 学习笔记(5)——SMTP 使用QQ邮箱发送邮件

目录 发送邮件 1、准备工作&#xff1a; 2、发送纯文本信息内容&#xff1a; 3、发送 HTML 格式的内容&#xff1a; 4、发送带附件的邮件&#xff1a; 5、群发&#xff08;一个邮件&#xff0c;发给多个人&#xff09;&#xff1a; 发送邮件 以下都 以 QQ邮箱 为发送方举…

敏捷开发方法管理项目,适应变化,引领未来

​敏捷开发方法是一种灵活且高效的项目管理方法&#xff0c;旨在应对不断变化的需求和快速发展的项目环境。使用敏捷开发方法可以帮助团队更好地应对不确定性&#xff0c;提高项目的质量和效率。以下是使用敏捷开发方法管理项目的具体步骤&#xff1a; 明确项目目标和范围 在…

算法通过村第六关-树白银笔记|层次遍历

文章目录 前言1. 层次遍历介绍2. 基本的层次遍历与变换2.1 二叉树的层次遍历2.2 层次遍历-自底向上2.3 二叉树的锯齿形层次遍历2.4 N叉树的层次遍历 3. 几个处理每层元素的题目3.1 在每棵树行中找出最大值3.2 在每棵树行中找出平均值3.3 二叉树的右视图3.4 最底层最左边 总结 前…

C高级day4(shell脚本)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.创建一个文件&#xff0c;给组用户可读权限&#xff0c;所属用户可写权限&#xff0c;其他用户可执行权限&#xff0c;使用if判断文件有哪些权限 #!/bin/bash touch 1 chmod 241 1 if [ -r 1 ] thenecho "文件…

为 DevOps 战士准备的 Linux 命令

点击链接了解详情 这篇文章将帮助理解DevOps工程师所需的大部分重要且经常使用的Linux命令。 要执行这些命令&#xff0c;你可以使用任何Linux机器、虚拟机或在线Linux终端来迅速开始使用这些命令。 系统信息命令&#xff1a; hostname - 显示系统主机的名称。 hostid - 显示…

openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema

文章目录 openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema66.1 背景信息66.2 注意事项66.3 操作步骤66.3.1 创建管理用户及权限schema66.3.2 使用schema66.3.3 schema的搜索路径66.3.4 schema的权限控制66.3.5 删除schema openGauss学习笔记-66 openGauss 数据库管…

Codeforces Round 827 (Div. 4) D 1e5+双重for循环技巧

Codeforces Round 827 (Div. 4) D 做题链接&#xff1a;Codeforces Round 827 (Div. 4) 给定一个由 n个正整数 a1,a2,…,an&#xff08;1≤ai≤1000&#xff09;组成的数组。求ij的最大值&#xff0c;使得ai和aj共质&#xff0c;否则−1&#xff0c;如果不存在这样的i&#…

github 创建自己的分支 并下载代码

github创建自己的分支 并下载代码 目录概述需求&#xff1a; 设计思路实现思路分析1.进入到master分支&#xff0c;git checkout master;2.master-slave的个人远程仓库3.爬虫调度器4.建立本地分支与个人远程分支之间的联系5.master 拓展实现 参考资料和推荐阅读 Survive by day…

Python基于Flask的招聘信息爬取、招聘信息可视化系统

招聘信息可视化系统 一、介绍 此系统是一个实时分析招聘信息的系统&#xff0c;应用Python爬虫、Flask框架、Echarts、VUE等技术实现。 二、系统运行图 1、数据概览 将爬取到的数据进行展示&#xff0c;点击公司信息和职位信息可以跳转到相应的网址&#xff0c;支持多条件…

这一次,我顿悟了

大家好&#xff0c;我是苍何。昨晚和编程导航 星球嘉宾也是我的引路人闫&#xff08;yn&#xff09; 小林大佬&#xff0c;畅聊了 4 个 小时&#xff0c;至今内心还是久久不能平静。 小林和我一样是跨界转行&#xff0c;他是医学院毕业&#xff0c;大二开始自学编程&#xff0…

【分布式】分布式事务:2PC

分布式事务的问题可以分为两部分&#xff1a; 并发控制 concurrency control原子提交 atomic commit 分布式事务问题的产生场景&#xff1a;一份数据被分片存在多台服务器上&#xff0c;那么每次事务处理都涉及到了多台机器。 可序列化&#xff08;并发控制&#xff09;&…

软件设计师学习笔记10-死锁资源数计算+进程资源图+段页式存储

目录 1.死锁资源数计算 1.1死锁 1.2进程管理与死锁资源的计算 2.进程资源图 3.段页式存储 3.1页式存储 3.1.1页式存储组织 3.1.2完整页表及页面淘汰原则 3.1.3页面置换算法(了解一下) 3.2段式存储 1.死锁资源数计算 1.1死锁 (1)死锁的概念&#xff1a;所谓死锁&…

C++-day4

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring> using namespace std; class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10…

mac 13.x 打开第三方应用,提示已损坏无法打开

前排提示&#xff0c;不一定有效 1、先在终端执行下面这个&#xff0c;因为要提权&#xff0c;输入自己的密码 sudo xattr -r -d com.apple.quarantine 具体应用 # 具体应用是一个路径&#xff0c;拖入 访达——应用程序——第三方应用 到终端就行 # sudo xattr -r -d com.app…

在Widows系统下载安装Ubuntu

1.下载VirtualBox Oracle VM VirtualBox 2.下载安装microsoft visual c 2019 进入百度&#xff1a;百度一下&#xff0c;你就知道 出现下面这个页面时&#xff0c;直接点击修复&#xff0c;点击修复后&#xff0c;出现【重新启动】按钮&#xff0c;点击【重新启动】&#xff…

微信小程序基础加强总结

本篇文章给大家带来了关于微信小程序的相关问题&#xff0c;其中主要介绍了一些基础内容&#xff0c;包括了自定义组件、样式隔离、数据、方法和属性等等内容&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 1、自定义组件 1.1、创建组件 在项目的根目录中&…

电机⽮量控制、直接转矩控制、参数辨识

直接转矩控制是一种控制异步电动机转矩的方式&#xff0c;其基本原理是测量和控制异步电动机定子电流矢量。在直接转矩控制中&#xff0c;定子磁链和转子磁链矢量可以表示为&#xff0c;并通过测量空间电角度的大小&#xff0c;来决定电磁转矩&#xff0c;进而实现直接转矩控制…

Java8实战-总结25

Java8实战-总结25 用流收集数据归约和汇总查找流中的最大值和最小值汇总连接字符串广义的归约汇总 用流收集数据 归约和汇总 重用一下之前的例子&#xff1a;包含一张佳肴列表的菜单。 就像刚刚看到的&#xff0c;在需要将流项目重组成集合时&#xff0c;一般会使用收集器(S…