UMA计算机(uniform memory access)将可用内存以连续方式组织起来。SMP系统中每个处理器访问各个内存区都是同样快。
NUMA计算机(non-uniform memory access)总是多处理计算机。系统的各个CPU都有本地内存,可支持特别快速的访问。各个处理器之间通过总线连接起来,以支持对其它CPU的本地内存的访问。
对于SMP系统,每个处理器对内存区的访问速度都相同,因此NUMA下只有一个Node(UMA), 该Node拥有自己的mem_map数组,同时将这唯一的Node分成几个zone,每个zone再用独立的伙伴系统管理物理页面。
page cache:读写文件时文件内容的cache,大小为一个页,不一定才固态存储器上连续。
buffer cache:读写固态存储器时,固态存储器内块内容的cache,buffer cache的内容对应固态存储器上的一个连续的区域,一个buffer cache大小可能从512到一个页。
swap cache:是page cache的子集。用于多个进程共享的页面被换出到交换区的情况。
buffer cache缓冲固态存储器块内容,page cache缓冲文件的一页内容。page cache写回固态存储器时会使用临时的buffer cache来写固态存储器。
注意下kupdate、bdflush、kswapd线程。
逻辑地址:x86中使用,段:偏移
线性地址:x86下逻辑地址经过分段单元处理后得到的线性地址;
物理地址:线性地址经过也表查找后得出物理地址,这个地址将被送到总线上指示所要访问的物理内存单元。
总线地址:总线寄存器地址、外设总线和内存之间使用(Sparc 架构上有这要的概念)
内核逻辑地址:常规的内核地址空间,映射了大部分主存,可以当作物理内存使用;内核逻辑地址与相应的物理地址相差一个常数偏移量(对等映射)
内核虚拟地址:由函数vmalloc 和 kmap_high返回的地址,不能直接对应物理内存,需要内存分配核地址转换才能与物理地址联系起来(页表映射)
LINUX:避免使用x86的段功能以提高可移植性,使用基址为0的段,使得逻辑地址=线性地址,一般 物理地址 = 总线地址,也可称线性地址为虚拟地址(但是如上所述,仍有差别,只是我看的部分书籍及手册中也没有特别作出区分)
在buddy system算法上运行的存储器区(memory area)分配算法没有显著的效率:
1)不同的数据类型用不同的方法分配内存可以提高效率。如需要初始化的数据结构,释放后可以暂存着,再分配时就不必初始化了
2)内核的函数常常重复使用同一类型的内存区,缓存最近释放的对象可以加快分配和释放
3)对内存的请求可以按照请求频率来分类,频繁使用的类型使用专门的缓存,很少使用的可以使用取整到2的幂次的通用缓存等算法
4)使用2的幂次大小的内存区域时,高速缓存冲突的概率较大,可以通过仔细安排内存区域的起始地址来减少高速缓存冲突
5)缓存一定数量的对象可以减少对buddy系统的调用,从而节省时间,并减少由此引起的高速缓存“污染”
slab分配器将存储区看作对象(object),它把对象按照类型分组成不同的高速缓存;每个slab由一个或多个连续的页框组成,这些页框中包含已分配的对象,也包含空闲的对象; slab分配器通过伙伴系统分配页框。