La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Mappare file in memoria

Presentazioni simili


Presentazione sul tema: "Mappare file in memoria"— Transcript della presentazione:

1 Mappare file in memoria
mmap(), mmunmap()

2 Allocazione dei processi nella RAM
Process A Process B Spazio logico dei processi A e B e memoria fisica Condivisione dell’area testo

3 Mapping e condivisione di File
Two processes can share a mapped file. Un file mappato simultaneamente in due processi

4 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

5 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)

6 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

7 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);

8 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]);

9 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()

10 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”);


Scaricare ppt "Mappare file in memoria"

Presentazioni simili


Annunci Google