从malloc到跑路

news2025/1/31 8:24:51

当我还是一个懵懂无知的少年时,内心也曾升起这样的疑问这内存咋来的捏❓

有个帅气的小哥哥给我甩了一篇博客:对,就是这篇,看完后总感觉意犹未尽,似乎少了点什么的样子。。。

还是从malloc开始

  1. 如果申请的内存小于64B,先在当前进程的空闲块链表中查找,找到合适的就返回;
  2. 否则如果小于512B,就尝试合并碎片块,内存就像😈,挤挤还是有的;
  3. 但也有挤不出来的时候,就尝试处理最近刑满释放的块,size完全匹配就直接返回;
  4. 还没有怎么办呢?鲁迅说过:如果大于128KB,就找小弟要(mmap);如果小于128KB,也找小弟要(brk)

给系统打call

 :喂,内核吗!再搞点内存来~

“这。。不是刚给过吗,怎么又来要,先给个假的吧,反正你不急着用🤓!”

内核并没有立即分配物理内存,而是先返回虚拟内存给上层,真正分配要等有人往这块地址中写数据才开始。

迫不得已

不久之后,不知道哪个倒霉蛋开始往那个假地址写数据了,正好一脚踩中了内核埋的陷阱——缺页中断!

具体情况是这样的:上面派人拿着那个虚拟地址和数据,来内核层写入。写入的时候会分析虚拟地址的合法性(没错,就是自己给出去的😭),尝试计算出物理内存的地址,发现页表中映射关系不存在,就触发了缺页中断!

:“没办法了额,这次真的得给他了,不然说不过去了。”

伙伴算法

底层分配物理内存使用kmalloc(),大块通过伙伴算法分配,内核用这个算法维护了一堆块,就像这样的:

 

伙伴算法分配器管理的空闲列表,分别为2^0 ~ 2^10个页, 即4KB~1MB。

申请空间依次从小到大在空闲列表上匹配,没找到就往下一个找,分割下一个大块,一部分返回,另一部分挂在对应链表上;

两个具有相同大小、物理地址连续、且从同一个大块中拆出来的块叫伙伴。

 

释放的时候先检查对应size的链表中是否有伙伴,有就合并;然后往下一个size的链表中找,继续检查伙伴合并,直到没有伙伴或者合并为了最大块,再把块挂到对应size的链表上;

因为伙伴的块大小都是固定的,能分能合,所以不存在外碎片问题。

slab/slub分配器

slab分配器也叫slab层,小块且需频繁分配释放的通过slab层分配,slab通常为2^n字节。slab提前分配好固定size的块,挂在链表上,分为已满列表、部分满、空闲,分配时先从部分满列表分配,没有则从空闲列表分配,再没有则开辟一个新的空闲列表分配。

slab缓存队列管理复杂,其用于管理内存的数据结构本身开销较大,在其基础上又做了改进,就有了slub:

        slub可以动态调整内存块大小(类似伙伴算法),支持合并小内存块为较大内存块,减少外碎片;

        slub为每cpu维护一个本地缓存,只有本地缓存没有空闲,才向全局缓存申请,可以减少线程间竞争。

对于应用层老大的内存需求,不敢不重视,所以都是按页分配内存,也就是是通过伙伴算法分配了,slab/slub分配器一般是内核自己内部用~

页表

一个页是4KB,一台机器如果有4GB内存的话,有多少个页?

1048576!

怎么把这些页管理起来呢?

 我管理页的地址不就好了😋:

一个PTE(页表项)占4B,标识一页物理内存的起始地址,1024个PTE组成一张页表,一张页表大小也正好是4KB,可以维护1024*4KB个页的内存(4MB);

这样只需要1024个页表就能管理好高达4GB的内存!可是,这1024个页表也有点多,该怎么管理呢?类似地,我管理页表的地址不就好了😋:

一个PDE(页目录项)占4B,标识一张页表的起始地址,1024个PDE组成一张页目录表,一张页目录表大小也正好是4KB,可以维护1024*4MB内存,即4GB。这样,我只需要记录顶级的页目录表的起始地址就可以了,这个就叫页基址。每cpu都给他一个寄存器,存这个页目录基址,这样cpu访问进程的页就更快啦~

从虚拟地址到物理地址

虚拟地址也叫线性地址,高10位表示页目录项偏移,最高级页目录基址 + 高10位 * 4B 即为页目录项地址;

页目录项里记录了对应页表基地址,页表基地址 + 中10位 * 4B 即为物理页地址;

物理页地址 + 低12位 即为真正的物理地址,这里映射操作由MMU硬件(内存管理单元)自动计算,快到起飞🛫~

swap

    当然了,虚拟内存也是有限的,在物理内存不足时,内核会将不常用的页换出到磁盘上的swap分区,需要访问时再换入内存。

好像有点扯远了,刚刚在伙伴算法分配器那里,好像没有找到空闲内存页哎~

跑路?

怎么办,交不了差,难道要我跑路?

是的,当系统内存不足时,内核会使用 OOM(Out of Memory)机制来释放一些内存。通常情况下,内核会杀掉低优先级进程以释放内存。这种情况下,释放内存的过程被称为 OOM-kill。 

再逼我,我疯起来,连自己都杀!🤪

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

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

相关文章

“配置DHCP服务器和DHCP中继的网络自动配置实验“

