软件开发还是网站开发好,网站建设在那里接单,做数学题网站,网络营销策划方案模板范文目录
一、内核中小内存、频繁分配和释放场景
二、slab是内存池化技术
三、内核中使用slab对象池的地方
四、slab内核设计 使用比页小的内存#xff0c;内核的处理方式使用slab
一、内核中小内存、频繁分配和释放场景
slab首先会向伙伴系统一次性申请一个或者多个物理内存…目录
一、内核中小内存、频繁分配和释放场景
二、slab是内存池化技术
三、内核中使用slab对象池的地方
四、slab内核设计 使用比页小的内存内核的处理方式使用slab
一、内核中小内存、频繁分配和释放场景
slab首先会向伙伴系统一次性申请一个或者多个物理内存页面正是这些物理内存页组成了slab内存池。slab内存池会将这些连续的物理内存页面划分成多个大小相同的小内存块同一种slab内存池下划分出来的内存块尺寸是一样的。比如内核经常使用的核心数据结构 task_struct mm_struct ,struct page ,struct file socket对象等。
二、slab是内存池化技术
当内核需要频繁分配和释放内核对象时就可以直接从相应的slab对象池中申请和释放内核对象避免了链路较长的内存分配与释放技术极大的提升性能。利用CPU高速缓存 提高访问速度。当一个对象被直接释放回slab时这个内核对象还是热的仍然驻留在CPU高速缓存中。如果这时继续向SLAB对象池申请对象SLAB对象池就会把这个刚刚释放驻留在高速缓存中的对象分配给内核使用访问起来速度会更快。伙伴系统只能分配2^ORDER物理内存页这会引起占用高速缓存以及TLB的空间较大导致一些不重要的数据驻留在CPU高速缓存行中占用宝贵的缓存空间而重要的数据被置换中内存中slab对象池针对小内存分配场景。可以有效的避免这一点。调用伙伴系统的操作会对CPU高速缓存L1CACHE中的Instruction Cache和 Data Cache有污染因为伙伴系统的长链路调用相关的一些指令和数据必然会填充到Instruction Cache 和 Data Cache 中从而将频繁使用的一些指令和数据挤压出去造成缓存污染。使用slab对象池可以充分利用CPU高速缓存避免多个对象同一cache line的征用。
三、内核中使用slab对象池的地方 fork 内核需要使用task_struct专属的slab对象池分配task_struct对象
tsk alloc_task_struct_node(node) 为进程创建虚拟内存空间是内核使用mm_struct专属的slab对象池分配mm_struct对象。
struct mm_struct * mm allocate_mm() 向高速缓存page cache查找对应的文件缓存页时内核需要使用struct page专属的slab对象池分配 struct page *page __page_cache_alloc(gfp_mask) 使用open打开文件时内核需要使用struct file 专属的slab对象池分配 struct file对象 struct file *flip alloc_empty_file() socket对象
newsock sock_alloc()
四、slab内核设计
slab对象池可根据情况向伙伴系统一次性申请一页或多个内存页。 对象的object size可以是任意的并不是内存对齐的CPU访问没有对齐的内存比访问对齐的内存速度要慢一倍。不能简单按照尺寸object size来划分内存块需要考虑对象内存地址要按照 word size进行对齐。内核为了应对内存读写越界场景在内存周围插入了一段不可访问的内存区域这些内存区域使用特定字节0xbb填充当进程访问到内存是0xbb时表示已经越界访问了这段内存区域在slab术语为 red zone。可以理解为红色警戒区。
学习参考
https://xxetb.xetslk.com/s/9SQuY