Operační systémy 2: Zápočtové úkoly 18. listopad 2010 1 Paralelní Mergesort Implementujte paralelní verzi algoritmu Merge sort, který bude řadit celá čísla uložená v textovém souboru. Program bude mít tři argumenty (v tomto pořadí): vstupní soubor, výstupní soubor a počet vláken použitých k výpočtu. Vstupní i výstupní soubor jsou běžné textové soubory, kde na každém řádku je jedno číslo. Při implementaci použijte vlákna a omezte použití synchronizačních primitiv na nutné minimum. K načtení a uložení dat z/do souboru použijte mapovaní souboru do paměti. Ověřte na víceprocesorovém/vícejádrovém počítači, že algoritmus škáluje při použití více vláken běží rychleji. Příklad použití./pmergesort input-1.txt output-1.txt 5 Hodnocení Za tuto úlohu je možné získat 9 bodů. 2 Map-Reduce Framework 2.1 Úvod do problematiky Při zpracování opravdu rozsáhlých dat (tj. dat se kterými běžně pracuje Google, Yahoo! či Facebook) se používá reprezentace hodnot v podobě dvojice klíč-hodnota (dále jen k, v ) a data jsou zpracovávána ve dvou fázích map a reduce odtud název Map- Reduce Framework. 1 V prvním kroce jsou vstupní data rozdělena na menší bloky a případně převedena do tvaru k, v. V následujícím kroce se provede operace map a na jednotlivá načtená 1 http://labs.google.com/papers/mapreduce.html 1
data se aplikuje funkce f, která pro každou dvojici k, v vrací multimnožinu dvojic k, v, i.e., f ( k, v ) = { k 1, v 1,..., k n, v n } V dalším kroce se provede operace reduce a všechny hodnoty (dvojice k, v ) jsou roztříděny podle svého klče k a na dvojice mající stejný klíč k je aplikována agregační funkce g vracející hodnotu ve tvaru k, v, i.e,. g({ k, v 1, k, v 2,..., k, v n }) = k, v Příklad Uvažujme, že chceme spočítat četnost znaků ve slovech alice, barbara, carol. Nejdříve text rozdělíme na jednotlivá slova a na ně pak aplikujeme funkci f, která pro každý znak ve slově vrací dvojici ve tvaru znak, 1. Tedy: f (alice) = { a, 1, l, 1, i, 1, c, 1, e, 1 }, f (barbara) = { b, 1, a, 1, r, 1, b, 1, a, 1, r, 1, a, 1 }, f (carol) = { c, 1, a, 1, r, 1, o, 1, l, 1 }. V následujícím kroce aplikujeme na páry se stejným klíčem funkci pro redukci, která sečte jednotlivé hodnoty v. Tedy: g({ a, 1, a, 1, a, 1, a, 1, a, 1 }) = a, 5, g({ b, 1, b, 1 }) = b, 2, g({ c, 1, c, 1 }) = c, 2, g({ e, 1 }) = e, 1, g({ l, 1, l, 1 }) = l, 2, g({ i, 1 }) = i, 1, g({ o, 1 }) = o, 1, g({ r, 1, r, 1, r, 1 }) = r, 3. Z povahy algoritmu a předpokladu, že funkce f a g nemají vedlejší efekt, lze vidět, že výpočet lze snadno paralelizovat a distribuovat. V praxi pak pro výpočet stačí dodat frameworku funkce f a g a ten se o výpočet postará sám. V praxi se pak taky ukázalo, že je dobré rozdělit fázi reduce na dva kroky. V prvním kroce se provede operace combine, která nedělá nic jiného než, že aplikuje agregační funkci na dvojice vytvořené jednou aplikací funkce map. Na hodnoty vzešlé z operace combine je následně použita funkce reduce. 2.2 Zadání úkolu S využitím procesů a rour implementujte model Map-reduce frameworku. Program bude mít tři parametry: program reprezentující funkci map, program reprezentující funkci reduce a počet instancí procesu map, které se mají vytvořit. 2
Reduce Příklad použití cat foo map-reduce./map.py./reduce.py 5 Program vytvoří daný počet procesů map a ke každému procesu map vytvoří proces reduce. Program pak bude číst textový soubor řádek po řádku ze standardního vstupu a předávat jednotlivé řádky střídavě jednotlivým procesům map. Ten data zpracuje a předá je svému procesu reduce. Následně budou data uložena do souborů. Potom, co jsou všechny vstupní data zpracována, jsou data v souborech předána programu reduce a výsledek zapsán na standardní výstup procesu. Soubory na disku jsou následně odstraněny. Tok dat (nikoliv závislost procesů) zobrazuje následující schéma. Map #1 Reduce #1 (combine) File #1 stdin map reduce Map/Reduce Framework Map #2 Reduce #2 (combine) File #2 stdout Map #3 Reduce #n (combine) File #n Programy map a reduce mohou být libovolné programy, které načítají data ze standardního vstupu a vypisují výsledek na standardní výstup. Při testování můžete využít přiložené programy, které demonstrují počítání slov. Jejich funkci si můžete ověřit následovně: cat foo.txt./map./reduce Hodnocení Za tuto úlohu je možné získat 11 bodů. 3 Paralelní REPL S použitím vláken implementujte program, který bude simulovat známou smyčku read-eval-print, kde fáze eval a print budou trvat nezanedbatelnou dobu. Program bude mít tři vlákna: první vlákno bude ze standardního vstupu načítat řetezce; poté, co se načte jeden řetězec, je předán druhému vláknu přes sdílenou globální proměnnou druhé vlákno načte hodnotu ze sdílene proměnné, převede text na velká písmena, počká jednu sekundu a předá výsledek přes další globální proměnnou třetímu vláknu 3
třetí vlákno načte hodnotu vypočítanou ve druhém vláknu; počká dvě sekundy a výpíše ji na standardní výstup Program bude ukončen potom, co bude ukončen vstup. Všechna předaná data musí být zpracována a žádná hodnota nesmí být zahozena. Pokud vlákno předává hodnotu druhému, které dosud nezpracovalo svůj vstup, bude zablokováno pomocí condition variable (Linux) nebo SuspendThread (Windows). Místa, kde bude docházet k čekání, umístěte tak, aby program běžel, co nejefektivněji, tzn. pokud probíhá výstup může současně probíhat i výpočet. Při přístupu ke sdíleným proměnným si dejte pozor, aby k nim nepřistupovala dvě vlákna současně nežádoucím způsobem. Hodnocení Za tuto úlohu je možné získat 9 bodů. 4 Společná sprcha Typickou vlastností levného ubytování je sdílené sociální zařízení. V tomto příkladě máte za úkol pomocí procesů a sdílené paměti namodelovat chování osob v koupelně, kde jsou společné sprchy. Předpokládejme, že: koupelna má konečné množství sprch v každé sprše může být jeden muž, nebo jedna žena pokud je v některé sprše muž, nemůže do koupelny vstoupit žena (a opačně) pokud jsou všechny sprchy obsazeny nebo nelze do koupelny vstoupit z předchozího důvodu (je dotyčná osoba nucena počkat před vstupem) Společné sprchy reprezentujte pomocí bloku sdílené paměti a jednotlivé osoby jako samostatné procesy, které budou synchronizovány pomocí semaforů pro procesy. 2 Vytvořte program shower, který bude mít následující parametry: shower --create n vytvoří koupelnu mající n sprch; pokud se ji nepodaří vytvořit, vypíše chybovou hlášku shower --destroy zruší koupelnu, i.e., odstraní všechny zdroje v paměti související s programem shower --man n simuluje muže jdoucího do sprchy; parametr n udává, jak dlouho mu bude sprchování trvat (v sekundách) 2 Pokud budete tuto úlohu implementovat ve Windows, použijte pro sdílenou pamět mapovaný soubor a místo procesů vlákna a uživatelské rozhraní simulujte pomocí standardního vstupu. 4
shower --woman n simuluje ženu jdoucí do sprchy; parametr n udává, jak dlouho jí bude sprchování trvat (v sekundách) shower --status zobrazí informace o koupelně, tj. počet sprch, kdo může vstoupit do sprchy a obsazení jednotlivých sprch Každý proces bude vypisovat informaci o svém stavu následovně: po vytvoření proces oznamí, že jde do sprchy když se mu podaří získat místo ve sprše, oznámí, že vstoupil do sprchy potom, co dokončil sprchávání, oznamí, že vyšel ze sprchy Příklad použití shower --create 2 shower --man 10 & shower --man 12 & shower --woman 10 & shower --man 10 & Výstup může vypadat následovně: Proces #10533 (muz) jde do sprchy. Proces #10533 (muz) vstoupil do sprchy. Proces #10536 (muz) jde do sprchy. Proces #10536 (muz) vstoupil do sprchy. Proces #10535 (zena) jde do sprchy. Proces #10534 (muz) jde do sprchy. Proces #10533 (muz) vysel ze sprchy. Proces #10534 (muz) vstoupil do sprchy. Proces #10536 (muz) vysel ze sprchy. Proces #10534 (muz) vysel ze sprchy. Proces #10535 (zena) vstoupil do sprchy. Proces #10535 (zena) vysel ze sprchy. Příklad výstupu pro: shower --status Pocet sprch: 3 Do sprchy muze vstoupit: zena Sprcha #1: proces 10482 Sprcha #2: prazdna Sprcha #3: prazdna Hodnocení Za tuto úlohu je možné získat 9 bodů. 5
Poznámky k implementaci a odevzdávání všechny úlohy je možné implementovat na platformně Linux (preferovaná volba) i Windows, ale je přípustné odevzdat řešení jen pro jednu z nich, tj. nelze například odevzdat 1. úlohu ve verzi pro Linux i Windows úlohy je možné odevzdat do konce zápočtového týdne (tzn. do 17. prosince 23:59 CET) a na později odevzdané úlohy nebude brán zřetel; úlohy odevzdané před zápočtovým týdnem bude v případě potřeby možné odevzdat opakovaně jednotlivé řešení zásílejte jako samostatné soubory ve tvaru login-číslo příkladu.c na email krajcap (at) inf.upol.cz jednotlivé programy by měly být vhodně okomentovány tak, aby bylo možné pochopit činnost programu; dbejte na dobrý programátorský styl a konvence (včetně těch o formátování kódu) 6