美文网首页
24物理内存管理下

24物理内存管理下

作者: AndyWei123 | 来源:发表于2020-05-03 00:22 被阅读0次
  • 对于小的对象使用SLUB分配器进行分配
    • kmem_cache 作为对象分配的缓存区(每次分配对象的时候都先到缓存区找空闲的区域)
struct kmem_cache {
struct kmem_cache_cpu __percpu *cpu_slab;
/* Used for retriving partial slabs etc */
unsigned long flags;
unsigned long min_partial;
int size;    /* The size of an object including meta data */
int object_size;  /* The size of an object without meta data */
int offset;    /* Free pointer offset. */
#ifdef CONFIG_SLUB_CPU_PARTIAL
int cpu_partial;  /* Number of per cpu partial objects to keep around */
#endif
struct kmem_cache_order_objects oo;
/* Allocation and freeing of slabs */
struct kmem_cache_order_objects max;
struct kmem_cache_order_objects min;
gfp_t allocflags;  /* gfp flags to use on each alloc */
int refcount;    /* Refcount for slab cache destroy */
void (*ctor)(void *);
......
const char *name;  /* Name (only for display!) */
struct list_head list;  /* List of slab caches */
......
struct kmem_cache_node *node[MAX_NUMNODES];
};
  • kmem_cache_order_object 缓存就是由分配了几页大内存块(Max,min)。

结构如图


image.png

- kmem_cache_cup 和 kmem_cache_node 第一个为快速通道fastpath,第二个为普通通道 slowpath

结构如图


image.png

page 主页,partial 已经部分使用的页。

struct kmem_cache_cpu {
void **freelist;  /* Pointer to next available object */
unsigned long tid;  /* Globally unique transaction id */
struct page *page;  /* The slab from which we are allocating */
#ifdef CONFIG_SLUB_CPU_PARTIAL
struct page *partial;  /* Partially allocated frozen slabs */
#endif
......
};

freelist 指向第一个空闲的对像,page指向当前页,partial 执行其他部分使用的页

  • 分配内存流程
    • 从快速通道kmem_cache_cpu 的 freelist中寻找,假如有直接返回
    • 从kmem_caceh_cpu 中取出一块内存页,将当前page指针指向这个页,重现设置freelist。
    • 假如上述没有则到 kmem_cache_node 的partial 中取出一块可用的内存块,并重新设置freelist
    • 还没有的话调用 alloc_slab_page 进行内存分配
  • 内存换出
    • 被动换出
      • get_page_from_freelist>node_reclaim>shrink_node
    • 主动换出
      • 内核线程 kswapd 但内存紧张就会检查
      • balance_pgdat>kswapd_shrink_node>shrink_node
  • shrink_node 函数
    • 内存页分为两种,匿名页(和虚拟内存空间关联)和内存映射
    • 上述两种内存都维护一个两个LRU列表,active 和 inactive
    • 每次调用这个函数都会查找 inactive 的最少使用内存页换出

总结


image.png

相关文章

  • 24物理内存管理下

    对于小的对象使用SLUB分配器进行分配kmem_cache 作为对象分配的缓存区(每次分配对象的时候都先到缓存区找...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • 内存管理(一)物理内存管理

    1、 操作系统将物理内存抽象成一个字节数组,每个字节有一个物理地址。 根据物理地址可以访问到物理内存中的任意一个字...

  • 系统的内存管理

    物理地址 物理设备的真实内存地址,早期的电脑就是使用直接使用物理内存进行内存管理,为了解决多个应用内存过快使用完的...

  • 关于内存

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射image.png 一个程序被加载启动,一个重...

  • linux内存映射

    关于页表,页表其实仅仅就是保存虚拟内存和物理内存的映射关系的,跟物理内存有没有被使用没关系的。 关于内存管理,物理...

  • linux 虚拟内存的作用?

    虚拟内存可以用来管理物理内存,进程直接和虚拟内存进行打交道而不是物理内存,为什么这样设计? 什么是虚拟内存? 虚拟...

  • android内存管理和优化

    androd内存管理 物理内存与进程内存物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个D...

  • 内存管理(三)逻辑内存管理

    物理内存管理为程序运行提供服务。程序驻留在外存,并使用逻辑地址。 逻辑内存管理的核心工作:逻辑地址空间到物理空间的...

  • 知识点4-虚拟内存

    目的:为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。一般为物理内存的1.5--3倍。内存管理单...

网友评论

      本文标题:24物理内存管理下

      本文链接:https://www.haomeiwen.com/subject/fwlrghtx.html