热门
最新
红包
立Flag
投票
同城
我的
发布
内核发出内存申请的请求时,根据内核函数调用接口将启用不同的内存分配器:
1. 分区页框分配器:处理对连续页框的分配请求,分为前端的管理区分配器和伙伴系统,管理区分配器负责搜索一个能满足请求页框块大小的管理区。在每个管理区中,具体的页框分配工作由伙伴系统负责。为了达到更好的系统性能,单个页框的申请工作直接通过per-CPU页框高速缓存完成。
2. slab 分配器:slab 分配器最初是为了解决物理内存的内部碎片而提出的,它将内核中常用的数据结构看做对象。slab分配器为每一种对象建立高速缓存。内核对该对象的分配和释放均是在这块高速缓存中操作。可以看到每种对象的高速缓存是由若干个slab组成,每个slab是由若干个页框组成的。虽然slab分配器可以分配比单个页框更小的内存块,但它所需的所有内存都是通过伙伴算法分配的。
————————————————
版权声明:本文为CSDN博主「Linux内核站」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youzhangjing_/article/details/124410703
操作系统交流区
CSDN App 扫码分享
评论
2
打赏
- 复制链接
- 举报
下一条:
所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。在内核态申请内存比在用户态申请内存要更为直接,它没有采用用户态延迟分配内存技术。内核认为一旦有内核函数申请内存,那么就必须立刻满足该申请内存的请求,并且这个请求一定是正确合理的。相反,对于用户态申请内存的请求,内核总是尽量延后分配物理内存,用户进程总是先获得一个虚拟内存区的使用权,最终通过缺页异常获得一块真正的物理内存。vmalloc()的内存分配原理与用户态的内存分配相似,都是通过连续的虚拟内存来访问离散的物理内存,vmalloc()申请物理内存时是立即分配的,因为内核认为这种内存分配请求是正当而且紧急的。————————————————版权声明:本文为CSDN博主「Linux内核站」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/youzhangjing_/article/details/124410703为了能够让1G的内核线性地址空间能够管理4GB大小的物理内存,内核将 1GB 线性地址空间分为了 3 部分:物理页面映射区域(896MB),对物理内存的ZONE_DMA、ZONE_NORMAL 进行连续直接映射;安全保护区域(8MB);内核地址空间(120MB),目的是临时(用完即释放)映射物理内存的ZONE_HIGHMEM(896MB~4GB)。