Linux资源-内存

1. 内存管理方式

  大部分的内存管理方式,先对虚拟内存空间进行分段管理,然后再对每一个段进行分页管理。分为5类段,如下:

代码段: 代码段是用来存放可执行文件的操作指令

数据段: 数据段用来存放可执行文件中已初始化全局变量, 也就是存放程序静态分配的变量全局变量

BBS段: BBS段包含程序未初始化的全局变量, 在内存中, BBS段全部置零

堆(heap): 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可以动态扩张或缩减,当进程调用malloc等函数分配内存,新分配的内存就被动态添加到堆中;利用free等函数释放内存

栈: 用户存放程序临时创建的局部变量, 也就是{}中定义的变 量(不包括static声明的)

  此时的虚拟地址结构,就由段号、段内页号、页内偏移所组成。此时对于每个进程来说,都会建立一个段表,而对于段表中的每一个段,又会再分别建立一个页表,虚拟地址转换为物理地址,需要以下三个步骤

  1. 访问段表,得到页表的起始地址
  2. 访问页表,得到物理页的起始地址
  3. 访问物理页,加上页内偏移,得到实际的物理地址

2. 查看内存信息

1)/proc/meninfo 方式查看

[root@slave1 ~]# cat /proc/meminfo
MemTotal:        1511992 kB
MemFree:          519472 kB
MemAvailable:     437220 kB
Buffers:               0 kB
Cached:           327220 kB
CommitLimit:     3382340 kB
Committed_AS:    1763672 kB

我们关注以上几个信息

  • MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 2G,但其实只有 1.95G 可用。
  • MemFree:系统空闲内存。
  • MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
  • Buffers:缓冲区内存
  • Cached:缓存
  • CommitLimit:内存分配限制
  • Committed_AS:已分配内存大小

2)使用free方式查看

 

 其中:total = used+free+buff/cache

shared :多进程的共享内存空间,不常用。

我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。

3)top方式查看

top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认

 

 

  • VIRT:virtual memory usage,进程占用的虚拟内存大小。
  • RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
  • SHR:shared memory,共享内存大小,不常用。

 

 

 

内存管理参考:

Linux 内存管理 | 地址映射:分段、分页、段页

Linux 内存管理 | 物理内存管理:内存碎片、伙伴系统、slab分配器

Linux 内存管理 | 虚拟内存管理:虚拟内存空间、虚拟内存分配

posted @ 2021-01-10 21:51  独特的数字  阅读(105)  评论(0)    收藏  举报