glibc malloc常驻内存不释放问题抽象

本文探讨了在多线程高并发访问下,系统内存逐渐增长且无法释放的问题,通过简单程序再现问题,并最终确定问题出在glibc库的malloc上。文章详细解释了glibc内存管理机制,提出应用系统内存管理机制与库提供机制相调试,必要时使用系统调用来分配内存的方法。

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

    最近测试中,我们的系统在多线程高并发访问的情况下,内存开始逐渐增长,到一定值以后,即使所有的连接线程都退出,常驻内存也不释放,经过仔细的检查分析,内置的内存资源池都正确释放,而且在连接活跃时,常驻内存在到达一定值后也会保持一个平稳水平,可以排除是我们系统代码的问题,这里可以通过一个简单的程序抛开无关的部分再现系统的内存占用问题。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<errno.h>
#include<unistd.h>
#include<memory.h>
#include <libpq-fe.h>

#define THREAD_NUM 5
void* thread_malloc(void*);

int 
main(int argc, char** argv)
{
    pthread_t tid[THREAD_NUM];
    int err, i, j = 10, pid;
    
    pid = getpid();
    printf("pid = %d\n", pid);
    sleep(20);
    while( j-- > 0) {
        for(i=0; i<THREAD_NUM; i++){
            err = pthread_create(&tid[i], NULL, thread_malloc, NULL);
            if (err !=0) 
                printf("%s: %d\n",__func__, strerror(err)); 
        }   
        for(i=0; i<THREAD_NUM; i++){
            pthread_join(tid[i], NULL);
        }   
    }
 
    printf("All thread finish\n");
    sleep(15);
return 0; } void *thread_malloc(void *arg) { char *buf =NULL; int i; buf = (char *) malloc(1024*sizeof(char)); for (i=0; i< 1024; i++){ buf[i] = 'x'; } printf("allocate 1024 bytes\n"); sleep(2); free(buf); }

线程启动前的内存使用情况:

线程退出后的内存使用情况:常驻内存并没随线程退出释放

valgrind进行检查的结果:不存在内存泄露

  

    关于这个问题的详细原因,经多方查证问题出在glibc库的malloc上,通过glibc分配内存时,glibc有自己的内存管理机制,并不会将这部分内存马上归还给OS,这里推荐淘宝华庭的《glibc内存管理-ptmalloc2源代码分析》,里面对ptmalloc的分配原理从代码层给出了详细的分析,通过这个问题也让我感觉到,很难有一种内存管理方法适用于所有场景,为了让内存管理更有效率,应用系统本身的内存管理机制要与库提供的内存管理机制进行调试,必要的场合使用系统调用直接分配内存。

转载于:https://www.cnblogs.com/databaseaffair/p/3439560.html

