基础篇|15.Linux内存是怎么工作的?
Contents
1. 内存映射
- 内存映射:就是将虚拟内存地址映射到物理内存地址
- 多级页表:将内存分成区块来管理,将原来的映射关系改成区块索引和区块内的便宜
- 大页:比普通页更大的内存块
2. 虚拟内存空间分布
- 内核空间
- 用户空间内存
- 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。
- 文件映射段,包括动态库、共享内存等,从高地址开始向下增长。
- 堆,包括动态分配的内存,从低地址开始向上增长。
- 数据段,包括全局变量等。
- 只读段,包括代码和常量等。
3. 内存分配和回收
分配
- molloc()是C标准库提供的内存分配函数,对应到系统调用上,有brk()和mmap()两种方式
- malloc() 申请内存后,内存并不会立即分配,而是在首次访问时,才通过缺页异常陷入内核中分配内存。
- brk():用于小内存分配,内存释放后不会立刻归还系统,而是缓存起来
- mmap():用于大内存(>128k)分配,直接使用内存映射分配
回收
- 回收缓存,比如LRU算法,回收最近使用最少的内存页
- 回收不常访问的内存
- 杀死进程,内存紧张时 系统还会通过OOM直接杀死占用大量内存的进程
工具
- free
|
|
available:新进程可用内存的大小
2.top 按m键
|
|
- VIRT 是进程虚拟内存的大小
- RES 是常驻内存的大小
- SHR 是共享内存的大小
Author zhuyhan
LastMod 2020-06-04