Linux内存管理相关记录

  • 代码段:用来存放可执行问价你的操作指令
  • 数据段:用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序静态分配的变量和全局变量
  • BSS段:包含了程序中未初始化的全局变量,在内存的BSS段在系统初始化时已被置零
  • 堆(heap):存放程序运行中被动态分配的内存段,他的大小不固定,可动态扩张或缩减
  • 栈:用户存放程序临时创建的局部变量,在函数调用时,其参数也会被亚茹发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
  • 页/页面:线性地址中的内存单元
  • 页框:物理内存的内存单元
  • 页高速缓存:磁盘内容在物理内存中的缓存
  • 高速缓存:用于满足对单个页框的分配请求
    目录项高速缓存:保存目录项到inode的映射关系当应用程序发起stat系统调用时,就会创建对应的dentry_cache项(更进一步,如果每次stat的文件都是不存在的文件,那么总是会有大量新的dentry_cache项被创建)
  • 索引节点高速缓存:存放关于具体文件的一般信息,对应于存放在磁盘上的文件控制块
  • 每CPU高速缓存:包括热高速缓存和冷高速缓存,热高速缓存的页框在硬件高速缓存的可能性较大,冷高速缓存主要用于DMA操作
  • 保留的页框池:只能用于满足中断处理程序或内部临界区发出的原子内存分配请求
  • 内存池:仅在内存不足的紧急情况下分配一些动态内存
  • 内存描述符:与进程地址空间有关的全部信息都包含在内,进程虚拟内存的描述符
  • pgd:每个进程都有自己的页表,进程描述符的pgd域指向的就是进程的页全局目录
    进程描述符pgd
  • 伙伴子系统分配内存函数接口:get_free_page/get_free_pages
  • malloc系统调用函数接口:brk、mmap
  • Slab分配器:kmem_cache_alloc/kmem_cache_free
  • Kmalloc:一般来说内核程序中对小于一页的小块内存的请求才通过Slab分配器提供的接口Kmalloc来完成(虽然它可分配32 到131072字节的内存)从内核内存分配的角度来讲,kmalloc可被看成是get_free_page(s)的一个有效补充,内存分配粒度更灵活了。
  • Vmalloc:内核提供vmalloc函数分配内核虚拟内存,该函数不同于kmalloc,它可以分配较Kmalloc大得多的内存空间(可远大于128K,但必须是页大小的倍数),但相比Kmalloc来说,Vmalloc需要对内核虚拟地址进行重映射,必须更新内核页表,因此分配效率上要低一些(用空间换时间)
    这里写图片描述

strace 常用来跟踪进程执行时的系统调用和所接收的信号
eg:strace cat /dev/null

eg:strace -o output.txt -T -tt -e trace=all -p 28979
跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),
最后将记录结果存在output.txt文件里面

猜你喜欢

转载自blog.csdn.net/u010827484/article/details/79380330