Alokovatelná paměť na proces
Kasparek Tomas
kasparek na fit.vutbr.cz
Pondělí Duben 14 12:37:11 CEST 2003
Zdravím,
nemáte někdo zkušenosti s alokováním velkého množství paměti na Linuxech
(2.4) na x86 architekturách? Potřeboval bych informace o tom, kde přesně se
naráží na limity pokud alokuji >3GB.
Můj problém je v tom že bych potřeboval tu hranici posunout (aspoň o kousek
- tak na 3.2GB). Nevíte někdo o nějakém patchi do jádra který by posouval
PAGE_OFFSET nahoru?
Pokud zkusím alokovat po malých blocích tak se v součtu dostanu na 2933MB
alokovatelné paměti (2933x1MB). Je jedno jaký model paměti v jádře je -
tedy <4GB, 4GB, 64GB. Je mi jasné, že je to omezení LAP (logického
adresového prostoru) v součinosti s konfigurací 3:1 USER:KERNEL.
I pro dosaženou hodnotu mi však chybí vysvětlení - do 3GB chybí 139MB - z
/proc/XXX/maps a dalších je vidět, že knihovny a kód zabírají zhruba 1MB.
Pro tuhle úlohu by neměla vadit fragmentace - alokuje se jednou a po malých
blocích, LAP je rozbit málo (pouze kód, ld.so, libc.so). Zásobník také není
potřeba (ale nevím jaká je standardní velikost).
Díky za nakopnutí nebo odkazy na informace o alokaci v glibc/jádře.
Bye
Zde je testovací program:
<PRE>
#include <stdio.h>
#include <stdlib.h>
#define MB (1024*1024)
/* run as ./test-mem BLOCK_SIZE_IN_MB BLOCK_COUNT */
int main(int argc, char *argv[])
{
unsigned long long mem=1*MB;
unsigned long long i,count=1;
char *buf = NULL;
if (argc == 3) {
mem = strtol(argv[1], NULL, 10);
printf("mem=%llu\n", mem);
mem *= MB;
count = strtol(argv[2], NULL, 10);
}
printf("count=%llu mem=%llu (%llu KB, %llu MB)\n",
count, mem, mem/1024, mem/(1024*1024));
for(i = 0; i < count; i++){
if ((buf = (char *)malloc(mem)) == NULL)
{
printf("malloc error\n");
getchar();
return 1;
}
printf("i=%llu, total=%llu MB (addr=%X)\n", i, (i+1)*(mem/1024/1024), buf);
}
getchar();
return 0;
}
</PRE>
--
Tomas Kasparek (sioux), PhD student FIT VUT Brno
tomas.kasparek@[seznam.cz,volny.cz]
kasparek na fit.vutbr.cz, linux na fit.vutbr.cz
http://www.fit.vutbr.cz/~kasparek
Další informace o konferenci Linux