哈喽大家好,我是咸鱼
在《Linux 内存管理 pt.2》中我们学习了多级页表和大页,我们知道了由于历史遗留的问题,Linux 的页通常为 4KB
(资料图片)
这样就会导致一个页表里面会有特别多页,为了解决这个问题,Linux 提供了两种解决方案——多级页表和大页
那么今天继续我们的 Linux 内存管理学习,我们今天要学习的是——内存的分配和回收
在 Linux 中,内存是如何被分配和回收的呢?
内存分配在 Linux 中,内存的分配通常由 C 标准库提供的内存分配函数 malloc() 实现
当malloc() 函数需要分配内存时,它会调用这两个系统调用——即 brk() 和 mmap()
brk()对于小块内存(小于 128K大于 4K),使用 brk() 来分配,通过移动堆顶的位置来分配内存
这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用
优缺点:
减少缺页异常的发生,提高内存访问效率
由于不会立刻归还释放的内存给系统,所以在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片
mmap()对于大块内存(大于 128K),则直接使用内存映射 mmap() 来分配,也就是在文件映射段找一块空闲内存分配出去,释放时直接归还系统
优缺点:
在释放时直接归还系统,所以每次 mmap 都会发生缺页异常
在内存工作繁忙时,频繁的内存分配会导致大量的缺页异常,使内核的管理负担增大。这也是 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 杀死
感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力
中山市坦洲中茂学校2023年义务教育阶段招生方案中山市坦洲中茂学校,是一所九年一贯制高端民办学校,坐落于
1、每逢到立夏的节气,很多农民都会煮鸡蛋或者煮咸鸭蛋吃。因为在过去的农村,人们普遍认为在立夏这一天吃
1、耳源性眩晕的主要表现为阵发性眩晕、听力下降和耳鸣。2、严重者常伴有恶心、呕吐、面色苍白、出汗等迷走
赵孟頫《心经》,精妙绝伦,神采焕发,笔墨生辉,应为赵氏巅峰之作,无愧千古大家之名。反复披览,清风扑面
音频解说1、葡萄(学名:VitisviniferaL )为葡萄科葡萄属木质藤本植物,小枝圆柱形,有纵棱纹,无毛或被稀疏柔
在今天举行的乐透抽签大会上,马刺成为最大赢家,他们抽中了本届盛事的终极大奖:状元签
据中新社消息,美国人工智能技术公司OpenAI首席执行官阿尔特曼当地时间16日出席国会参议院一委员会听证会,
爆料!重庆“620”小升初报名情况,某七龙珠学校没招满?,招生,初中,毕业生,摇号,学校
1、物理实验室管理制度一、教学仪器借用制度为了保证学校实验教学的正常开展,教学仪器不得借给个人使用。2
1、浙江绍兴文理学院元培学院贴吧根据我们总务处的消息,元培的经管系可能会在9月份搬过去,明天可能会整体
X 关闭
每日消息!Linux 内存管理 pt.3
A股再迎海上风电国际大单:好风凭借力,扬帆“出海”正当时|全球热议
【独家焦点】名列前茅一般是第几名_名列前茅
速读:2023年5月17日镍价格最新行情预测
抖音电商魏雯雯:全域兴趣电商边界很大,内容和货架场景各有侧重 全球新视野
X 关闭