Linux内核学习笔记——堆内存“懒/惰性”分配。
创始人
2024-06-02 08:04:38
0

目录

  • 背景
    • 问题1 calloc如何与内核交互的呢?
    • 问题2 malloc和calloc区别是什么?
  • 惰性分配
  • 缺页处理
    • 缺页错误的分类处理
    • 缺页错误出现的原因

背景

Linux内核学习笔记——页表的那些事。
接问题3:内存申请,软件是不是会频繁陷入内核创建新页表条目。

上文说到 libc库在进程创建的时候,就已经把堆空间用内存池的方式管理起来,在进程分配小于128kb的内存时,根本不需要内核进行任何操作,因为堆这个段的虚拟内存早就映射好了物理内存。

那新问题是:

问题1 calloc如何与内核交互的呢?

如果大于大块内存比如说>128KB、或者说使用calloc、realloc、内存清零申请函数,这个是如何与堆存储交互的呢

个人理解:
calloc可以从操作系统获得保证为零的页面,从而完全避免在用户空间中写入零。(特别是对于大型分配,否则如果有任何大小合适的空闲列表条目,它将从空闲列表中清零。)这就是懒惰的来源。所以你的页面将是新鲜的mmap(MAP_ANONYMOUS),不受用户空间的影响。读取它会触发一个软页面错误,即写时复制将它映射到一个共享的物理页面零。

写入该页面/其中一个页面(作为第一次访问,或者在它被 CoW 映射到零页面之后)将软页面错误,并且 Linux 的页面错误处理程序将分配一个新的物理页面并将其清零。libc 包装器没有在那里做任何特殊的重试;所有的逻辑(检查目标页面存在和对待它就像一个软或硬页面错误)发生在内核的实现里面read,作为其一部分copy_to_user。(基本上是从内核内存到用户空间的 memcpy-EFAULT如果您向内核传递一个您甚至在逻辑上都不拥有的指针,则可以通过权限检查使其返回。即,如果您从用户空间访问它,则会出现段错误的内存。

对于页表硬件,O/S可以使用许多巧妙的技巧之一是用户空间堆内存的懒分配。应用程序使用sbrk()系统调用向内核请求堆内存。 在给出的内核中,sbrk()分配物理内存并将其映射到进程的虚拟地址空间。内核为大型请求分配和映射内存可能需要很长时间。比如,一个GB包含262144个4096字节的页面,这是一个巨大的配置数量。 此外,一些程序分配的内存比实际使用的要多(比如,实现稀疏数组),或者为了更好的使用,而分配较多的内存。 为了允许sbrk()在这些情况下更快地完成任务,复杂的内核会惰性地分配用户内存。 也就是说,sbrk()不分配物理内存,而只是记住分配了哪些用户地址,并在用户页表中将这些地址标记为无效。 当进程第一次尝试使用任何给定的惰性分配的内存页时,CPU会产生一个页面错误,内核通过分配物理内存、清零和映射来处理这个错误。

问题2 malloc和calloc区别是什么?

共同点:

  1. L都是在堆区上面开辟内存
  2. 开辟的空间可以不指定用来存储什么类型的数据
  3. 分配都是虚拟内存

区别:

  1. malloc从原理上讲能分配到的虚拟内存可能大于实际RAM大小虚拟内存(在程序实际触摸它之前,malloc分配的内存不受实际内存的支持)。
  2. calloc将内存初始化为0,因此可以确保操作系统已经使用实际RAM(或交换)支持分配。尝试使用calloc ,除非你的交换文件/分区大到足以满足请求,否则它很可能会让你内存不足

惰性分配

Lazy allocation simply means not allocating a resource until it is
actually needed. This is common with singleton objects, but strictly
speaking, any time a resource is allocated as late as possible, you
have an example of lazy allocation.

惰性分配:真正需要的时候再分配空间。

By delaying allocation of a resource until you actually need it, you
can decrease startup time, and even eliminate the allocation entirely
if you never actually use the object. In contrast, you could
pre-allocate a resource you expect to need later, which can make later
execution more efficient at the expense of startup time, and also
avoids the possibility of the allocation failing later in program
execution.

减少响应时间,如果从来没有用到这个对象的情况下可以减少分配。

当进程第一次尝试使用任何给定的惰性分配的内存页时,CPU会产生一个页面错误,内核会进入缺页处理函数,内核通过分配物理内存、清零和映射来处理这个错误。

缺页处理

回顾一下MMU寻址过程

当CPU给MMU传新虚拟地址之后,MMU先去问TLB那边有没有,如果有就直接拿到物理地址发到总线给内存,齐活。

TLB容量比较小,难免发生Cache Miss,这时候MMU还有保底的老武器页表 Page Table,在页表中找到之后MMU除了把地址发到总线传给内存,还把这条映射关系给到TLB,让它记录一下刷新缓存。

TLB容量不满的时候就直接把新记录存储了,当满了的时候就开启了淘汰大法把旧记录清除掉,来保存新记录,彷佛完美解决了问题。
在这里插入图片描述
设想CPU给MMU的虚拟地址在TLB和Page Table都没有找到对应的物理页帧或者权限不对,该怎么办呢?

没错,这就是缺页异常Page Fault,它是一个由硬件中断触发的可以由软件逻辑纠正的错误

假如目标内存页在物理内存中没有对应的页帧或者存在但无对应权限,CPU 就无法获取数据,这种情况下CPU就会报告一个缺页错误。

由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler 处理。

在这里插入图片描述缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容。

缺页错误的分类处理

缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理:

  • Hard Page Fault

也被称为Major Page Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的页帧,需要CPU打开磁盘设备读取到物理内存中,再让MMU建立VA和PA的映射。

  • Soft Page Fault

也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。

  • Invalid Page Fault

翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报segment fault错误中断进程直接挂掉。

在这里插入图片描述

缺页错误出现的原因

不同类型的Page Fault出现的原因也不一样,常见的几种原因包括:

  • 非法操作访问越界

这种情况产生的影响也是最大的,也是Coredump的重要来源,比如空指针解引用或者权限问题等都会出现缺页错误。

  • 使用malloc新申请内存

malloc机制是延时分配内存,当使用malloc申请内存时并未真实分配物理内存,等到真正开始使用malloc申请的物理内存时发现没有才会启动申请,期间就会出现Page Fault。

  • 访问数据被swap换出

物理内存是有限资源,当运行很多进程时并不是每个进程都活跃,对此OS会启动内存页面置换将长时间未使用的物理内存页帧放到swap分区来腾空资源给其他进程,当存在于swap分区的页面被访问时就会触发Page Fault从而再置换回物理内存。
在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...