- 何为线程栈空间泄露?
- 何为anon内存?
- 虚拟内存、物理内存、anon内存的联系
- anon与线程的联系
- glibc源码库线程创建与销毁anon关系
- 使用pmap分析虚拟地址空间以及anon内存
何为线程栈空间泄露?
【栈空间泄露】:简单了说就是,创建了线程,系统分配了内存,但是由于异常操作,没有把之前申请的内存还给操作系统,缓存在进程中,导致这块的内存被占用,系统无法分配内存给其他进程。
从用户角度,线程创建后,未设置线程为detach属性,pthread_detach()、pthread_join()销毁函数。
从内存映射角度,在进程中缓存一些无法利用的anon内存。
从系统栈空间分配角度,这些运行结束但是未销毁的线程,既不放在stack_used队列里,也不放在stack_cache,从而线程栈空间不会被调度到。
何为anon内存?
仅个人观点,在操作系统上运行进程,其实是经过两次映射。一次是用户程序到系统配置器分配的虚拟内存申请,一次是虚拟地址空间到物理空间地址的映射,如果是第二次映射建立前,在申请物理空间,未填充物理页内容,建立映射后,仅仅代表已经分配了内存anon,ps:物理空间最小管理单元是“页”。
虚拟内存
操作系统给用户程序的假象地址,与物理内存建立映射关系。
物理内存
类似物理存储器DRAM
anon内存
1.调用malloc、brk、mmap等调用申请成功的虚拟内存后,在访问虚拟内存地址时候,发生页中断,去申请物理内存的时候,未填充物理页内容(读取、写入磁盘)。
2.已经建立与物理内存的映射关系,但是内存不被使用,系统也没有回收
虚拟内存、物理内存、anon的联系
1.使用cat /proc/cpuinfo可以查看操作系统分配给进程的虚拟内存地址空间范围,如一体机:address sizes:39