Cvičení č. 3 Sdílené prostředky a synchronizace Program Banka 4 body Datum: 12.3.2008 1
Obsah 1. Úvod...2 2. Pokyny pro odevzdání...2 3. Příprava...2 4. Úlohy...3 4.1. Požadavky na program...3 4.2. Požadavky na implementaci...3 4.3. Komunikace s Grafickým uživatelským rozhraním...4 4.4. Doporučení pro implementaci...4 1. Úvod V tomto cvičení si vysvětlíme, co je to sdílený prostředek a synchronizace. Vytvoříme ukázkové programy s využitím systému RTMON demonstrující synchronizaci přístupu ke sdíleným prostředkům. Cílem cvičení je získat představu o problematice přístupu ke sdíleným prostředkům (např. proměnným) v prostředí víceúlohového operačního systému a na ukázkových programech získat praktické zkušenosti s řešením této problematiky. V rámci cvičení bude vytvořen ukázkový program vypisující na obrazovku střídavě dva různé texty. Text bude uložen v proměnné sdílené mezi dvěma procesy; jeden proces bude do proměnné zapisovat a druhý z ní číst. Bez synchronizace bude docházet ke konfliktům při přístupu a zobrazené texty budou nesprávné. 2. Pokyny pro odevzdání Výstupem cvičení bude protokol krátká zpráva o řešení úloh na cvičení. Šablonu protokolu si stáhněte z Moodle. Protokol by měl obsahovat odpovědi na otázky, zdrojový kód Vašich řešení podle zadání, případně stručný popis úprav v ukázkovém kódu podle bodu 4 v tomto dokumentu. Dále bude výstupem cvičení upravený soubor banka.cpp, viz zadání níže. Zdrojový kód musí být přehledně formátovaný a komentovaný. Oba soubory (protokol i zdrojový kód) pojmenujte svým jménem ve formátu Prijmeni_Jmeno, a zabalte to archivu ZIP. Soubor ZIP také pojmenujte svým jménem podle výše uvedeného vzoru a odevzdejte na Moodle. 3. Příprava Prostudujte si prezentaci na Moodle Sdílené prostředky a synchronizace a Základní informace o synchronizaci (Synchronizace.pdf). 2
4. Úlohy o Stáhněte si z Moodle soubor synchron1.cpp. o Soubor obsahuje program, který periodicky vypisuje na obrazovku textové zprávy. Proces, který vypisuje zprávy načítá údaj, který má vypsat ze sdílené proměnné. Do této proměnné druhý proces zapisuje střídavě text 1111.111 a 9999.999. Na obrazovce by se tedy měly objevovat pouze texty obsahující samé jedničky nebo samé devítky. o Prostudujte zdrojový kód programu a ujistěte se, že se chová tak, jak je popsáno. o Přeložte a spusťte program. o Dochází při běhu programu k nějakým chybám ve výpisech? K jakým a proč? o Stáhněte si soubor synchron2.cpp. o Tento soubor obsahuje stejný program jako synchron1.cpp, ale doplněný o synchronizaci přístupu ke sdílené proměnné. o Vyzkoušejte tento program a ověřte, že tentokrát se chyby ve výpisech neobjevují. o Stáhněte si ukázkový soubor Banka.cpp a opravte tento program podle zadání uvedeného v hlavičce souboru. Do protokolu uveďte jaké úpravy jste provedli a proč. K protokolu přiložte i upravený soubor banka.cpp. o Navrhněte a implementujte rozšíření systému RTMON o synchronizační objekty (mutexy). Do protokolu uveďte kód, který toto rozšíření zajistí. Podrobnosti viz. dále v části Požadavky na implementaci. o Upravte program Banka tak, aby používal vámi implementované funkce pro práci s mutexy. Tyto úpravy už pouze zkopírujte do protokolu, nemusíte odevzdávat i upravenou verzi zdrojového souboru. Shrnutí úkolů: 1. Vysvětlete, proč dochází k chybným výpisům u programu synchron1.cpp. 2. Upravte program v souboru Banka.cpp. Přiložte k protokolu jeho zdrojový kód (banka.cpp). 3. Vytvořte funkce pro práci s mutexem s využitím schránek RTMON. 4. Upravte program Banka tak, aby využíval tyto funkce. Do protokolu uveďte pouze kód, který jste změnili. 4.1. Požadavky na program Viz komentář v hlavičce souboru banka.cpp. 4.2. Požadavky na implementaci V programu banka proveďte pouze úpravu pro zajištění synchronizace při přístupu k bankovnímu účtu pomocí schránek OS RTMON. 3
Implementace funkcí pro práci s mutexem v RTMON: Implementace bude využívat schránek RTMON. Jedná se tedy pouze o jakýsi obal (wrapper) kolem použití schránek pro synchronizaci ukázaného výše. Implementujte tři funkce: rtm_createmutex rtm_waitformutex rtm_freemutex. Funkce rtm_createmutex bude sloužit k vytvoření mutexu (schránky). Funkce rtm_waitformutex bude sloužit k získání vlastnictví mutexu. Proces, který ji zavolá musí být uspán dokud nebude mutex k dispozici (použijte rtm_read_q_w). Funkce rtm_freemutex bude sloužit k uvolnění mutexu (tedy vlastně zapsání zprávy zpět do schránky). Pro mutex můžete zavést vlastní datový typ (odkazující zřejmě na identifikátor schránky), nebo mohou funkce pracovat přímo s identifikátorem schránky IDQUEUE*. V tom případě by prototypy funkcí mohli vypadat např. takto: IDQUEUE* rtm_createmutex(); void rtm_waitformutex(idqueue* m); void rtm_freemutex(idqueue* m); Funkce pro práci s mutexem by bylo vhodné implementovat ve zvláštním modulu (souboru) i s vlastním hlavičkovým souborem, tj. např. mutex.cpp a mutex.h. Budeme je totiž využívat i v dalších programech. 4.3. Komunikace s Grafickým uživatelským rozhraním Programy v tomto cvičení nevyužívají GUI. 4.4. Doporučení pro implementaci V programu Banka stačí upravit funkci BankaOperace() tak, aby byla operace měnící stav účtu prováděna jako atomická. V systému RTMON je k synchronizaci možno využít schránek. Na zprávu ve schránce můžeme pohlížet jako na objekt chránící sdílenou proměnnou. Před tím, než začne pracovat se sdílenou proměnnou, musí proces získat zprávu ze schránky. Po skončení práce se sdílenou proměnnou musí proces zprávu zapsat zpět do schránky, tak aby ke sdílené proměnné mohl získat přístup další proces. Proces vyžadující přístup ke sdíleným datum tedy bude postupovat takto: Pro získání výhradního přístupu k datum volá: rtm_read_q_w( schranka, &data); Pracuje se sdílenými daty Pro uvolnění přístupu, po skončení práce se sdílenými daty volá: rtm_write_q(schranka, &data); 4
Jak víme, jestliže proces zavolá rtm_read_q_w() a schránka neobsahuje zprávu, bude pozastaven až do doby, kdy se ve schránce zpráva objeví. To je ekvivalentní čekání na vlastnictví synchronizačního objektu (mutexu, semaforu). Pokud naopak schránka zprávu obsahuje, je zpráva přečtena, schránka vyprázdněna, a proces pokračuje ihned dál ve své činnosti. Protože je ale nyní schránka prázdná, každý další proces, který se pokusí (korektně) pracovat se sdílenými daty a zavolá funkci rtm_read_q_w bude pozastaven až do doby, než proces, který zprávu přečetl, ji zase zapíše zpět do schránky. Zavoláním funkce rtm_write_q() se do schránky zapíše zpráva, což zde indikuje že s daty nikdo nepracuje, odpovídá to uvolnění mutexu tak, aby si jej mohl přivlastnit někdo jiný. 5. Odkazy Moodle podpora předmětu na http://vyuka.fai.utb.cz. Magisterské Studium, Programování realtime aplikací. Klíč k zápisu je PR2008. 5