Linux基础之内存

物理内存和虚拟内存

定义

物理内存: 物理内存条提供的的内存空间,真正存储数据的地方;
虚拟内存: 每个进程的逻辑内存,特点是独立、连续,只是逻辑上存在,并不能真正存储数据;

内存映射

  因为所有进程的虚拟内存加起来会远超物理内存,所以操作系统只会给进程真正使用的虚拟内存分配物理内存,通过页表维护进程的虚拟内与与物理内存之间的映射关系,每个页表都有一个单独的页表,如下图所示:
在这里插入图片描述

虚拟内存好处

  • 进程隔离:每个进程拥有独立的虚拟地址空间,进程间互不影响;
  • 地址空间:虚拟地址空间是连续、无限大的(64位系统),降低应用程序开发难度;
  • 物理内存管理:物理内存完全由操作系统管理,更加安全高效;
  • 共享内存:进程间共享的数据只需在物理内存中维护一份即可;

内核空间和用户空间

 为了避免用户进程直接操作内核,保证内核安全,操作系统将进程的虚拟内存划分为两部分,一部分是内核空间(Kernel-space),一部分是用户空间(User-space),如下图所示:
在这里插入图片描述
在这里插入图片描述

用户空间

  用户的程序运行在用户空间,称为“用户态”。处于用户态的进程不能访问内核空间中的数据,也不能直接调用内核函数,必须要先切换为“内核态”才行。用户空间内存可以分为五部分:

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

内核空间

  内核空间是为操作系统的内核保留的,按访问权限可以分为进程私有和进程共享两块区域:

  • 进程私有的虚拟内存:每个进程都有单独的内核栈、页表、task 结构以及 mem_map 结构等;
  • 进程共享的虚拟内存:属于所有进程共享的内存区域,包括物理存储器、内核数据和内核代码区域。虽然每个进程的地址空间都包含了内核空间,但这些内核空间,其实关联的都是相同的物理内存,如下图所示:
    在这里插入图片描述

内存查看

系统整体使用及各进程使用 — top

  • VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内;
  • RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存;
  • SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等;
  • %MEM 是进程使用物理内存占系统总内存的百分比;

系统整体使用 — free/vmstat

各进程使用 — pidstat

参考:

  1. 支撑百万并发的“零拷贝”技术,你了解吗?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章