linux进程阻塞的原因,释放大块内存时的阻塞问题

本文分析了Linux系统中,释放大块内存时为何会导致进程阻塞,主要原因是munmap操作涉及到虚拟地址空间、页表和LRU链表的修改。解决方法包括分批操作和使用大页技术。测试表明,通过madvise配合munmap可以显著降低阻塞时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

在堆上申请和释放内存的性能不高,这应该是常识了,尤其释放大块内存时,耗时更长,甚至会阻塞其他线程。做性能优化时,一般会采用内存池等手段避免频繁的申请和释放内存。本文从内核的角度分析申请和释放内存时的阻塞瓶颈,及化解方法。

为了便于理解,本文从用户申请、访问、释放内存的角度出发,逐步深入探讨Linux的内存管理。本文以阻塞为线索,从堆内存和栈内存的区别,到malloc的原理,再到内存页的管理,逐步找出释放大块内存时阻塞的原因,然后再给出一种化解的方法。

限于篇幅,没有面面俱到的阐述,只介绍了和本文主旨相关的关键点。能力和时间有限,难免有纰漏甚至错误,欢迎指正。

二、堆和栈

3ffe9f44e9f2667ca05149796613f93f.png

2.1 栈内存

栈内存是线程预留的固定大小的内存空间,只需要移动栈顶指针就可以完成申请和释放内存,因此速度很快,但大小受限。

2.2 堆内存

堆内存是程序运行时动态申请的,所以需要考虑竞争、碎片等问题,所以申请和释放的速度慢一些,但是更灵活。本文主要讲述使用堆内存的场景。

三、malloc

在c语言中,堆内存一般是用malloc函数申请的。malloc负责向系统申请内存和维护缓存(bins)。malloc通过brk/sbrk或mmap向系统申请内存,区别在于前者是通过增长堆地址空间扩大内存区域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值