Mappare file in memoria mmap(), mmunmap()
Allocazione dei processi nella RAM Process A Process B Spazio logico dei processi A e B e memoria fisica Condivisione dell’area testo
Mapping e condivisione di File Two processes can share a mapped file. Un file mappato simultaneamente in due processi
Mappaggio file in mamoria: mmap void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset) fd: descrittore file da mappare offset: inizio area fd da mappare in memoria length: lunghezza area da mappare in memoria start : indirizzo logico dal quale effettuare il mapping (tipicamente ignorato meglio passare NULL) prot/flags : maschere di bit che specificano condivisione e protezione dell’area mappata
Mappaggio file: mmap (2) void* mmap(void* start, size_t length, int prot,int flags, int fd, off_t offset) il valore restituito è l’indirizzo logico (iniziale) in cui il file è stato effettivamente mappato il valore restituito è MAP_FAILED se non si riesce a mappare il file (settando errno opportunamente)
Mappaggio file: mmap (3) prot : descrive la protezione dell’area mappata, si ottiene mettendo in OR un insieme di maschere predefinite. Es: PROT_WRITE : permesso di scrittura PROT_READ: permesso di lettura flags : se e con quali modalità l’area di memoria può essere condivisa da più processi, si ottiene mettendo in OR un insieme di maschere predefinite. Es: MAP_SHARED : si può condividere con tutti gli altri processi MAP_PRIVATE: crea una copia privata del processo, le scritture non modificano il file
Mappaggio file: mmap (4) ATTENZIONE: length deve essere un multiplo dell’ampiezza di pagina l’ampiezza della pagina (in byte) si ottiene con la fne standard #include <unistd.h> int getpagesize(void);
Mappaggio file: mmap (5) int fd, psize, esito; char* file; /* puntatore area mappata */ psize = getpagesize(); /* ampiezza pagina */ IFERROR(fd=open(“s.c”,O_RDWR), “aprendo s.c”); /* esito è -1 se la mmap() e’ fallita */ esito =(file = mmap(NULL, psize, \ PROT_READ|PROT_WRITE, MAP_SHARED, \ fd, 0) == MAP_FAILED )?-1:0; IFERROR(esito, “mappando s.c”); /* da qua accedo al file come un array */ putchar(file[10]);
S-mappaggio file: munmap() int munmap(void* start, size_t length); length: lunghezza area da s-mappare dalla memoria start : indirizzo logico dal quale effettuare lo smapping ritorna -1 se si è verificato un errore NB: la chiusura di un file NON elimina i mapping relativi al file che devono essere eliminati chiamando esplicitamente la munmap()
Mappaggio file: esempio ... IFERROR(fd=open(“s.c”,O_RDWR), “aprendo s.c”); esito =(file = mmap(NULL, psize, \ PROT_READ|PROT_WRITE, MAP_SHARED, \ fd, 0) == MAP_FAILED )?-1:0; IFERROR(esito, “mappando s.c”); IFERROR(close(fd), “chiudendo s.c”); /* da qua accedo al file come un array */ putchar(file[10]); … IFERROR(munmap(file,psize), “smappando s.c”);