内存管理
文章平均质量分 92
congchp
这个作者很懒,什么都没留下…
展开
-
反碎片技术
内存碎片分为内部碎片和外部碎片:内部碎片指内存页里面的碎片;外部碎片指空闲的内存也是分散的,很难找到一组物理页连续的空闲内存页,无法满足超过一页的内存分配请求;内核有时需要分配超过一页的物理内存,因为内核使用线性映射区的虚拟地址,需要分配连续的物理页;使用巨型页,也需要分配连续的物理页;为可决外部碎片问题,内核引入反碎片技术:1)虚拟可移动区域;2)内存碎片整理;虚拟可移动区域是预防外部碎片的技术;内存碎片整理是在出现外部碎片以后消除外部碎片的技术;原创 2024-04-26 10:37:32 · 399 阅读 · 0 评论 -
巨型页原理
当运行内存需求量较大的应用程序时,如果使用长度位4KB的页,将会产生较多的TLB未命中和缺页异常,严重影响应用程序的性能;如果使用长度为2MB甚至更大的巨型页,可以大幅减少TLB未命中和缺页异常的数量,大幅提高应用程序的性能;这正是引入巨型页(Huge Page)的直接原因;巨型页首先需要处理器能够支持,然后需要内核支持;原创 2024-04-12 15:41:31 · 379 阅读 · 0 评论 -
页回收机制
申请分配物理页的时候,页分配器首先尝试使用低水线分配页;如果使用低水线分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页;如果使用最低水线分配失败,说明内存严重不足,;针对不同的物理页,采用不同的回收策略;物理页根据是否有存储设备支持分为两类:1)可以被交换的页:没有存储设备支持的物理页,包括匿名页,以及tmpfs文件系统(内存中的文件系统)的文件页和进程在修改私有的文件映射时复制生成的匿名页;2)存储设备支持的文件页;原创 2024-04-12 15:37:28 · 340 阅读 · 0 评论 -
页表缓存TLB原理
处理器的内存管理单元(Memory Management Uint,MMU)负责把虚拟地址转换成物理地址,为了加快虚拟地址到物理地址的转换速度,避免每次转换都需要查询内存中的页表,处理器厂商在MMU中增加了一个高速缓存TLB(Translation Lookaside Buffer),TLB直译为转换后背缓冲区,也叫页表缓存;页表缓存用来缓存最近使用过的页表项,有些处理器使用两级页表缓存:第一级TLB分为指令TLB和数据TLB,取指令和取数据可以并行执行;原创 2024-04-12 15:35:58 · 632 阅读 · 0 评论 -
用户空间缺页异常
当没有创建一个虚拟地址到物理地址的映射,或者创建了这样的映射,但是该物理页不可写的时候,MMU将会通过CPU产生一个缺页异常;handle_pte_fault的详细流程,do_anonymous_page,do_fault以及写时复制等,比较复杂,后续进行补充;1)启动程序的时候,内核为程序的代码段和数据段创建私有的文件映射,映射到进程的虚拟地址空间,第一次访问的时候触发文件页的缺页异常;2)进程使用mmap创建文件映射,把文件的一个区间映射到进程的虚拟地址空间,第一次访问的时候触发文件的缺页异常;原创 2024-04-12 15:35:01 · 261 阅读 · 0 评论 -
页表基本原理
前面四级页表的表项存放下一级页表的起始地址,直接页表的表项存放页帧号(Page Frame Number,PFN);内核页游一个页表,0号内核线程的进程描述符init_task的成员active_mm指向内存描述符init_mm,内存描述符init_mm的成员pgd指向内核的页全局目录swapper_pg_dir;转换表和内核的页表术语的对应关系:0级转换表对应页全局目录,1级转换表对应页上层目录,2级转换表对应页中间目录,3级转换表对应直接页表;同一种处理器架构在页长度不同的情况可能选择不通的页表级数;原创 2024-04-06 20:32:01 · 688 阅读 · 0 评论 -
不连续页分配器
之后遍历vmap_area_list,在两个相邻vmap_area之间找到一个足够大的空洞,如果找到了,把起始虚拟地址和结束虚拟地址保存在新的vmap_area实例中,将新的vmap_area加入到vmap_area_list中;在这种情况下,如果需要分配长度超过一页的内存块,可以使用不连续页分配器,分配虚拟地址连续但物理地址不连续的内存块;如果虚拟内存区域是使用vmap分配的,vm_struct实例的差别是:成员flags没有设置VM_ALLOC,成员pages是NULL,成员nr_pages是0;原创 2024-04-05 19:34:40 · 1021 阅读 · 0 评论 -
伙伴分配器
连续的物理页合在一起称为页块(page block);阶(order)是伙伴分配器中的一个专业术语,是页的数量单位,2^n个连续的物理页成为n阶页块;满足以下条件的两个n阶页块称为伙伴(buddy):1、两个页块是相邻的,即物理地址是连续的;2、页块的第一页的物理页号必须是2^n的整数倍;3、如果合并成(n+1)阶页块,第一页的物理页号必须是2^(n+1)的整数倍。这是伙伴分配器(buddy allocator)的名字的来源;原创 2024-03-01 11:19:53 · 669 阅读 · 0 评论 -
引导内存分配器原理
在伙伴系统的接管内存管理时将 memblock中可用的空闲内存全部释放给伙伴系统,并丢弃 memblock 内存分配器。memblock_add,将一块内存添加到内存块分配器管理的内存池中,这个函数通常在内存管理初始化阶段调用,用于在memblock内存池中增加额外的可用内存;在内核初始化的过程中需要分配内存,内核提供了临时的引导内存分配器,在页分配器和块分配器初始化完毕后,把空闲的物理页交给页分配器管理,丢弃引导内存分配器;内存镜像是一种内存冗余技术,将内存数据做复制,分别放在主内存和镜像内存中;原创 2024-03-01 10:22:42 · 757 阅读 · 0 评论