X36OSY - Producenti a konzumenti - procesy
C++
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore
Makefile
Semestralni uloha X36OSY 2007.pdf
main.cpp
readme.html

readme.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Semestrální úloha X36OSY 2007</title>
</head>
<body>
  <center><h1>Semestrální úloha X36OSY 2007</h1></center>
	<center>Téma úlohy:  Producenti a konzumenti</center>
  <center>Vypracoval: Tomas Horacek <horact1@fel.cvut.cz></center>
  <br />
  <center>6. ročník, obor Výpočetní technika, K336 FEL ČVUT,<br />
  Karlovo nám. 13, 121 35 Praha 2 </center>
  
	<h2>Zadání úlohy</h2>
	<p>
		Mějme <i>m</i> producentů a <i>n</i> konzumentů. 
		Každý producent má svojí frontu o kapacitě <i>k</i> položek, 
		do které v náhodných intervalech zapisuje pokud je v ní volno, jinak se zablokuje a čeká.
		Položky ve frontách obsahují číslo producenta a pořadové číslo, ve kterém byly zapsány do fronty.
		Konzumenti v náhodných intervalech čtou položky z front. Každý konzument musí přečíst všechny
		položky od všech producentů, tzn. že položky se mohou odstranit z front až
		po přečtení všemi konzumenty.
	</p>
	
	
	<p><b>Vstup:</b> Producenti a konzumenti jsou reprezentováni vlákny/procesy a náhodně generují/čtou položky.</p>
	<p><b>Výstup:</b> Informace o tom, jak se mění obsah jednotlivých front a informace v jakém stavu se producenti a konzument nacházejí.</p>
	
  <h2>Analýza úlohy</h2>
  
  
  
  <h2>Řešení úlohy pomocí vláken</h2>
  
  <p>Reseni je za pomoci mutexu, pseoudokod popisujici algoritmus je zde:</p>
  
  <code><pre>
    def my_producent():
        for cislo_prvku in range(LIMIT_PRVKU):
            while je_fronta_plna():
                pockej_na_uvolneni_prvku()

            zamkni_frontu()
            pridej_prvek_do_fronty()
            odemkni_frontu()

            pockej_nahodnou_dobu()

        ukonci_vlakno()
  </pre></code>
  <code><pre>
    def konzument():
        while True:
            pockej_nahodnou_dobu()

            ukonci_cteni = True
            for producent in range(M_PRODUCENTU):
                zamkni_frontu()
                if not fornta_je_prazdna():
                    prvek = fronta[producent].front()

                    if prvek.poradove_cislo != poradova_cisla_poslednich_prectenych_prveku[producent]:
                        prvek.pocet_precteni++

                        if prvek.pocet_precteni == N_KONZUMENTU:
                            fronta[producent].pop()
                            delete prvek;
                            zavolej_uvolneni_prvku()

                        poradova_cisla_poslednich_prectenych_prveku[producent] = prvek.poradove_cislo
                odemkni_frontu()

                if ukonci_cteni:
                    ukonci_cteni = poradova_cisla_poslednich_prectenych_prveku[producent] == (LIMIT_PRVKU - 1)

            if ukonci_cteni:
                ukonci_vlakno()
  </pre></code>

  <h2>Řešení úlohy pomocí procesů</h2>
  
  
  
  <p>
    Řešení je implementována jako <em>N</em> + <em>M</em> + 1 procesů. Prvni proces vytvory producenty
    a konzumenty a ceka na jejich ukonceni. Fronty producentů (sdílená data) jsou uloženy v jednom segmentu
    sdílené paměti a jsou přístupné po volání <code>child_init()</code> přes ukazatel na pole
    <code>fronty</code>. Přístup ke frontám je řízen dvěma sadami semaforu (každá sada má velikost <em>M</em>),
    první sada urcuje, zda se da s frontou manipulovat, druhá, zda se dá do fronty přidávat.
    Sdílené prostredky alokoje a dealokuje první proces.
  </p>
  
  <p>
    Signály SIGQUIT, SIGINT, SIGHUP a SIGTERM jsou odchyceny a dealokace sdílených prostredků probíhá
    správně i při jejich vyvolání.
  </p>
  
  
  <h2>Závěr</h2> 
  
  Uloha mi pomohla prakticky vyzkouset tvoreni vlaken, jejich synchronizaci pomoci vlaken
  a take vytvareni procesu, sdilene pameti a obsluhu semaforu.

  <h2>Literatura</h2>
  
  <ol>
    <li>Slides ze cviceni</li>
    <li>Priklady ze cviceni</li>
    <li>manualove stranky</li>
    <li><a href="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_21.html" title="The GNU C Library - Signal Handling">The GNU C Library - Signal Handling</a></li>
    <li><a href="http://www.cplusplus.com/reference/stl/queue/queue.html" title="queue::queue - C++ Reference">queue::queue - C++ Reference</a></li>
  </ol>
  
</body>
</html>