跳转至

内存

  • 存储器层次结构 存储器层次图

1 内存类型

  • RAM(Random Access Memory) : 随机访问存储器
  • SRAM(Static RAM) : 静态随机访问存储器
  • DRAM(Dynamic RAM) : 动态随机访问存储器。
  • SDRAM(Synchronous DRAM) : 同步动态随机访问存储器。
  • DDR(Double Data Rate SDRAM) : 双数据速率SDRAM。
  • DDR2: 第二代DDR。
  • DDR3: 第三代DDR。
  • DDR4: 第四代DDR。

1.1 SRAM

SRAM11内部有一块芯片结构维持信息,通常非常快,但是成本相对 DRAM 很高,应用时容
量不会很大, 因而不能作用系统的主要内存。 一般处理器内部的Cache就是采用SRAM。

1.2 DRAM

DRAM通常是系统的主要内存, 动态表示信息是存储在集成电路的电容器内的, 由于电容
器会自动放电, 为了避免数据丢失, 需要定期充电。 通常, 内存控制器会负责定期充电的
操作。 不过随着更好技术的提出, 该技术已经被淘汰。

1.3 SDRAM

一般DRAM都是采用异步时钟进行同步, 而SDRAM则是采用同步时钟进行同步。 通常,
采用SDRAM结构的系统会使处理器和内存通过一个相同的时钟锁在一起, 从而使处理器
和内存能够共享一个时钟周期, 以相同的速度同步工作。 该时钟会驱动一个内部的有限状
态机, 能够采用流水线的方式处理多个读写请求。
SDRAM采用分布式架构, 内含多个存储块(Bank) , 在一个时钟周期内, 它能够独立地
访问每个存储块,从而可以多次进行读写操作,增加了内存系统的吞吐率。

1.4 DDR

SDRAM技术广泛用在计算机行业中, 随着该技术的提出, 又出现了DDR(也称为
DDR1) , DDR2, DDR3。 最新的DDR4技术标准也在2014年下半年发布

2 物理内存

物理内存就是系统硬件提供的内存大小,是真正的内存,一般使用 DRAM 作为存储介质。

3 虚拟内存

为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。 虚拟内存提供了三个重要的能力: 1. 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。 2. 它为每个进程提供了一致的地址空间,从而简化了内存管理。 3. 它保护了每个进程的地址空间不被其他进程破坏。

4 swap交换分区

swap分区是一块特殊的硬盘空间,当实际物理内存不够用时,将内存中长时间不使用的数据存放到硬盘中,以此达到为其它进程腾出内存空间的作用。

5 虚拟寻址和物理寻址

  • 物理寻址过程:cpu -> 物理地址 -> 主存 -> 返回数据到cpu(存在寄存器中)
  • 虚拟寻址过程:cpu ->虚拟地址 -> MMU(地址翻译) -> 物理地址 -> 主存 -> 返回数据到cpu(存在寄存器中)

6 页

VM系统通过将虚拟内存分割为称为虚拟页(Virtual Page,VP)的大小固定的块来处理这个问题。每个虚拟页的大小为P=2^p字节。类似地,物理内存被分割为物理页(Physical Page,PP),大小也为P字节(物理页也被称为页帧(page frame))。在任意时刻,虚拟页面的集合都分为三个不相交的子集: 1. 未分配的: VM系统还未分配(或者创建)的页,是没有被进程申请使用的,也就是空闲的虚拟内存。未分配的块没有任何数据和它们相关联,因此也就不占用任何磁盘空间。 2. 缓存的:当前已缓存在物理内存中的已分配页。 3. 未缓存的:未缓存在物理内存中的已分配页。(比如mmap或brk分配后就是未缓存状态,当使用这块内存时,触发缺页中断,虚拟地址映射到主存上后,就变成缓存的状态。或者此部分从主存上替换到了磁盘)

6.1 页表

  • 页表是存在在物理内存上的。
  • 页表将虚拟页映射到物理页。每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取页表。操作系统负责维护页表的内容,以及在磁盘与DRAM之间来回传送页。
  • 通过在页表项设置有效位来标记虚拟页是缓存在物理内存还是磁盘上。

6.2 页命中和缺页中断

  • 页命中:当访问的虚拟页对应的物理页已经缓存在物理内存中时,此就叫做页命中。
  • 缺页中断:当CPU发出的虚拟地址对应的页面不在物理内存,就会产生一个缺页中断。此时操作系统通过页面置换算法将此部分内容放入物理内存中。如果物理内存没有多余空间,则在原物理内存上找到一个牺牲页,放入物理磁盘上,再将虚拟页放入物理内存中。

6.3 大页优缺点

优点: 1)大页内存TLB小姐很少,缺页中断也很少,对于内存的访问性能更好,对于占用大量内存的程序,性能提升比较明显,可以提升到50%左右。2)大页内存的内存页不会交换到磁盘上。 缺点: 1)必须使用特定的方式使用,并采用mmap映射或通过上面的方式指定。2)程序使用内存小,却申请了大页内存,会造成内存浪费,因为内存分配最小单位是页。

7 系统调用与内存管理(sbrk、brk、mmap、munmap)

  • 当分配内存大于128k时,系统使用mmap分配内存,小于128k时使用brk分配内存
  • brk分配内存时,直接在堆空间顶部偏移分配的大小,返回指针地址即完成分配。
  • mmap是在堆和栈中间的内存映射区域分配内存。
  • 由于只有一个堆顶指针_edata标识,brk分配的内存free时,可能并没有被回收,只有当堆顶数据被free时,才能通过一定_data指针达到回收内存的作用。这也是内存碎片产生的原因。
  • malloc 通过 brk() 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用
  • malloc 通过 mmap() 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放

- 参考资料

8 malloc之后free

8.1 为什么不全部使用 mmap 来分配内存?

  • 因为向操作系统申请内存,是要通过系统调用的,执行系统调用是要进入内核态的,然后在回到用户态,运行态的切换会耗费不少时间。
  • 所以,申请内存的操作应该避免频繁的系统调用,如果都用 mmap 来分配内存,等于每次都要执行系统调用。
  • 另外,因为 mmap 分配的内存每次释放的时候,都会归还给操作系统,于是每次 mmap 分配的虚拟地址都是缺页状态的,然后在第一次访问该虚拟地址的时候,就会触发缺页中断。

8.2 为什么不全部使用 brk 来分配?

  • 频繁的malloc free会产生内存碎片。

8.3 内存trim