linux内存管理

基本知识

对于linux进程来说,内存分为两部分,用户态,内核态,从用户态到内存态一般需要中断或系统调用来实现

用户态内存划分(0-3G)
地址:高->低


image.png

image.png

其中:
栈是用户存放程序临时创建的局部变量,地址是从高到低
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。比如new malloc。地址从低到高
读写段:
bss:未初始化的全局变量
data:已初始化的全局变量和局部静态变量以及它属于静态区域,但是可写
只读段:
代码段, const变量,define宏
文件映射区域 :共享内存等映射物理空间的区域
内核态内存划分(3-4G)


image.png

MMU:

CPU的一个单独模块,用来将虚拟地址转换为实际物理地址的组件,MMU通常使用内存中的一个组件,通常称为页表(page table)或PTE(page table entry)来管理虚拟地址到实际物理地址的映射

PTE(页表)

页表存储着映射信息,页表实现了页表置换算法->LRU, 当映射缺失时,则会向CPU发送一个缺页中断, CPU则会在物理内存(RAM)中寻找一个空闲的页, 并更新PTE。如果没有可用的空闲页,则CPU会选择PTE页表中的页,置换到磁盘上并在PTE页面设置标志,这就是通常所说的页面调度(paging),将内存页换出到磁盘或者swap空间

TLB(快表)

是保存虚拟地址到物理地址的一个缓存,无需地址转换直接得到地址

Slab Buddy

Slab 和 Buddy 是linux内核中基础的内存分配器
slab是具有相同大小的内存集合,通过一次性申请较大的内存空间,并将其等分为大小相同的块,来避免内存碎片
buddy按需分配不同大小的内存,分配和归还涉及内存块的合并和分割,保存着一个内存管理链,内存按2的幂次划分,并搜索其内存空间找到最佳适配的内存

slab buddy与new的关系

image.png

malloc实现方式

若分配内存小于 128k ,调用 sbrk() ,将堆顶指针向高地址移动,获得新的虚存空间。
若分配内存大于 128k ,调用 mmap() ,在文件映射区域中分配匿名虚存空间。

free实现方式

如果是mmap的会调用munmap返回给OS
如果是堆内的内存,只有释放堆顶的空间,同时堆顶总连续空闲空间大于 128k 才使用 sbrk(-SIZE) 回收内存,真正归还 OS
因此,当我们写程序时,不能完全依赖 glibc 的 malloc 和 free 的实现。更好方式是建立属于进程的内存池,即一次分配 (malloc) 大块内存,小内存从内存池中获得,当进程结束或该块内存不可用时,一次释放 (free) ,可大大减少碎片的产生。

为什么malloc不直接使用mmap实现

mmap/sbrk/munmap属于系统调用,例如使用 mmap 分配 1M 空间,第一次调用产生了大量缺页中断 (1M/4K 次 ) ,大量的缺页中断会导致内核态cpu消耗过大。使用堆可以重复使用空闲内存空间

除了glibc的malloc还有什么内存管理实现

google 的 tcmalloc 和 facebook 的 jemalloc

用户态申请内存流程

调用brk时,只是增加了虚拟内存的地址,并没有真正去分配内存。而是在页表中将虚拟地址映射到同一个零化页面,只有在写这个页的时候才会发生缺页中断,将zero页面拷贝到用户空间。

虚拟地址到物理地址转换

分段机制:将虚拟地址(逻辑地址)转化成线性地址
分页机制:将线性地址转化成物理地址
虚拟地址首先被传送到MMU中查看TLB缓存,如果缓存命中(TLB hit)则返回物理地址,否则(TLB miss) MMU或操作系统会在页表(page table)中查找是否存在(a page walk),如果命中则返回物理地址,并写回TLB缓存。这个时候可能会发生缺页中断,比如上一个问题说的只读的零化页面,或者被置换走。
Linux中逻辑地址等于线性地址,因为Linux所有的段的线性地址都是从 0x00000000 开始,线性地址=逻辑地址+ 0x00000000


image.png

页面置换算法

LRU最久未使用 FIFO先进先出 LFU 最少使用 NRU最近未使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 原文:Linux内存管理 说明:本文在原文基础上稍加改动以便阅读理解。 摘要 本章首先以应用程序开发者的角度审视L...
    wingjay阅读 4,310评论 2 18
  • 最近开始想稍微深入一点地学习Linux内核,主要参考内容是《深入理解Linux内核》和《深入理解Linux内核架构...
    ice_camel阅读 1,779评论 0 2
  • 在linux下我们经常会使用到top,vmstat,free等命令查看系统或者进程的内存使用情况,经常会看到buf...
    tracy_668阅读 3,268评论 1 1
  • 在linux下,使用top,free等命令查看系统或者进程的内存使用情况时,经常看到buff/cache meme...
    analanxingde阅读 698评论 0 2
  • 时光荏苒,岁月悠悠。 时间总是在不经意间流逝得非常快,今天已经是我怀孕32周零6天了,回想刚怀孕早期那段时间的苦痛...
    霞姝儿阅读 314评论 0 0