An open API service indexing awesome lists of open source software.

https://github.com/mariantaragel/h2o-builder

Multiple processes synchronization
https://github.com/mariantaragel/h2o-builder

c project synchronization

Last synced: 3 months ago
JSON representation

Multiple processes synchronization

Awesome Lists containing this project

README

        

# H2O builder
## Popis projektu
Molekuly vody jsou vytvářeny ze dvou atomů vodíku a jednoho atomu kyslíku. V systému jsou tři typy procesů: (0) hlavní proces, (1) kyslík a (2) vodík. Po vytvoření procesů se procesy reprezentující kyslíky a vodíky řadí do dvou front—jedna pro kyslíky a druhá pro vodíky. Ze začátku fronty vždy vystoupí jeden kyslík a dva vodíky a vytvoří molekulu. V jednu chvíli je možné vytvářet pouze jednu molekulu. Po jejím vytvoření je prostor uvolněn dalším atomům pro vytvoření další molekuly. Procesy, které vytvořily molekulu následně končí. Ve chvíli, kdy již není k dispozici dostatek atomů kyslíku nebo vodíku pro další molekulu (a ani žádné další již nebudou hlavním procesem vytvořeny) jsou všechny zbývající atomy kyslíku a vodíku uvolněny z front a procesy jsou ukončeny.

## Detailní specifikace
### Spuštění
```sh
$ ./proj2 NO NH TI TB
```


  • NO: Počet kyslíků

  • NH: Počet vodíků

  • TI: Maximální čas milisekundách, po který atom kyslíku/vodíku po svém vytvoření čeká, než se zařadí do fronty na vytváření molekul. 0<=TI<=1000

  • TB: Maximální čas v milisekundách nutný pro vytvoření jedné molekuly. 0<=TB<=1000

### Chybové stavy
Pokud některý ze vstupů nebude odpovídat očekávanému formátu nebo bude mimo povolený rozsah, program vytiskne chybové hlášení na standardní chybový výstup, uvolní všechny dosud alokované zdroje a ukončí se s kódem (exit code) 1. Pokud selže některá z operací se semafory, nebo sdílenou pamětí, tak program postupujte stejně.

### Implementační detaily


  • Každý proces vykonává své akce a současně zapisuje informace o akcích do souboru s názvem proj2.out. Součástí výstupních informací o akci je pořadové číslo A prováděné akce (viz popis výstupů). Akce se číslují od jedničky.

  • Použijte sdílenou paměť pro implementaci čítače akcí a sdílených proměnných nutných pro synchronizaci.

  • Použijte semafory pro synchronizaci procesů.

  • Nepoužívejte aktivní čekání (včetně cyklického časového uspání procesu) pro účely synchronizace.

  • Pracujte s procesy, ne s vlákny.

### Hlavní proces


  • Hlavní proces vytváří ihned po spuštění NO procesů kyslíku a NH procesů vodíku.

  • Poté čeká na ukončení všech procesů, které aplikace vytváří. Jakmile jsou tyto procesy ukončeny, ukončí se i hlavní proces s kódem (exit code) 0.

### Proces Kyslík


  • Každý kyslík je jednoznačně identifikován číslem idO, 0
  • Po spuštění vypíše: A: O idO: started

  • Následně čeká pomocí volání usleep náhodný čas v intervalu <0,TI>

  • Vypíše: A: O idO: going to queue a zařadí se do fronty kyslíků na vytváření molekul.

  • Ve chvíli, kdy není vytvářena žádná molekula, jsou z čela front uvolněny kyslík a dva vodíky. Příslušný proces po uvolnění vypíše: A: O idO: creating molecule noM (noM je číslo molekuly, ty jsou číslovány postupně od 1).

  • Pomocí usleep na náhodný čas v intervalu <0,TB> simuluje dobu vytváření molekuly.

  • Po uplynutí času vytváření molekuly informuje vodíky ze stejné molekuly, že je molekula dokončena.

  • Vypíše: A: O idO: molecule noM created a proces končí.

  • Pokud již není k dispozici dostatek vodíků (ani nebudou žádné další vytvořeny/zařazeny do fronty) vypisuje: A: O idO: not enough H a proces končí.


### Proces Vodík


  • Každý vodík je jednoznačně identifikován číslem idH, 0
  • Po spuštění vypíše: A: H idH: started

  • Následně čeká pomocí volání usleep náhodný čas v intervalu <0,TI>

  • Vypíše: A: H idH: going to queue a zařadí se do fronty vodíků na vytváření molekul.

  • Ve chvíli, kdy není vytvářena žádná molekula, jsou z čela front uvolněny kyslík a dva vodíky. Příslušný proces po uvolnění vypíše: A: H idH: creating molecule noM (noM je číslo molekuly, ty jsou číslovány postupně od 1).

  • Následně čeká na zprávu od kyslíku, že je tvorba molekuly dokončena.

  • Vypíše: A: H idH: molecule noM created a proces končí.

  • Pokud již není k dispozici dostatek kyslíků nebo vodíků (ani nebudou žádné další vytvořeny/zařazeny do fronty) vypisuje: A: H idH: not enough O or H a process končí.


## Příklady použití
Příklad výstupního souboru proj2.out pro následující příkaz:
```sh
$ ./proj2 3 5 100 100
```



1: H 1: started

2: H 3: started

3: O 1: started

4: O 1: going to queue

5: H 2: started

6: H 2: going to queue

7: H 1: going to queue

8: O 3: started

9: O 3: going to queue

10: H 5: started

11: H 4: started

12: O 2: started

13: H 1: creating molecule 1

14: H 4: going to queue

15: O 1: creating molecule 1

16: H 2: creating molecule 1

17: H 5: going to queue

18: H 2: molecule 1 created

19: H 1: molecule 1 created

20: O 1: molecule 1 created

21: H 3: going to queue

22: O 3: creating molecule 2

23: O 2: going to queue

24: H 4: creating molecule 2

25: H 5: creating molecule 2

26: O 3: molecule 2 created

27: H 4: molecule 2 created

28: H 5: molecule 2 created

29: H 3: not enough O or H

30: O 2: not enough H