Linux | 物理内存分配

1. 空闲链表

包括最佳适配、最先适配、最差适配

2. 内存池

一个池子里包含很多空闲链表,每条空闲链表的各个节点大小都是一样的,比如一条全是64KB,另一条全是16kb,分配时先选一条最接近的然后取一个节点分配给进程。

缩短了链表线性检索的时间,但对于内存的划分很重要

3. buddy系统(内存池的改进)

相比内存池,它允许相邻两个一样大的内存块合并,比如2个16KB的合成32KB,然后就挪到32KB的链表上。

减少了内存碎片(因为碎片可以合并),但限制所有内存的大小时2的幂,并且链表节点的移动也要额外开销。

4. slab(another改进)

buddy的最小单位是页,就是4KB,但slab系统可以做到更小单位的内存合并,比如128B。特点是相同大小的对象归为一类,比如7B归为一类,20B归为另一类,同类的对象从同一个cache中获取内存,一个cache切分成好几个slab,每个slab住一个对象。

没咋懂。。


用户空间申请内存:melloc

内核空间申请内存:kmalloc(),_ _get_free_pages(),vmalloc()

kmello
用于申请比较小的内存,在物理地址上是连续的

vmeloc
用于申请比较大的内存,在物理地址上是不连续的,开销比kmelloc更大


其他的一些概念:

page cache:内存中开辟一块区域用来缓存磁盘上的文件,可以减少磁盘io

anonymous page:有些区域建立的时候只有虚拟地址,在实际使用的时候才分配物理页面,这部分还没有具体分配的物理页面称为anonymous page

内存回收:刚刚回收了的页面又被分出去,就会造成浪费,所以选择不常使用的页面回收是需要研究的。page cache和anonymous page都是要回收的。

内存规整:内存还有空闲,但空闲部分都被切割成了小块不够分,就想办法把小块合成一个大块。(当然,大量page的迁移是开销很大的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值