Linux 内存管理 pt.3

科技资讯 投稿 5500 0 评论

Linux 内存管理 pt.3

在《Linux 内存管理 pt.2》中我们学习了多级页表和大页,我们知道了由于历史遗留的问题,Linux 的页通常为 4KB

那么今天继续我们的 Linux 内存管理学习,我们今天要学习的是——内存的分配和回收

在 Linux 中,内存是如何被分配和回收的呢?

内存分配

当malloc( 函数需要分配内存时,它会调用这两个系统调用——即 brk( 和 mmap(

    brk(

这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用

    减少缺页异常的发生,提高内存访问效率

    mmap(

对于大块内存(大于 128K),则直接使用内存映射 mmap( 来分配,也就是在文件映射段找一块空闲内存分配出去,释放时直接归还系统

    在释放时直接归还系统,所以每次 mmap 都会发生缺页异常

需要注意的是,一开始调用内存分配函数的时候,其实是没有真正分配到物理内存
只有在进程首次访问时才分配,即通过缺页异常进入内核中,再由内核来分配内存

Linux 伙伴系统(buddy)

在 Linux 中,光知道如何分配内存还不行,还得知道该怎么分配

伙伴管理器是 Linux 系统中一种常见的内存分配算法,它可以让系统在分配物理内存时,快速地找到相应大小的可用内存块

当内存释放时,伙伴系统将其标记为空闲,用于重新分配给其他进程。因此,伙伴系统和 MMU 相互协作,实现 Linux 操作系统的内存管理功能

那如果要分配的内存小于 4K 呢?

所以 Linux 通过下面两种方式来分配小于 4K 的内存:

当需要分配小于4K的内存时,内核会为之保留一个完整的物理页,并尽量将物理页分割成大小相同的小块。当有多个小块被请求时,内核会合并这些小块,最终分配

slab 分配器是 Linux 内核中的一个重要组成(你可以将slab 看成构建在伙伴系统上的一个缓存)它将一小块内存分配称为缓存(cache)

如果已经分配完了所有内存块,Slab 分配器会重新分配一个完整的物理页作为缓存,以供后续请求使用

内存回收

如果内存只分配而不释放,就会造成内存泄漏,甚至会耗尽系统内存

那么系统是如何回收内存的呢?

2、回收不常访问的内存,把不常用的内存通过交换分区(swap)直接写到磁盘中

它可以把进程暂时不用的数据存储到磁盘中(这个过程称为换出),当进程访问这些内存时,再从磁盘读取这些数据到内存中(这个过程称为换入)

3、杀死进程,内存紧张时系统还会通过 OOM(Out of Memory),直接杀掉占用大量内存的进程

一个进程消耗的内存越大,oom_score 就越大;

进程的 oom_score 越大,代表消耗的内存越多,也就越容易被 OOM 杀死

感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

编程笔记 » Linux 内存管理 pt.3

赞同 (28) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