[英]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
與邏輯內存協同工作(通過sbrk
或mmap(... 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.