<think>好的,用户现在想了解Kernel在IT领域的定义及其在计算机系统中的作用。首先,我需要回顾之前的对话,确保回答符合用户的需求。用户之前询问了一个手机软件包名的解析,现在转向操作系统内核,这可能是因为他们对系统底层机制感兴趣,或者在学习计算机基础知识。 根据用户提供的引用资料,Kernel被多次提到是操作系统的核心部分,负责硬件资源管理、进程调度等。我需要综合这些信息,给出一个清晰的定义,并详细说明其作用。同时,用户可能希望了解Kernel与操作系统的关系,以及它在实际应用中的例子,比如Docker仅需Linux内核的例子,这在之前的引用[1]中提到过。 需要注意用户可能对技术术语太熟悉,所以需要用易懂的语言解释。例如,区分用户态和内核态,系统调用的概念,这些都是关键点。另外,用户提到的引用中提到了进程管理、内存管理、设备驱动等,这些都是Kernel的核心职能,需要逐一展开说明。 还要考虑用户是否有进一步的需求,比如Kernel的同类型(如微内核、宏内核)或者实际应用案例,比如Docker的使用。这些可以作为相关问题的扩展,帮助用户深入理解。此外,用户可能对Kernel在安全性和性能优化方面的作用感兴趣,但根据当前问题,可能需要先聚焦在定义和作用上,再通过相关问题引导他们探索更多内容。 最后,确保回答结构清晰,分点说明,并引用提供的资料来支持每个观点。同时,使用中文,避免使用复杂术语,必要时举例说明,比如Windows NT内核和Linux内核的区别,或者系统调用如何工作。这样用户能更好地理解Kernel的重要性和实际应用。</think>### Kernel(内核)的定义及核心作用解析 --- #### 一、Kernel的本质定义 **Kernel(内核)**是操作系统的核心组件,属于计算机系统的"管理者",直接与硬件交互并为上层应用提供基础服务。它作为**硬件与软件之间的桥梁**,实现了两个关键抽象: 1. **硬件资源虚拟化**:将物理硬件转化为逻辑资源池(如CPU时间片、内存页、磁盘块) 2. **系统服务标准化**:通过系统调用(System Call)接口向应用程序提供服务 技术特征: - 常驻内存(Resident in Memory) - 运行在特权模式(内核态) - 采用分层架构(如Linux的进程调度层、VFS层等)[^1][^4] --- #### 二、Kernel的核心职能(基于硬件管理维度) | 管理维度 | 技术实现 | 典型示例 | |----------------|--------------------------------------------------------------------------|------------------------------------------| | **进程调度** | 时间片轮转算法(RR)、完全公平调度器(CFS) | Linux的`/proc/sched_debug`实时查看 | | **内存管理** | 分页机制(Paging)、虚拟内存(Virtual Memory) | Windows的Working Set管理 | | **设备驱动** | 硬件抽象层(HAL)、即插即用(PnP)框架 | USB设备的热插拔支持 | | **文件系统** | 虚拟文件系统(VFS)接口,支持EXT4/NTFS/FAT32等 | Linux的`inode`结构管理 | | **网络协议** | TCP/IP协议栈实现,包过滤机制 | BSD Socket接口 | **关键差异**: Windows内核(NTOSKRNL.EXE)采用混合内核架构,而Linux内核(vmlinuz)是典型单内核设计[^3]。 --- #### 三、Kernel与操作系统的关系 1. **包含关系** $$操作系统 = Kernel + 系统工具链 + 用户界面 + 应用程序框架$$ 例如:Android系统 = Linux内核 + ART虚拟机 + SurfaceFlinger + HAL 2. **最小系统验证** Docker容器技术证明:仅需Linux内核即可构建可运行环境(无需GUI或其他组件)[^1] ```bash # 查看容器内核版本(与宿主机一致) docker run alpine uname -r ``` 3. **安全边界** 通过**环状保护模型**(Ring 0-3)实现权限隔离: - Ring 0:内核态(直接硬件访问) - Ring 3:用户态(受限指令执行)[^4] --- #### 四、典型应用场景解析 1. **系统调用过程** 当应用程序申请内存时: ``` 用户程序调用malloc() → glibc封装brk()系统调用 → 陷入内核态 → Kernel的内存管理器分配物理页 → 更新页表 → 返回虚拟地址 ``` 该过程涉及从用户态到内核态的上下文切换(约需0.5-2μs)[^4] 2. **驱动开发实例** Linux字符设备驱动核心结构: ```c static struct file_operations fops = { .owner = THIS_MODULE, .read = device_read, .write = device_write, .open = device_open, .release = device_release }; // 通过此结构体向Kernel注册设备操作接口 ``` --- #### 五、现代演进趋势 1. **微内核架构复兴** - Fuchsia(Zircon内核):谷歌研发的模块化内核 - 华为鸿蒙OS:分布式能力内置在内核层 2. **安全增强技术** - Linux的SELinux模块 - Windows的Hyper-V隔离机制 3. **性能优化方向** - 调度器优化(如Linux 5.14引入的SCHED_DEADLINE) - 内存压缩(ZRAM技术) --- ### 相关问题 1. 如何理解Linux内核的OOM Killer机制? 2. Windows NT内核与Linux内核架构差异对软件开发有何影响? 3. 微内核相比宏内核在实时系统中的应用优势是什么? [^1]: 操作系统核心架构解析 [^2]: 现代操作系统(原书第四版) [^3]: Windows/Linux内核对比白皮书 [^4]: 系统调用与硬件交互原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值