Sdílená a mapovaná paměť Dočasné soubory Závěr Práce s pamětí Tématicky zaměřený vývoj aplikací v jazyce C skupina Systémové programování – Linux Martin Husák, Petr Velan, Martin Drašar Fakulta informatiky Masarykova univerzita {husakm|velan|drasar}@ics.muni.cz Brno, 7. prosinec 2015 Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 1 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Hrátky s pamětí Sdílená a mapovaná paměť Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 2 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Sdílená paměť jeden ze základních konceptů meziprocesové komunikace dva a více procesů sdílejí tutéž oblast v paměti velikost sdílené paměti je vždy násobkem velikosti stránky v systému (viz man 2 getpagesize) nejrychlejší způsob komunikace (nevstupuje se do kernel-space, nekopírují se žádná data) je ale třeba důsledně řídit přístup k paměti! Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 3 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Sdílená paměť Princip fungování 1 jeden z procesů alokuje segment paměťi požadované velikosti pro konkrétní klíč 2 ostatní procesy se k alokovanému segmentu připojují – musí znát identifikátor segmentu, který získají buď předáním ID nebo pomocí klíče a shmget() 3 po skončení práce se všechny procesy odpojí od alokovaného segmentu 4 jeden z procesů paměť nakonec dealokuje Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 4 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Sdílená paměť – funkce #include int shmget(key_t key, size_t size, int shmflg); void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmaddr); int shmctl(int shmid, int cmd, struct shmid_ds *buf); key – identifikátor segmentu (ftok()), IPC_PRIVATE vytvoří nový segment shmflg1 – IPC_CREAT, IPC_EXCL, přístupová práva. shmflg2 – SHM_RND, SHM_RDONLY cmd – IPC_STAT, IPC_RMID (exit nechává paměť alokovanou!), IPC_SET, . . . Ladění pomocí ipcs -m 1 shmget 2 shmat Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 5 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Sdílená paměť – ukázka /* prepare key */ key_t shmkey = ftok("somefile", 1); /* get a piece of memory */ int shmid = shmget(shmkey, getpagesize(), IPC_CREAT | S_IRUSR | S_IWUSR); /* attach to the memory */ void *shared_memory = shmat (shmid, 0, 0); /* do the job */ /* declare memory to be destroyed */ if (shmctl(shmid, IPC_STAT, &shm) == -1 || shmctl(shmid, IPC_RMID, &shm) == -1) { perror("shmctl FAILURE"); } /* detach the memory */ shmdt((void*)shared_memory); Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 6 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr úkol Program uloží do sdílené paměti řetězec (parametr programu), který následně v cyklu vypisuje Při spuštění další instance programu, začnou všechny předchozí instance vypisovat nový řetězec Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 7 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Mapovaná paměť opět jeden z nástrojů meziprocesové komunikace dva a více procesů komunikují pomocí sdíleného souboru (paměťový segment se jménem) Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 8 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Mapovaná paměť opět jeden z nástrojů meziprocesové komunikace dva a více procesů komunikují pomocí sdíleného souboru (paměťový segment se jménem) druhým (častějším) použitím je urychlení práce se souborem (se souborem budeme pracovat jako s pamětí) Linux vytvoří asociaci mezi souborem a pamětí a obsah souboru namapuje do stránek v paměti Rozpadá se konzistence mezi namapovaným souborem a skutečným souborem na disku Často se používá zařízení /dev/zero – paměť je pak inicializovaná na nuly Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 8 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Mapovaná paměť #include void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int msync(void *addr, size_t length, int flags); int munmap(void *addr, size_t length); prot – PROT_READ, PROT_WRITE, PROT_EXEC, PROT_NONE flags3 – MAP_LOCKED, MAP_PRIVATE, MAP_SHARED, MAP_ANONYMOUS flags4 – MS_ASYNC, MS_SYNC, MS_INVALIDATE 3 mmap 4 msync Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 9 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Mapovaná paměť – ukázka opening file if ((fd = open("./mapped_file", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) == -1) { perror("open failed"); } map the file into the memory mm_addr = (char *)mmap(NULL, length, PROT_WRITE, MAP_SHARED, fd, 0); if (mm_addr == MAP_FAILED) { perror("mmap failed"); } Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 10 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Mapovaná paměť – ukázka opening file if ((fd = open("./mapped_file", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) == -1) { perror("open failed"); } getting space in the file lseek(fd, length+1, SEEK_SET); write(fd, "", 1); lseek(fd, 0, SEEK_SET); map the file into the memory mm_addr = (char *)mmap(NULL, length, PROT_WRITE, MAP_SHARED, fd, 0); if (mm_addr == MAP_FAILED) { perror("mmap failed"); } Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 10 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr úkol reimplementujte předchozí úkol pomocí mapované paměti Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 11 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Přístupová práva k paměti Změna práv nastavených pomocí parametru prot funkce mmap int mprotect(const void *addr, size_t len, int prot); Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 12 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Uzamykání stránek ve fyzické paměti #include int mlock(const void *addr, size_t len); int munlock(const void *addr, size_t len); int mlockall(int flags); int munlockall(void); zabránění přesunu dat z RAM do SWAPu uzamykají se pouze celé stránky zamykat může pouze proces s právy superuživatele požadavek na rychlost požadavek na bezpečnost Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 13 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Vytváření dočasných souborů Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 14 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Vytváření dočasných souborů bezpečné vytváření dočasných souborů – řešení nebezpečí souběhu template je modifikován, takže nesmí jít o konstantní řetězec formát template je ’jmenoXXXXXX’ #include int mkstemp(char *template); int mkostemp (char *template, int flags); int mkstemps(char *template, int suffixlen); int mkostemps(char *template, int suffixlen, int flags); Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 15 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Závěr shrnutí, projekt a zdroje Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 16 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Projekt Pokračujte v dotažení implementace. Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 17 / 18 Sdílená a mapovaná paměť Dočasné soubory Závěr Zdroje beej.us/guide/bgipc/output/html/multipage/mmap.html www.cs.cf.ac.uk/Dave/C/node27.html Husák, Velan, Drašar 9 – Práce s pamětí 7. 12. 2015, Brno 18 / 18