如何在基于Linux的嵌入式设备上造成内存碎片?

时间:2014-03-06 21:19:49

标签: c linux memory memory-management linux-kernel

我想做什么: 答:我正在尝试在基于Linux 2.6.31的无交换嵌入式设备上创建内存碎片。

为什么: 答:我正在尝试将一些补丁移植到Linux 2.6.31,它将对碎片内存进行碎片整理。为了测试这些补丁是否正常工作,我想首先尝试分段内存。

我了解到应用程序连续分配和释放内存会导致碎片化。因此我写了这些简单的C程序。

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    srand(time(NULL));
    int i = 0, j = 0, randnum=0;
    while(1) {

        randnum = rand()%10000000;
        double *ptr = (double*) malloc(sizeof(*ptr) * randnum);

        for(j = 0 ; j < randnum; j++) {
            *(ptr+j) = (double)j+1;
        }

        free(ptr);
    }
}

==========

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    srand(time(NULL));
    int i = 0, j = 0, randnum=0;
    int arr[6] = { 3072, 7168, 15360 , 31744, 64512, 130048}; 
    while(1) {

        for (i = 0; i < 6 ; i++) {

            int *ptr = (int*) malloc(arr[i] * 93);  

            for(j = 0 ; j < arr[i] * 93 / sizeof(int); j++) {
                *(ptr+j) = j+1;
            }

            free(ptr);
        }
    }       
}

如何衡量内存是否碎片化?: 答:我看一下/proc/buddyinfo

的o / p

我需要什么:? 你能建议一种更好的方法来分解内存吗?因为那些C程序的工作非常缓慢。

1 个答案:

答案 0 :(得分:5)

通过您使用的方法,您将无法在伙伴分配器的意义上造成重大碎片。

原因是该伙伴分配器使用物理内存。用户空间malloc可与逻辑内存配合使用,并且(通过sbrkmmap(... MAP_ANON))将会调用get_free_page来分配单个页面。因此,它不需要 phyiscal存储器相邻,即物理页面可以处于完全不同的存储器地址,但是MMU将使它们一起出现。此外,用户空间不会分配GFP_ATOMIC(或者这些天可能称为GFP_NOWAIT),因此它可以简单地交换出来使它们工作。

您需要做的是找到能够一次分配GFP_ATOMIC超过4k的内核内存的东西。发送和接收大型网络数据包是在用户空间中执行此操作的一种方法(即使这些片段,我认为片段重组需要一个连续的缓冲区)。更好的方法是放入一个简单的for-test-purpose-only ioctl来分配和释放内核块(如果还没有那个)。

历史记录:看起来很奇怪,最初的linux伙伴内存分配器是我的第一个C程序(在他接受之前由Linus重写),虽然上次我看起来当时我的电子邮件地址仍在某处在kmalloc.c。我不建议将其作为学习C的方法。