Linux 内存管理 pt.3

这篇具有很好参考价值的文章主要介绍了Linux 内存管理 pt.3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

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

这样就会导致一个页表里面会有特别多页,为了解决这个问题,Linux 提供了两种解决方案——多级页表和大页

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

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

内存分配

在 Linux 中,内存的分配通常由 C 标准库提供的内存分配函数 malloc() 实现

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

  • brk()

对于小块内存(小于 128K大于 4K),使用 brk() 来分配,通过移动堆顶的位置来分配内存

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

优缺点:

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

  2. 由于不会立刻归还释放的内存给系统,所以在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片

  • mmap()

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

优缺点:

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

  2. 在内存工作繁忙时,频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 malloc 只对大块内存使用 mmap 的原因

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

Linux 伙伴系统(buddy)

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

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

前面说到,MMU 是一种硬件设备,负责虚拟内存和物理内存的映射关系。当内核需要访问某个虚拟内存时,MMU 将该虚拟地址转换为对应的物理内存地址,并通过伙伴系统的分配算法来定位相应的内存块

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

上面说到,对于4K 至 128K 的内存用 brk() 来分配,对于大于 128k 的内存使用内存映射 mmap() 来分配。那如果要分配的内存小于 4K 呢?

实际系统运行的时候,有着许多内存小于 4K 的对象,如果为他们分配单独的页,那就太浪费内存了

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

1、伙伴系统

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

2、slab分配器

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

当需要分配小于 4K 的内存时,Slab 分配器会创建一个小的缓存来保存请求内存的块。每个缓存都有一个物理页的大小

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

为了防止内存碎片化,slab 分配器会保留已经使用完的 slab 块并重复使用其中未被使用的空间,而不是将其释放回系统

内存回收

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

所以,在应用程序用完内存后,还需要调用 free() 或 unmap() ,来释放这些不用的内存

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

1、使用 LRU(Least Recently Used)算法,回收最近使用最少的内存页面

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

Swap 其实就是把一块磁盘空间当成内存来用

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

通常只在内存不足时,才会发生 Swap 交换。并且由于磁盘读写的速度远比内存慢,Swap 会导致严重的内存性能问题

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

OOM(Out of Memory),其实是内核的一种保护机制,使用 oom_score 为每个进程的内存使用情况进行评分

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

一个进程运行占用的 CPU 越多,oom_score 就越小

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

感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力文章来源地址https://www.toymoban.com/news/detail-448019.html

到了这里,关于Linux 内存管理 pt.3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux内存管理 | 一、内存管理的由来及思想

    1、前言 《中庸》有:“九层之台,起于垒土” 之说,那么对于我们搞技术的人,同样如此! 对于 Linux 内存管理,你可以说没有留意过,但是它存在于我们日常开发的方方面面,你所打开的文件,你所创建的变量,你所运行的程序,无不以此为基础,它可以说是操作系统的

    2024年02月08日
    浏览(37)
  • Linux内存管理--smaps内存

    swaps文件是Linux的proc文件系统提供的查看系统下运行进程内存使用情况的方法,Linux给每个进程都提供了一个这样的文件,学会查看并分析swaps文件有助于定位和解决诸如内存泄漏、性能瓶颈等内存资源相关问题。 了解smaps文件之前,需要先搞清楚Linux内存管理中的虚拟内存(

    2024年02月09日
    浏览(49)
  • 【Linux内核】内存管理——内存回收机制

    转载请注明: https://www.cnblogs.com/Ethan-Code/p/16626560.html 前文提到malloc的内存分配方式,malloc申请的是虚拟内存,只有在程序去访问时,才会触发缺页异常进入内核态,在缺页中断函数中建立物理内存映射。 如果物理内存充足,则直接建立页框与页的映射。当物理内存不足时,内

    2023年04月09日
    浏览(51)
  • 系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理

    虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。 在使用虚拟内存的情况下,每个进程都有自己的独立的虚

    2024年02月11日
    浏览(45)
  • linux 内存管理

    一个虚拟内存系统, 意味着用户程序见到的地址不直接对应于硬件使用 的物理地址. 虚拟内存引入了一个间接层, 它允许了许多好事情. 有了虚拟内存, 系统重 运行的程序可以分配远多于物理上可用的内存; 确实, 即便一个单个进程可拥有一个虚拟 地址空间大于系统的物理内存

    2024年01月21日
    浏览(31)
  • 深入理解Linux虚拟内存管理

    Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理解Linux虚拟内存管理(四) 深入理解Linux虚拟内存管理(五) 深入理解Linux虚拟内存

    2024年02月06日
    浏览(55)
  • 从 malloc 分配大块内存失败 来简看 linux 内存管理

    应用进程 malloc 返回了null,但是观察到的os 的free内存还有较大的余量 ,很奇怪为什么会这样? 不可能是oom导致的(当然也没有 os 的oom 日志),free还有余量,系统也没有cgroup的应用隔离。 我们linux上使用的库函数 malloc 基本都是用glibc库实现的malloc函数(当然如果binary 链接

    2024年02月08日
    浏览(54)
  • 深入理解Linux内核——内存管理(1)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月13日
    浏览(48)
  • 深入理解Linux虚拟内存管理(六)

    Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理解Linux虚拟内存管理(四) 深入理解Linux虚拟内存管理(五) 深入理解Linux虚拟内存

    2024年02月08日
    浏览(48)
  • 深入理解Linux内核——内存管理(2)

    提要:本系列文章主要参考 MIT 6.828课程 以及两本书籍 《深入理解Linux内核》 《深入Linux内核架构》 对Linux内核内容进行总结。 内存管理的实现覆盖了多个领域: 内存中的物理内存页的管理 分配大块内存的伙伴系统 分配较小内存的slab、slub、slob分配器 分配非连续内存块的

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包