Avatar billede aa5000 Nybegynder
19. september 2003 - 10:52 Der er 13 kommentarer

mmap i Linux

Jeg har foelgende kode der skal skrive et int array til en fil og efterfoelgende mmape det. Problemet er at i whileloekken til sidst faar jeg lagersegmenteringsfejl. Er der nogen der har forslag til hvad der kan vaere galt?

n = 110000000;
d = 1024;
r = 2000000;
for (i = 0; i < n; i++) {
    k = (i + d) % n;
    fwrite(&k, sizeof(int), 1, fp);
  }

fd = open("/tmp/memmap", O_RDWR, 0);
int *theArray = (int *) mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

while (r--) {
    i = theArray[i];
  }


/Andreas
Avatar billede arne_v Ekspert
19. september 2003 - 11:13 #1
Jeg forstå ikke helt koden.

F.eks.

while (r--) {
    i = theArray[i];
  }

laver den samme assigment 2 millioner gange som koden er postet...
Avatar billede aa5000 Nybegynder
19. september 2003 - 11:43 #2
i er 0 til at starte med og jeg hopper rundt i hop af d: 0d, d, 2d, 3d, 4d....
Avatar billede aa5000 Nybegynder
19. september 2003 - 11:44 #3
altsaa i=0 lige inden whileloekken
Avatar billede conrad Nybegynder
19. september 2003 - 11:46 #4
i bliver da talt op i din for-løkke
Avatar billede aa5000 Nybegynder
19. september 2003 - 15:28 #5
ja, men jeg har ikke sat al koden ind - jeg glemte at skrive at jeg lige før whileløkken har sat i=0.
Avatar billede arne_v Ekspert
19. september 2003 - 19:57 #6
Men derfor laver du stadig de samme assignment 2 millioner gange ??
Avatar billede aa5000 Nybegynder
19. september 2003 - 21:47 #7
Jeg starter jo med at initialisere arrayet så hver indgang i indeholder (i + d) % n. Så når jeg starter med i = 0 sætter jeg første gang i til d, dernæst til 2d, så til 3d etc. Ideen med programmet er at finde blokstørrelsen data bliver læst ind i hukommelsen fra harddisken med. Når jeg finder det rette d vil jeg fra udførelsestiden kunne se at jeg hver gang jeg tilgår en ny indgang skal tilgå en ny blok.
Avatar billede segmose Nybegynder
20. september 2003 - 03:15 #8
Andet argument til mmap er antal bytes ikke antal ints, brug n*sizeof(int) istedet.

The mmap function asks to map  length  bytes  starting  at
offset offset from the file (or other object) specified by
the file descriptor fd into memory, preferably at  address
start.  This latter address is a hint only, and is usually
specified as 0.  The actual  place  where  the  object  is
mapped is returned by mmap, and is never 0.
Avatar billede metal_hansen Nybegynder
02. oktober 2003 - 13:37 #9
n = 110000000;
h = 1024;
r = 2000000;
til (i = 0; i < n; i++) {
    k = (i + d) % n;
    fwrite(&k, sizeof(int), 1, fp);
  }
n= 32000;
Avatar billede kurt_cobain Nybegynder
02. oktober 2003 - 13:38 #10
Metal_Hansen...)
Hva snakker du om?
Avatar billede metal_hansen Nybegynder
02. oktober 2003 - 14:07 #11
kurt cobain > jeg har IKKE lagt det svar:

Svar: metal_hansen
02/10-2003 13:37:34

Jeg har sendt en mail til admin, for der må være en bug i sikkerheden.

Hvis du der har lagt det svar lige gider melde dig, hvis det ikke er sket med vilje, ville det være godt.
Avatar billede arne_v Ekspert
02. oktober 2003 - 14:16 #12
metal_hansen>

Du er vel ikke kommet tid at poste et link som inkluderer session ID ?
Avatar billede metal_hansen Nybegynder
02. oktober 2003 - 14:21 #13
arne_v > det tror jeg ikke - og hvis det skulle ske er det meget længe siden..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester