深入理解Linux内存分配

注意,这里的PAGE_OFFSET指的就是3G(针对x86位系统).

与页面分配系函数一样, _kmalloc_函数申请的内存也处于物理内存映射区域,在物理上是连续的。 _Kmalloc_函数是slab分配器提供的分配内存的接口,slab是什么?这里不去具体讲slab分配原理,想详细了解的slab可以参考这里. 简单说明一下:slab是为了避免内部碎片使得一个页面内包含的众多小块内存可独立被分配使用,是为分配小内存提供的一种高效机制。追踪kmalloc函数,可以发现,它最终还是调用前面提到的
__ _alloc_pages()_函数。既然 _kmalloc_基于slab实现,而slab分配机制又不是独立的,本身也是在以页面为单位分配的基础上来划分更细粒度的内存供调用者使用。就是说系统先用页分配器分配以页为最小单位的连续物理地 址,然后 _kmalloc_再在这上面根据调用者的需要进行切分。

既然slab是为了解决内部碎片的问题,那想必也有一个解决外部碎片的机制(注:外部分片是指系统虽有足够的内存,但却是分散的碎片,无法满足对大块”连续内存”的需求)。没错,伙伴关系系统就是这么一个机制。伙伴关系系统提供 _vmalloc_来分配非连续内存,其分配的地址限于上述说的 _vmalloc_start~vmalloc_end_之间。这些虚拟地址与物理内存没有简单的位移关系,必须通过内核页表才可转换为物理地址或物理页。它们有可能尚未被映射,在发生缺页时才真正分配物理页面。

说到这里,还有一个关键函数没提, kmem_cache_allockmem_cache_alloc_也是基于slab分配器的一种内存分配方式,适用于反复分配同一大小内存块的场合。首先用 _kmem_cache_create_创建一个高速缓存区域,然后用 _kmem_cache_alloc_从该高速缓存区域获取新的内存块。 _kmem_cache_alloc_分配固定大小的内存块。 _kmalloc_则是在 _kmem_cache_create_的基础实现的,其分配动态大小的内存块,查看源码可以发现 _kmalloc_函数中会有一段代码块转向调用 _kmem_cache_alloc

static inline void *kmalloc(size_t size, gfp_t flags)

{

if (__builtin_constant_p(size)) {

int i = 0;

#define CACHE(x) \

if (size

Original: https://www.cnblogs.com/alantu2018/p/9177356.html
Author: AlanTu
Title: 深入理解Linux内存分配

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/23025/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux命令——gdisk、fdisk、partprobe

    MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区 gdisk、gdisk这两个命令参数不需要特殊记忆,进入命令后分别按? m会提示下一步如何操作。 分区个数限制 …

    Linux 2022年8月24日
    0196
  • linux 中传入上一条命令的参数 !$

    使用!$可以将上一条命令的参数传入,例如 vi ~/.bashrc source !$ 就等同于 source ~/.bashrc 联系方式:emhhbmdfbGlhbmcxOTk…

    Linux 2022年8月11日
    0165
  • Centos7 无法上网问题

    最近在VMware虚拟机里玩Centos,装好后发现上不了网。经过一番艰辛的折腾,终于找到出解决问题的方法了。最终的效果是无论是ping内网IP还是ping外网ip,都能正常pin…

    Linux 2022年11月5日
    0110
  • Redis Sentinel实现的机制与原理详解

    Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案。实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署。 它…

    Linux 2022年9月14日
    073
  • 卡尔曼滤波(Kalman filter)(不完全介绍)

    1. Kalman filter基本介绍 卡尔曼滤波(Kalman filter)是一种高效的自回归滤波器,它能在存在诸多不确定性情况的组合信息中估计动态系统的状态,是一种强大的、…

    Linux 2022年11月7日
    087
  • Linux系统产生随机数/dev/random 和 /dev/urandom

    1. 基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如…

    Linux 2022年8月20日
    0170
  • linux下启动和关闭tomcat服务的方式

    Linux下tomcat服务的启动、关闭与错误跟踪,通常通过以下几种方式启动关闭tomcat服务: 切换到tomcat主目录下的bin目录 生产模式:方式一:直接启动 ./star…

    Linux 2022年8月20日
    0125
  • git log –after 时间点的小缺陷

    我们经常会使用git log 加一个时间段来获取某段时间的提交记录,比如获取从2022年6月1号到现在的记录,我们常用的是git log –after=”2…

    Linux 2022年8月30日
    0184
  • j通过java程序执行linux命令

    通过一些linux可以进行操作,但是web上如何触达linux,这里可以使用java的controller进行中转,这里写了一个方式,但是不太符合领导需要,但是也是自己学习的一个小…

    Linux 2022年8月24日
    0124
  • Ubuntu 备份系统为ISO镜像 & 解决ISO限制4GB大小 & Clone当前系统到其他电脑

    看标题,标题涵盖了3个部分, Ubuntu 备份系统为ISO镜像, 解决ISO限制4GB大小 , Clone当前系统到其他电脑 我们就从三个部分说起. Ubuntu 备份系统为IS…

    Linux 2022年8月26日
    0300
  • DDR4 SDRAM -时序参数小册子

    如前所述,大神的原文链接如下:https://www.systemverilog.io/ddr4-timing-parameters-cheatsheet 参数 功能 ACTIVA…

    Linux 2022年10月18日
    0117
  • linux设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C…

    Linux 2022年8月11日
    073
  • opencv

    识别图片条码位置案例: import time import numpy as np import glob import os from PIL import Image, Im…

    Linux 2022年11月8日
    0101
  • Docker学习笔记

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 Docker概述 Docker学习链接 官网链接:Home – Docker Docker与虚拟机比较 虚拟化技术 …

    Linux 2022年9月10日
    0117
  • 如何提升git clone的速度

    一、有代理 在你的代理软件高级设置中,有 socket5 代理端口,下面的命令中的端口用的你软件中的端口。 https 方式 clone 代码 git config –globa…

    Linux 2022年8月30日
    0135
  • PyTorch 介绍 | 快速开始

    本节介绍有关机器学习常见任务重的API。请参阅每一节的链接以深入了解。 Working with data PyTorch有两个有关数据工作的原型: torch.utils.dat…

    Linux 2022年11月12日
    0114
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总