Linux内存管理机制和虚拟内存技术

本文主要是研究Linux内存管理机制和虚拟内存技术,同时比较Windows NT和Linux在实现时的异同。主要为操作系统底层的实现原理的分析,花费大量篇幅描述虚拟内存技术的模型,这是理解Windows和Linux内存机制实现的基础,仅仅是对技术的介绍,提供概念和理论实现上的认知,如果对具体的实现和源码感兴趣可以自行上网查阅源码或者这方面的文章。


linux在内存管理上分为物理内存和虚拟内存

  • 物理内存:Linux操作系统使用物理内存来存储程序和数据。物理内存是计算机系统中的硬件组件,用于存储正在运行的程序和数据。Linux系统通过内存管理机制来管理物理内存。这些机制包括内存分页、虚拟内存和页面置换等。在Linux系统中,物理内存被划分为多个页面,每个页面的大小通常为4KB或者更大。操作系统将程序和数据存储在这些页面中,并为每个页面分配一个唯一的物理地址。
  • 虚拟内存:Linux系统使用虚拟内存机制,将物理内存划分为多个虚拟内存页面,每个页面与一个独立的虚拟地址相关联。这允许操作系统将物理内存中的页面映射到不同的进程的虚拟地址空间中,从而提供了内存隔离和保护的功能。

这两种内存,应该分别从不同的视角进行关注。

  • 操作系统: 更多关注物理内存的使用情况,并管理物理内存和虚拟内存的映射关系表。
  • 应用层面:应用层面通常使用的内存都是指虚拟内存,通过虚拟内存的方式,对于每个应用程序来说,看到的内存都是一样的,能够形成统一的标准,方便开发和管理。

1. 物理内存

1.1 物理内存架构

在当前的计算机、嵌入式系统中,以内存为研究对象可以分成两种架构

  • 一种是UMA(Uniform Memory Access,统一内存访问)架构
  • 一种是NUMA(Non-Uniform Memory Access,非统一内存访问)架构。

1.1.1 UMA内存架构

在这里插入图片描述
内存可以被其他模块统一寻址,有统一的结构。目前,大部分嵌入式系统及计算机系统都采用UMA架构。如上图所示,是一个UMA架构的系统,有两个cpu位于同一个cluster中,cpu分别有自己的L1D、L1I cache及L2 cache。两个cpu共享L3 cache,通过系统总线可以访问物理内存DDR,SRAM、SSD等模块,并且两个CPU对物理内存的访问消耗是一样的。这种访问模式的处理器被成为SMP(Aymmetric Multiprocessing,对称多处理器)

这种结构的CPU 是通过一条通用总线连接到北桥,北桥中的内存控制器链接着内存。这种设计中,瓶颈马上出现了。第一个瓶颈与设备对RAM 的访问有关。早期,所有设备之间的通信都需要经过 CPU,结果严重影响了整个系统的性能。为了解决这个问题,有些设备加入了直接内存访问(DMA)的能力。DMA 允许设备在北桥的帮助下,无需 CPU 的干涉,直接读写 RAM。到了今天,所有高性能的设备都可以使用 DMA。虽然 DMA 大大降低了 CPU 的负担,却占用了北桥的带宽,与 CPU 形成了争用。所以现在很少使用了。

1.1.2 NUMA内存架构

在这里插入图片描述
系统中有多个内存节点和多个cpu cluster,CPU访问本地内存节点的时间开销最小,访问远端的内存节点的时间开销要大。如上图所示,是一个NUMA架构的系统,其中cpu0、cpu1在cluster0中,与相应的L1I/L1D cache、L2 cache、L3 cache及DDR组成node0节点。同样的,CPU2、CPU3在cluster1中,与相应的L1I/L1D cache、L2 cache、L3 cache及DDR组成node1节点。两个node节点,通过UPI(Ultra Path Interconnect,超路径互联)总线连接。CPU0可以通过这个UPI访问远端node1上的物理内存,但是要比本地node0的内存访问慢得多。

1.2 分页机制

内核会将整个物理内存空间划分为一页一页大小相同的的内存块,称为一个物理内存页,一个物理内存页内部内存时连续的。

一页大小的内存块在内核中用 struct page 结构体来进行管理,struct page 中封装了每页内存块的状态信息,比如:组织结构,使用信息,统计信息,以及与其他内核结构的关联映射信息等。

  • 内核会为每个物理内存页 page 进行统一编号
  • 这个编号称之为 PFN(Page Frame Number),PFN 与 struct page 是一一对应的关系并且全局唯一
  • 然后内核会将划分出来的这些一页一页的内存块统一组织在一个全局数组 mem_map 中管理
  • 后续虚拟内存与物理内存的映射以及调度均是以页为单位进行的。

相关架构如下
在这里插入图片描述

因此,Linux采用了分页(paging)的方式来记录对应关系。所谓的分页,就是以更大尺寸的单位页(page)来管理内存。在Linux中,通常每页大小为4KB。如果想要获取当前树莓派的内存页大小,可以使用命令:

$getconf PAGE_SIZE

得到结果,即内存分页的字节数:

4096

返回的4096代表每个内存页可以存放4096个字节,即4KB。Linux把物理内存和进程空间都分割成页。

1.3 物理内存模型

1.3.1 FLATMEM 平坦内存模型

我们先把物理内存想象成一片地址连续的存储空间,在这一大片地址连续的内存空间中,内核将这块内存空间分为一页一页的内存块 struct page 。

由于这块物理内存是连续的,物理地址也是连续的,划分出来的这一页一页的物理页必然也是连续的,并且每页的大小都是固定的,所以我们很容易想到用一个数组来组织这些连续的物理内存页 struct page 结构,其在数组中对应的下标即为 PFN 。这种内存模型就叫做平坦内存模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值