"配置DHCP服务器和DHCP中继的网络自动配置实验" 【实验目的】 部署DHCP服务器。熟悉DHCP中继的配置方法。验证拓扑。 【实验拓扑】 实验拓扑如图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 DHCPSERVE S0/3/0 192.168.10.1 255.255.…

丰富上下文的超高分辨率分割:一种新的基准

文章目录 Ultra-High Resolution Segmentation with Ultra-Rich Context: A Novel Benchmark摘要数据集Dataset SummaryData Collection and Pre-processing 数据标注数据统计 WSDNet实验结果 Ultra-High Resolution Segmentation with Ultra-Rich Context: A Novel Benchmark …

SSM整合快速入门案例(一)

文章目录 前言一、设计数据库表二、创建工程三、SSM技术整合四、功能模块开发五、接口测试总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者…

不认识docker,怎么好意思说自己是干IT的

1.Docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环…

用户行为数据分析

文章目录 用户行为数据分析1 项目描述2 项目需求3 数据准备1、创建user_data数据表用于导入user_data.csv中的数据2、加载user_data.csv中的数据到user_data表3、接下来进行数据清洗,包括:删除重复值,时间戳格式化,删除异常值。 4…

OpenGL光照之基础光照

文章目录 环境光照漫反射光照计算漫反射光照镜面光照代码 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会…

MyBatis-Plus(2.0)

ActiveRecord ActiveRecord(简称AR)一直广受动态语言(PHP、Ruby等)的喜爱,而java作为准静态语言,对于ActiveRecord往往只能感叹器优雅 什么是ActiveRecord? ActiveRecord也属于ORM(对象关系映射)层,由Rail…

视频|人人能看懂的苹果visionOS空间设计课程

本周的重磅消息无疑是苹果Vision Pro以及对应的visionOS,考虑到苹果头显硬件上当前以第一方App为主,因此本届WWDC的一个重点就是释放visionOS和相关能力给开发者,让开发者尽快打造出更多、更优质的第三方App阵容。 与此同时,苹果也…

【vue3】10-vue组件化额外知识补充(下)-动态组件-组件缓存-v-model在组件上的应用

组件化-额外知识补充(下) 动态组件的使用(了解)keep-alive(理解)认识keep-alivekeep-alive的使用 异步组件的使用webpack分包处理(了解)Vue中实现异步组件 组件的v-model组件的混入Mixin(了解&a…

阿里云弹性公网EIP收费价格表(按量/包年包月/配置费)

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

基于springboot+vue技术的在线考试系统源码数据库

源码看这里 https://download.csdn.net/download/2301_76965813/87881785 前台 学生登录: 如果没有账号,首先需要以学生的身份进行注册,即输入姓名、性别、密码以及班级,注册成功之后输入账户名和密码进行登录,进入…

conda虚拟环境配置和系统相关配置

一、conda虚拟环境 首先,尽量别在base中直接安装自己的包。原因有以下两个: 1.base环境是conda运行的基础,没法一键清除,如果损坏base环境要么滚回要么卸载重装,比较麻烦 2.base中很多包并不是项目需要的包&#xff0c…

Spring5

Spring5 文章目录 Spring5一.框架概述二.入门案例三.IOC容器1.IOC概念2.IOC底层原理3.IOC接口 四.IOC操做Bean管理1.Bean管理2.基于xml配置文件方式实现(1).创建对象(2).注入属性第一种注入:set方法第二种注入:有参数的构造p名称空间注入(了解)注入空值和特殊符号外部Bean内部B…

itop-3568开发板驱动学习笔记(27)设备树(六)pinctrl

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 pinctrl 子系统简介pinctrl 设备树语法pinctrl 客户端pinctrl 服务端瑞星微平台全志平台三星平台iMX 平台 pinctrl 子系统简介 Linux pinctrl 子系统用来管理 GPIO 引脚,它主要完成了以下三种功…

MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句

MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句 第三篇_MySQL 数据库规范和基础查询语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.2 SQL大小写规范 (建议遵守)2.3 …

设计模式-03.02-创建型-工厂建造者原型

工厂模式【常用】 工厂模式很重要,后面的很多架构设计,都是工厂模式联合着其它设计模式使用。 一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。不过,在 GoF 的《设计模式》一书中&#xff…

docker资源控制cgroup

一、CPU控制 cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。 cgroups有四大功能: 资源限制:可以…

SpringAOP详解

目录 前言: 相关概念 切点表达式规则 代码演示 SpringAOP实现原理 织入(代理的生成时机) JDK和CGLIB区别 小结: 前言: AOP(Aspect Oriented Programming)是思想(面向切面编程…

文心一言 VS 讯飞星火 VS chatgpt (37)-- 算法导论5.4 1题

一、一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2? 必须要有多少人,才能让至少两个人生日为 7月 4 日的概率大于 1/2? 文心一言: 一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2&#…

Linux下ElasticSearch7.9.2安装配置(包含服务器配置、启动停止脚本、开放端口和elasticsearch-head插件的使用)

Linux下ElasticSearch7.9.2安装配置 前言1.下载安装1.1 使用wget的方式下载1.2 官网下载 2.上传到服务器并解压3.修改es配置文件3.1 es目录简介3.2 修改配置文件 4. 创建用户并赋权5. 服务器修改配置5.1 修改文件句柄数和线程数5.2 关闭swapping5.3 修改虚拟内存 6. 启动es6.1 …