Linux内存管理--逻辑层面分析

目标

内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。

Linux内存管理


说到Linux内存管理,就不得不借用一个进程内存分布图来进行说明。

\

上图是进程的用户空间内存分布说明。关于这个图,我们重点注意两点。第一,虚拟地址;第二,堆的brk位置和start_brk位置。

虚拟地址和物理地址


32位的机器为例,虚地址空间最大4GB,3GB为用户空间,1GB为内核空间。

虚拟地址和物理地址的映射需要硬件MMU支持。虚拟地址的引入可以使得用户进程安全的操作内存,不会导致内核崩溃。

缺页中断发生时,会映射虚拟地址到物理地址上。


malloc 时,有几种场景。

第一,已无空间。修改brk的位置,往后移,返回虚拟地址vp1。使用vp1时,发生缺页中断,映射虚拟地址与物理地址。

第二,有之前释放过的空间。找出一个best fit,返回虚拟地址vp2。

free 时,记录释放的虚拟地址及块大小,并不返还操作系统,留给上面第二步使用。

关于第一步,缺页中断时,会向内核申请n pages的内存,这是内核会使用buddy(伙伴)算法来进行分配。

另外,内核使用slab等分配器来分配较小的内存块。

简述malloc逻辑

  1. 在已分配的虚拟地址空间中查找合适大小的内存块(malloc 缓冲,glibc 管理)
  2. 修改brk,返回虚拟地址。待后续缺页中断发生时,再进行映射。
内核缺页发生时,映射虚拟地址vp1到物理地址pp1上。vp1后面释放后,会加入malloc 缓冲当中,有glibc管理。

这个过程中有几个值得关注的点,malloc 内存管理,Linux 内核伙伴算法, Linux 内核slab 分配器。

内存碎片


内部碎片,slab。malloc 或 内核均会涉及。

外部碎片,特指内核多页相关,仅内核涉及,比较著名的是伙伴buddy算法。

malloc测试

void test2()
{
    for ( int i = 0; i < 1024; ++i )
    {
        void *p = malloc(1024);
        memset(p,0,1024);
        cout << hex << "edata: " << sbrk(0) << " virtual pointer:" << p << endl;
    }

    sleep(10);
}

测试程序不关心内存泄漏,只为说明edata的增长速度,每次132pages,即4K*132。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值