[LUGOS-PROG] Pomnilnik

Ales Casar casar at uni-mb.si
Mon Sep 19 16:51:13 CEST 2005


	Pozdravljeni!

Napisal sem spodnji programcek, katerega glavni del predstavljata dve
zanki, ena v drugi. Notranja zanka poskusa ugotoviti, kako velik kos
pomnilnika lahko alocira. Vse alokacije sproti sprosca. Zunanja zanka
alocira pol toliko pomnilnika, kot ga je uspelo v zadnjem prehodu
alocirati notranji zanki, ta pomnilnik zadrzi in vse skupaj ponovi.

Program sem zaganjal pod Linuxom na i386, x86_64 in alpha. Rezultati so
kar nekam cudni. Omejitev enega kosa pomnilnika je bila priblizno enaka
kolicini prostega virtualnega pomnilnika, oz. najvec cca 2,8 GB na i386.
Morda je kaj podobnega tudi na x86_64 in alpha, vendar zadeve nisem
poskusal na masini z vec kot nekje 7, 8 GB virtualnega pomnilnika.
Omejitev celotnega pomnilnika, ki ga je en proces zasedal pa je bila okrog
3 GB na i386, 500 GB na x86_64 in 4 TB na alpha in to prakticno ne glede
na velikost virtualnega pomnilnika, ki ga je v primeru i386 lahko bilo
celo manj od 2 GB ali pa je bilo celo prostega na voljo vec ko 4 GB, na
x86_64 in alpha pa ga je seveda bilo kvecjemu za nekaj GB.

Pozna kdo razlago za to?

Se program:
===================================================================
#include <stdlib.h>
#include <stdio.h>

int main()
  {
    size_t size, inc, max, sum;
    void *tmp;
    int b;
    char form[100];

    sum = (size_t) 0;
    size = (size_t) 1;
    b = 1;
    while (size <<= 1)
      b++;
    printf("size_t = %d-bit\n", b);
    sprintf(form, "0x%%0%dzX B, %%11.4f MB  -  0x%%0%dzX B, %%11.4f MB\n",
	    (b + 3) >> 2, (b + 3) >> 2);
    do
      {
	size = (size_t) 1 << (b - 1);
	inc =  size >> 1;
	max = (size_t) 0;
	do
	  {
	    if (tmp = (void *) malloc(size))
	      {
		free(tmp);
		if (size > max)
		  max = size;
		size += inc;
	      }
	    else
	      size -= inc;
	    inc >>= 1;
	  } while (inc);
	printf(form,
	       sum, (double) sum / (double) 1048576.0,
	       max, (double) max / (double) 1048576.0);
	if (!(tmp = (void *) malloc(max >> 1)))
	  {
	    printf("Premalo pomnilnika.\n");
	    return 1;
	  }
	sum += max >> 1;
      }
    while (1);
  }
===================================================================

Ales

-- 
Ales Casar                |  Email:    casar at uni-mb.si
Computer Centre           |  DECnet:   RCUM::ALES
University of Maribor     |  AX.25:    S56SAC @ S50MBR.SVN.EU
SLOVENIA                  |  WWW:      http://www.el.feri.uni-mb.si/~ales/



More information about the lugos-prog mailing list