簡體   English   中英

如何在基於Linux的嵌入式設備上造成內存碎片?

[英]How to cause memory fragmentation on a Linux based embedded device?

我想做什么:答:我正在嘗試在基於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程序工作但非常慢。

通過您使用的方法,您將無法在伙伴分配器的意義上造成重大碎片。

原因是該伙伴分配器與物理內存一起工作 用戶空間malloc邏輯內存協同工作(通過sbrkmmap(... MAP_ANON) )將調用get_free_page來分配單個頁面。 因此,它不需要物理內存相鄰,即物理頁面可以處於完全不同的存儲器地址,但MMU將使它們一起出現。 此外,用戶空間不會使用GFP_ATOMIC分配(或者現在可能稱為GFP_NOWAIT ),因此它可以簡單地交換內容以使其工作。

您需要做的是找到一些可以一次分配GFP_ATOMIC超過4k的內核內存的東西。 發送和接收大型網絡數據包是在用戶空間中執行此操作的一種方法(即使這些片段,我認為片段重組需要一個連續的緩沖區)。 更好的方法是放入一個簡單的for-test-purpose-only ioctl來分配和釋放內核塊(如果還沒有那個)。

歷史記錄:看起來很奇怪,最初的linux伙伴內存分配器是我的第一個C程序(在他接受之前由Linus重寫),雖然上次我看起來我的電子郵件地址仍然在kmalloc.c某個地方。 我不建議將此作為學習C的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM