如何在基于Linux的嵌入式设备上造成内存碎片?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在基于Linux的嵌入式设备上造成内存碎片?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1847字,纯文字阅读大概需要3分钟。
内容图文
![如何在基于Linux的嵌入式设备上造成内存碎片?](/upload/InfoBanner/zyjiaocheng/954/fbe818a948914dc5bbf23f091ac5bceb.jpg)
我想做什么:
答:我正在尝试在基于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的方法.
内容总结
以上是互联网集市为您收集整理的如何在基于Linux的嵌入式设备上造成内存碎片?全部内容,希望文章能够帮你解决如何在基于Linux的嵌入式设备上造成内存碎片?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。