UMA架构:内存有统一的结构并且可以统一寻址。目前大部分嵌入式系统、手机系统以及台式机操作系统等采用UMA架构。如下图,该系统使用UMA架构,有4个CPU,它们都有L1高速缓存,其中CPU0和CPU1组成一个簇(Cluster0),它们共享一个L2高速缓存。另外,CPU2和CPU3组成另外一个簇(Cluster1),它们共享另外一个L2高速缓存。4个CPU都共享同一个L3的高速缓存。最重要的一点,它们可以通过系统总线来访问物理内存DDR。

NUMA架构:系统中有多个内存节点和多个CPU簇,CPU访问本地内存节点的速度最快,访问远端的内存节点的速度要慢一点。如下图,该系统使用NUMA架构,有两个内存节点,其中CPU0和CPU1组成一个节点(Node0),它们可以通过系统总线访问本地DDR物理内存,同理,CPU2和CPU3组成另外一个节点(Node1),它们也可以通过系统总线访问本地的DDR物理内存。如果两个节点通过超路径互连(Ulra Path Interconnect,UPI)总线连接,那么CPU0可以通过这个内部总线访问远端的内存节点的物理内存,但是访问速度要比访问本地物理内存慢很多。

| 访问类型 | 延迟 |
|---|---|
| L1高速缓存命中 | 约4个时钟周期 |
| L2高速缓存命中 | 约10-个时钟周期 |
| L3高速缓存命中 (高速缓存行没有共享) | 约40个时钟周期 |
| L3高速缓存命中 (和其他CPU共享高速缓存行) | 约65个时钟周期 |
| L3高速缓存命中 (高速缓存行被其他CPU修改过) | 约75个时钟周期 |
| 访问远端的L3高速缓存 | 约100~300个时钟周期 |
| 访问本地DDR物理内存 | 约60ns |
| 访问远端内存节点的DDR物理内存 | 约100ns |

[ 0.000000] On node 0 totalpages: 129920
[ 0.000000] Normal zone: 1024 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 129920 pages, LIFO batch:63
__free_pages_memory:start=0x8800e, order=1, __ffs()=1, ffs()=2
__free_pages_memory:start=0x88010, order=4, __ffs()=4, ffs()=5
__free_pages_memory:start=0x88020, order=5, __ffs()=5, ffs()=6
__free_pages_memory:start=0x88040, order=6, __ffs()=6, ffs()=7
__free_pages_memory:start=0x88080, order=7, __ffs()=7, ffs()=8
__free_pages_memory:start=0x88100, order=8, __ffs()=8, ffs()=9
__free_pages_memory:start=0x88200, order=9, __ffs()=9, ffs()=10
__free_pages_memory:start=0x88400, order=10, __ffs()=10, ffs()=11
__free_pages_memory:start=0x88800, order=10, __ffs()=10, ffs()=11
__free_pages_memory:start=0x88400, order=10, __ffs()=10, ffs()=11
.......
__free_pages_memory:start=0xaec00, order=10, __ffs()=10, ffs()=11
__free_pages_memory:start=0xaec80, order=7, __ffs()=7, ffs()=8
__free_pages_memory:start=0xaecc0, order=6, __ffs()=6, ffs()=7
__free_pages_memory:start=0xaece0, order=5, __ffs()=5, ffs()=6
__free_pages_memory:start=0xaece8, order=3, __ffs()=3, ffs()=4
__free_pages_memory:start=0xaece9, order=1, __ffs()=1, ffs()=2