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

Podobné dokumenty
OS Správa paměti. Tomáš Hudec.

Meziprocesová komunikace

B4B35OSY: Operační systémy

C++ a vnitřní svět. David Bednárek Jakub Yaghob Filip Zavoral

OS Správa paměti. Tomáš Hudec.

OS Konkurence procesů a IPC

IUJCE 07/08 Přednáška č. 6

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Více o konstruktorech a destruktorech

Mělká a hluboká kopie

Práce se soubory. Úvod do programování 2 Tomáš Kühr

POSIX X b. Přenositelné rozhraní pro Real-Time operační systémy

libpcap Tématicky zaměřený vývoj aplikací v jazyce C skupina Systémové programování Linux Martin Drašar, Martin Husák, Petr Velan

Management procesu I Mgr. Josef Horálek

Algoritmizace a programování

Ukazatele, dynamická alokace

Linux - Procesy (Processes)

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Práce se soubory. Základy programování 2 Tomáš Kühr

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Struktura programu v době běhu

Programování v C++ 1, 1. cvičení

Metody připojování periferií

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

PB153 OPERAČNÍ SYSTÉMY A JEJICH ROZHRANÍ

Práce s pamětí a předávání parametrů. Úvod do programování 1

Programování v C++ 1, 5. cvičení

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Metody připojování periferií

Činnost počítače po zapnutí

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Systém adresace paměti

PB161 Programování v jazyce C++ Přednáška 10

Algoritmizace a programování

Struktury a dynamická paměť

Základy programování (IZP)

B4B35OSY: Operační systémy

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy

Základy programování (IZP)

Programovanie v jazyku C - to chce dynamiku

11. Implementace ovladače ve Windows

09. Memory management. ZOS 2006, L.Pešička

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Souborové systémy Mgr. Josef Horálek

Přidělování paměti II Mgr. Josef Horálek

Programování v C++ 2, 4. cvičení

Architektura počítačů

Knihovny pro CUDA J. Sloup a I. Šimeček

B4B35OSY: Operační systémy

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

PB161 Programování v jazyce C++ Přednáška 10

Základy C++ I. Jan Hnilica Počítačové modelování 18

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Open Source Programování

PB071 Programování v jazyce C Jaro 2017

Oracle Call Interface (OCI)

Operační systémy. Přednáška 2: Procesy a vlákna

Studijní osnova pro předmět: Programování v operačních systémech. Ing. Petr Olivka, Ph.D.

Operační systémy 2: Zápočtové úkoly

PB161 Programování v jazyce C++ Přednáška 5

Pokročilé architektury počítačů

NSS - Cache 5. LECTURE MARTIN TOMASEK

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Základy programování (IZP)

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

PB071 Programování v jazyce C Jaro 2015

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Martin Flusser. December 15, 2016

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Implementace numerických metod v jazyce C a Python

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Operační systémy. Cvičení 4: Programování v C pod Unixem

Odvozené a strukturované typy dat

Programování v C++ 1, 6. cvičení

CUDA J. Sloup a I. Šimeček

UNIVERZITA OBRANY. Knihovna HLAGate. Programátorská dokumentace. Petr Františ

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

2. Vysvětlete princip utility make a napište příklad jednoduchého makefile pro překlad a slinkování programu v C.

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

NPRG051 Pokročilé programování v C /17 Úkol 2

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Práce s polem a pamětí

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Jazyk C++ I. Šablony 3

PB071 Programování v jazyce C Jaro 2013

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Jazyk C++ I. Šablony 2

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

PB071 Principy nízkoúrovňového programování

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

PB161 Programování v jazyce C++ Přednáška 5

Semestrální projekt. Předmět: Programování v jazyce C. Zadání: Operace s maticemi. Uživatelský manuál. ver. 1.0

Transkript:

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

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á 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á 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á paměť funkce #include <sys/shm.h> 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 shmflg 1 IPC_CREAT, IPC_EXCL, přístupová práva. shmflg 2 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á 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

ú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

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

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

Mapovaná paměť #include <sys/mman.h> 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 flags 3 MAP_LOCKED, MAP_PRIVATE, MAP_SHARED, MAP_ANONYMOUS flags 4 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

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

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

ú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

Přístupová práva k paměti Změna práv nastavených pomocí parametru prot funkce mmap <sys/mman.h> 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

Uzamykání stránek ve fyzické paměti #include <sys/mman.h> 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

Vytváření dočasných souborů Husák, Velan, Drašar 9 Práce s pamětí 7. 12. 2015, Brno 14 / 18

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 <stdlib.h> 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

Závěr shrnutí, projekt a zdroje Husák, Velan, Drašar 9 Práce s pamětí 7. 12. 2015, Brno 16 / 18

Projekt Pokračujte v dotažení implementace. Husák, Velan, Drašar 9 Práce s pamětí 7. 12. 2015, Brno 17 / 18

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