目录
一、处理器架构
ARMV8 虚拟化和安全特性在ARMV7架构中已经实现,但对大内存的支持不够,虽然可以通过大物理内存地址扩展支持40位的物理地址空间,但由于32位的处理器最多支持4GB的虚拟地址空间,不合适虚拟内存需求巨大的应用。ARMV8-A支持64位指令集,并且向前兼容ARMv7-A .
二、内存屏障产生的原因
- 编译时,编译器优化导致内存乱序访问;
规避方法
#define barrier() __asm__ __volatile__("" ::: "memory")
告诉编译器,不要为了性能优化代码重排。
- 执行时,多个CPU间交互引起的内存乱序访问;
三、物理内存概述
- 编程接触内存使用malloc C函数库申请,此函数申请的是虚拟内存,要了解虚拟内存,需要了解MMU,页表、物理内存、物理页面、映射关系、按需分配、缺页中断、写时复制等;
- 当了解MMU时,除了要了解MMU工作原理外,还需要了解Linux内核如何建立页表映射,用户空间页表的建立和内核空间页表的建立,以及内核是如何查询页表和修改页表
- 当了解物理内存和物理页面时,接触数据结构pglist_data,zone,page,这三个数据结构描述了系统中物理内存的组织架构。page数据结构除了描述一个4KB大小的物理页面外,还包括很多复杂的成员;
- 当了解分配物理页面时,出现伙伴系统机制和页面分配器
- 有了物理内存,虚拟内存和物理内存如何映射?在linux内核中,用vm_area_struct数据结构描述进程的虚拟内存。对于虚拟内存和物理内存,采用 建立页表 的方法来建立映射关系;还出现匿名页;
- malloc分配内存,出现缺页中断;
- 虚拟内存和物理内存已经建立了映射关系,这是以页面为基础,如果内核有时需要小于一个页面大小的内存,slab分配机制出现;
- 如果用户持续分配内存,物理内存不够时,出现页面回收机制和反向映射机制;
- 虚拟内存和物理内存的映射关系经常在建立后又解除了,系统物理内存页面布局出现碎片化,出现内存规整机制;
四、处理器访问内存时间
访问类型 | 延迟(大约) |
---|---|
L1高速缓存命中 | 4个时钟周期 |
L2高速缓存命中 | 10个时钟周期 |
L3高速缓存命中(高速缓存行没有共享) | 40个时钟周期 |
L3高速缓存命中(和其他CPU共享高速缓存) | 65个时钟周期 |
L3高速缓存命中(高速缓存行被其他CPU修改过) | 75个时钟周期 |
访问远端的L3高速缓存 | 100~300个时钟周期 |
访问本地DDR物理内存 | 60ns |
访问远端内存节点的DDR物理内存 | 100ns |
五、用户态常用的内存申请API
void *malloc(size_t size);
void free(void *ptr);
void *mmap(void *addr,size_t length,int prot,int flags,int fd,off_t offset);
int getpagesize(void);
int mprotect(const void *addr,size_t len,int port);
int mlock(const void *addr,size_t len);
int munlock(const void *addr,size_t len);
int madvise(void *addr,size_t length,int advise);
void *mremap(void *old_address,size_t old_size,size_t new_size,int flags);
int remap_file_pages(void *addr,size_t size,int port,ssize_t pgoff,int flags);