📜  分配内核内存(伙伴系统和slab系统)(1)

📅  最后修改于: 2023-12-03 14:50:11.948000             🧑  作者: Mango

分配内核内存(伙伴系统和slab系统)

在操作系统中,程序员需要经常使用内存来存储数据和代码等,在Linux内核中,提供了两种主要的内存分配方式:伙伴系统和slab系统。

伙伴系统

伙伴系统是Linux内核的一种内存分配算法,其目的是为了解决内存碎片问题。该算法将可用内存按照2的整数次幂来划分成一个个大小相等的块,通过这种方式将内存分成多个内存池。每个内存池都由一个或多个同等大小的内存块组成,这些内存块按照2的整数次幂配对成为伙伴块,伙伴块之间相互称为伙伴关系。

当需要分配一块内存时,伙伴系统会查找一个大小适当的伙伴块并将其划分成两个同等大小的块,其中一个分配给用户,另一个则变成可分配的、具有相同大小的伙伴块。当用户释放内存时,伙伴系统会将其与伙伴块合并成一个更大的块,并且将其标记为可分配状态。这样一来,就可以保持内存池的连续,并重复使用现有的空闲块。

下面是一个简单的代码片段,展示了如何在Linux内核中使用伙伴系统来分配内存:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>

void *mem = NULL;

int my_init(void)
{
    mem = kmalloc(1024, GFP_KERNEL);
    if (!mem) {
        printk(KERN_ALERT "Failed to allocate memory\n");
        return -ENOMEM;
    }

    printk(KERN_ALERT "Memory allocation successful\n");
    return 0;
}

void my_exit(void)
{
    if (mem) {
        kfree(mem);
        printk(KERN_ALERT "Memory freed\n");
    }
}

module_init(my_init);
module_exit(my_exit);
Slab系统

与伙伴系统不同,Slab系统是Linux内核的一种快速内存分配机制,适合于小块内存的分配。该系统通过维护一个或多个对象缓存来实现快速内存分配。对象缓存表示一个内存对象池,其中存储了相同类型的对象。在分配内存时,Slab系统会从对象缓存中分配一个对象,而无需考虑内存块的分配和释放问题。

对象缓存提供了对象初始化和内存释放等基本功能,可以存储任何类型的内存对象,并支持内存伙伴系统和虚拟内存管理系统。Slab系统可以动态调整内存缓存大小,并且在使用过程中会自动管理内存池中的空闲块,避免内存碎片的产生。

下面是一个简单的代码片段,展示了如何在Linux内核中使用Slab系统来分配内存:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>

struct my_object {
    int id;
    char *name;
};

struct kmem_cache *cache = NULL;
struct my_object *obj = NULL;

int my_init(void)
{
    cache = kmem_cache_create("my_cache", sizeof(struct my_object), 0, 0, NULL);
    if (!cache) {
        printk(KERN_ALERT "Failed to create cache\n");
        return -ENOMEM;
    }

    obj = kmem_cache_alloc(cache, GFP_KERNEL);
    if (!obj) {
        printk(KERN_ALERT "Failed to allocate object\n");
        return -ENOMEM;
    }

    obj->id = 1;
    obj->name = "my object";

    printk(KERN_ALERT "Object allocation successful\n");
    return 0;
}

void my_exit(void)
{
    if (obj) {
        kmem_cache_free(cache, obj);
        printk(KERN_ALERT "Object freed\n");
    }

    if (cache) {
        kmem_cache_destroy(cache);
    }
}

module_init(my_init);
module_exit(my_exit);
总结

在Linux内核中,使用伙伴系统和slab系统来分配内存是非常常见的操作。伙伴系统适用于大块内存的分配,可以避免内存碎片的产生;Slab系统适用于小块内存的分配,可以快速分配和释放内存对象。程序员应当根据自己的需求选择适合自己的内存分配方式,以提高系统的内存使用效率。