衡铁刚 1)2011-2013:Alibaba MySQL DBA 2)2014-至今: Alibaba 数据库PD
分类: Mysql/postgreSQL
2012-11-28 21:13:53
内存管理单元(MMU)管理内存并把虚拟内存转换成物理地址的硬件,尽管处理器的最小寻址单位是字(字节),但是MMU是以页为单位,因为从虚拟内存的角度来看,页就是最小单位
物理页的内核结构是struct page,其中
page和物理页相关,即使页中所包含的数据继续存在,由于交换等原因,它们也不会再和同一page结构相关联,因为page是用来描述物理内存本身,而不是描述包含在其中的数据
区(相似特性的页)
内存寻址问题(硬件缺陷引起)
一些硬件只能用某些特定的内存地址来执行DMA
一些体系结构的内存的物理寻址范围比虚拟寻址范围多
ZONE_DMA(1)与ZONE_DMA32(2)区别在于后者只能被32位设备访问,两者包含的页面可用来执行DMA操作,ZONE_NORMAL(3)是能正常映射的页,ZONE_HIGHEM(4)包含高端内存,其中的页并不能永久地映射到内核地址空间
内核中使用zone结构来表示区,整个系统只有三个区name域分别为DMA、NORMAL、HIGHMEM,并使用lock域(自旋锁)来防止结构被并发访问(不保护驻留其中的页),watermark域记录随着空闲内存变化的区水位
内存分配:alloc_page(连续物理页),page_address(逻辑地址),get_zeroed_page(给用户空间每位都取消设置的页)
Kmalloc(以字节为单位分配,虚拟和物理地址都连续),vmalloc(虚拟地址连续,物理地址不连续)每种内存分配函数中都有用到了gfp_mask(分配器标志),分配器标志一共分三类:1.行为修饰符,2.区修饰符,3.类型标志
TLB:硬缓冲区,用来缓存虚拟地址到物理地址的映射关系
Slab:由一个或多个物理上连续的页组成,slab分配器是通用的数据结构缓存层,用来管理已经分配好的数据结构块的空闲链表,把不同的对象划分为高速缓存组,每个高速缓存(kmem_cache)由多个slab组成,根据slab三种状态(满、部分满、空)(三个链表 slabs_full、slabs_partial、slabs_empty)来进行分配
内核栈:1~2page(8~16KB),每个进程的整个调用链必须放在自己的内核栈中,而后来变成单页内核栈和中断处理程序单页栈,
缓存抖动:每个CPU访问自己的数据,减少数据锁定,大大减少缓存失效,而这种失效发生在处理器试图使它们的缓存保持同步,即
一个处理器操作某个数据,该数据又存放在其他处理器缓存中,那么存放数据的处理器必须清理或刷新自己的缓存