首页 > 系统相关 >内存管理

内存管理

时间:2023-08-13 09:44:06浏览次数:37  
标签:缓存 kmalloc 管理 内存 slab 分配 高速缓存

  • 内核把物理页作为内存管理的基本单位,内核用一个page结构体表示内核中的每个物理页。
  • Linux把系统的页划分为区,形成不同的内存池,根据用途分配。区只是内核为了管理页而采用的一种逻辑上的分组。
  • 一些分配释放相关函数
  1. alloc_pages,该函数分配连续的物理页,返回一个指针指向第一个页的page结构体。free_pages做释放。
  2. kmalloc用来获得以字节为单位的一块内存。kfree做释放。
  3. vmalloc工作方式类似kmalloc,不过,vmalloc分配的内存在逻辑上是连续的而物理上则不连续。kmalloc确保在物理上是连续的。
  • slab层:扮演的通用数据结构层缓存的角色,在物理内存中拿出一部分作为缓存。slab试图在以下几个基本原则间寻找一种平衡。
  1. 频繁使用的数据结构也会频繁分配和释放,应当缓存它们。
  2. 频繁的分配和回收必然会导致内存碎片,空闲链表的缓存会连续的存放,不会导致碎片。
  3. 回收的对象可以立即进行下一次分配。
  4. 如果分配器知道对象大小,页大小和总的高速缓存的大小这样的概念,它会做出更明确的抉择。
  5. 如果让部分缓存专属某个处理器,那么分配和释放就可以在不加SMP锁的情况下进行等。使用每个CPU数据的好处减少了数据锁定和减少缓存失效。
  • slab 层把不同的对象划分为高速缓存组,其中每个高速缓存组都存放不同类型的对象。每种类型对象都对应一种高速缓存。比如inode,等常分配和释放的结构可以对应两个缓存组。
  • kmalloc 建立在slab层之上,使用了一组通用缓存。
  • 当你创建了一个高速缓存后,slab层所起的作用就像一个专用的分配器,可以为具体的对象类型进行分配。如果你要频繁的创建很多类型相同的对象,那么你就应该考虑使用slab高速缓存。

 

  • 在栈上静态分配,用户空间可以负担起非常大的栈,而且栈空间还可以动态增长。而内核栈一般只有一两页。
  • 分配函数的选择
  1. 如果你需要连续的物理页,就可以使用某个低级页分配器或kmalloc。这是内核中内存分配的常用方式。
  2. 如果你想从高端内存进行分配,就使用alloc pages()。allocpages()函数返回一个指向struct page结构的指针,而不是一个指向某个逻辑地址的指针。因为高端内存很可能并没有被映射,因此,访问它的唯一方式就是通过相应的struct page结构。为了获得真正的指针,应该调用 kmap,把高端内存映射到内核的逻辑地址空间。
  3. 如果你不需要物理上连续的页,而仅仅需要虚拟地址上连续的页,那么就使用vmalloc(不
    过要记住vmalloc()相对kmalloc()来说,有一定的性能损失)。vmalloc函数分配的内存虚地址是连续的,但它本身并不保证物理上的连续。这与用户空间的分配非常类似,也是把物理内存块映射到连续的逻辑地址空间上。

  4. 如果你要创建和撤销很多大的数据结构,那么考虑建立slab高速缓存。slab层会给每个处理
    器维持一个对象高速缓存(空闲链表),这种高速缓存会极大地提高对象分配和回收的性能。slab层不是频繁地分配和释放内存,而是为你把事先分配好的对象存放到高速缓存中。当你需要一块新的内存来存放数据结构时,slab层一般无须另外去分配内存,而只需要从高速缓存中得到一个对象就可以了。

标签:缓存,kmalloc,管理,内存,slab,分配,高速缓存
From: https://www.cnblogs.com/wuyun--wy/p/17288796.html

相关文章

  • 内存管理
    内存管理python——内存管理python的内存管理机制:引用计数、垃圾回收,内存池机制接口:gc.disable()#暂停自动垃圾回收.gc.collect()#执行一次完整的垃圾回收,返回垃圾回收所找到无法到达的对象的数量.gc.set_threshold()#设置Python垃圾回收的阈值.gc.set_debug(......
  • maven系列:依赖管理和依赖范围
    目录一、依赖管理使用坐标导入jar包使用坐标导入jar包–快捷方式使用坐标导入jar包–自动导入二、依赖范围一、依赖管理使用坐标导入jar包1.在pom.xml中编写<dependencies>标签2.在<dependencies>标签中使用<dependency>引入坐标3.定义坐标的groupId,artifact......
  • 红帽认证RedHat-RHCSA 权限管理特殊权限网络配置磁盘管理逻辑卷管理软件管理笔记汇总
    文件/目录的权限和归属 访问权限读取:允许查看文件内容、显示目录列表写入:允许修改文件内容,允许在目录中新建、移动、删除文件或子目录可执行:允许运行程序、切换目录归属(所有权)属主:拥有改文件或目录的用户账号属组:拥有该文件或目录的组账号,组中用户查看文件/目录的权限和归属......
  • 基于ssm框架的小区物业管理系统的设计与实现
    随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。小区物业管理系统,主要的模块包括查看首页、个人中心、业主管理、新闻公告管理、楼房信息管理、业主投诉管理、业主报修管理、投诉处理管理、维修回复管理、缴费信息管理......
  • 某公司笔试题 - 求int型正整数在内存中存储时1的个数(附python代码)
    #输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。#数据范围:保证在32位整型数字范围内num=int(input("请输入一个正整数:"))#将输入的正整数转化成二进制num_bin=bin(num)print(num_bin)#将二进制字符串转化成数组nbl=list(num_bin)iflen(nbl)>0and......
  • 进程管理 & (系统调用 内核同步)
    进程管理在现代操作系统中,进程提供两种虚拟机制,虚拟处理器和虚拟内存PCB描述一个正在执行的程序:打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程。在2.6以前的版本中,PCB直接放在内核栈的尾端,或者放一个pcb_info间接索引......
  • Golang之旅——内存管理
    转载放在最前一文带你了解,虚拟内存、内存分页、分段、段页式内存管理[Golang三关-典藏版]一站式Golang内存洗髓经|Go技术论坛刘丹冰Aceld感谢以上文章作者,收获满满......
  • 如何看待稚晖君的时间管理水平?
    前言 稚晖君究竟是如何安排业余时间去做这么多高水平的项目?而且每个项目的用时也很少,普通人能够从中借鉴一些经验吗?本文转载自计算机视觉life原文链接:https://www.zhihu.com/question/491456524/answer/2183081310仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专......
  • JVM——内存分配与垃圾回收
    内存分配与垃圾回收1、jvm简介Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。它们各有用途,有些随着虚拟机进程的启动一直存在(堆、方法区),有些则随着用户线程的启动和结束而建立和销毁(程序计数器、虚拟机栈、本地方法栈)。JVM的设计者们之所......
  • Linux 共享内存mmap,进程通信
    @TOC前言进程间通信是操作系统中重要的概念之一,使得不同的进程可以相互交换数据和进行协作。其中,共享内存是一种高效的进程间通信机制,而内存映射(mmap)是实现共享内存的一种常见方法。一、存储映射I/O存储映射I/O是一个磁盘文件与存储空间中的一个缓冲区相映射。于是,当从缓冲......