Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
X36OSY - Producenti a konzumenti - procesy
C++
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

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>
Something went wrong with that request. Please try again.