1. 内存映射

  • 内存映射:就是将虚拟内存地址映射到物理内存地址
  • 多级页表:将内存分成区块来管理,将原来的映射关系改成区块索引和区块内的便宜
  • 大页:比普通页更大的内存块

2. 虚拟内存空间分布

  • 内核空间
  • 用户空间内存
    • 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。
    • 文件映射段,包括动态库、共享内存等,从高地址开始向下增长。
    • 堆,包括动态分配的内存,从低地址开始向上增长。
    • 数据段,包括全局变量等。
    • 只读段,包括代码和常量等。

3. 内存分配和回收

分配

  • molloc()是C标准库提供的内存分配函数,对应到系统调用上,有brk()和mmap()两种方式
  • malloc() 申请内存后,内存并不会立即分配,而是在首次访问时,才通过缺页异常陷入内核中分配内存。
  • brk():用于小内存分配,内存释放后不会立刻归还系统,而是缓存起来
  • mmap():用于大内存(>128k)分配,直接使用内存映射分配

回收

  • 回收缓存,比如LRU算法,回收最近使用最少的内存页
  • 回收不常访问的内存
  • 杀死进程,内存紧张时 系统还会通过OOM直接杀死占用大量内存的进程

工具

  1. free
1
2
3
free
              total        used        free      shared  buff/cache   available
Mem:        2038904      314620     1364720         812      359564     1591912

available:新进程可用内存的大小

2.top 按m键

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
top - 17:27:57 up 15:45,  0 users,  load average: 0.00, 0.02, 0.00
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.8 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1991.1 total,   1332.7 free,    307.2 used,    351.1 buff/cache
MiB Swap:   1024.0 total,   1024.0 free,      0.0 used.   1554.6 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0    4244   3260   2836 S   0.0   0.2   0:00.03 bash
    8 root      20   0    4244   3504   2920 S   0.0   0.2   0:00.11 bash
  154 root      20   0    6120   3292   2788 R   0.0   0.2   0:00.00 top
  • VIRT 是进程虚拟内存的大小
  • RES 是常驻内存的大小
  • SHR 是共享内存的大小