{"id":22606328,"url":"https://github.com/mariantaragel/h2o-builder","last_synced_at":"2025-03-28T21:46:45.531Z","repository":{"id":88087978,"uuid":"482338923","full_name":"mariantaragel/H2O-builder","owner":"mariantaragel","description":"Multiple processes synchronization","archived":false,"fork":false,"pushed_at":"2022-04-27T11:56:37.000Z","size":25,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-03T08:36:42.357Z","etag":null,"topics":["c","project","synchronization"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mariantaragel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-16T19:06:08.000Z","updated_at":"2022-07-11T20:27:54.000Z","dependencies_parsed_at":"2023-06-26T00:10:47.550Z","dependency_job_id":null,"html_url":"https://github.com/mariantaragel/H2O-builder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariantaragel%2FH2O-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariantaragel%2FH2O-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariantaragel%2FH2O-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariantaragel%2FH2O-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mariantaragel","download_url":"https://codeload.github.com/mariantaragel/H2O-builder/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246106661,"owners_count":20724400,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","project","synchronization"],"created_at":"2024-12-08T14:13:12.941Z","updated_at":"2025-03-28T21:46:45.512Z","avatar_url":"https://github.com/mariantaragel.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# H2O builder\n## Popis projektu\nMolekuly 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.\n\n## Detailní specifikace\n### Spuštění\n```sh\n$ ./proj2 NO NH TI TB\n```\n\u003cul\u003e\n  \u003cli\u003eNO: Počet kyslíků\u003c/li\u003e\n  \u003cli\u003eNH: Počet vodíků\u003c/li\u003e\n  \u003cli\u003eTI: 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\u003c=TI\u003c=1000\u003c/li\u003e\n  \u003cli\u003eTB: Maximální čas v milisekundách nutný pro vytvoření jedné molekuly. 0\u003c=TB\u003c=1000\u003c/li\u003e\n\u003c/ul\u003e\n\n### Chybové stavy\nPokud 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ě.\n\n### Implementační detaily\n\u003cul\u003e\n  \u003cli\u003eKaž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.\u003c/li\u003e\n  \u003cli\u003ePoužijte sdílenou paměť pro implementaci čítače akcí a sdílených proměnných nutných pro synchronizaci.\u003c/li\u003e\n  \u003cli\u003ePoužijte semafory pro synchronizaci procesů.\u003c/li\u003e\n  \u003cli\u003eNepoužívejte aktivní čekání (včetně cyklického časového uspání procesu) pro účely synchronizace.\u003c/li\u003e\n  \u003cli\u003ePracujte s procesy, ne s vlákny.\u003c/li\u003e\n\u003c/ul\u003e\n\n### Hlavní proces\n\u003cul\u003e\n  \u003cli\u003eHlavní proces vytváří ihned po spuštění NO procesů kyslíku a NH procesů vodíku.\u003c/li\u003e\n  \u003cli\u003ePoté č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.\u003c/li\u003e\n\u003c/ul\u003e\n\n### Proces Kyslík\n\u003cul\u003e\n  \u003cli\u003eKaždý kyslík je jednoznačně identifikován číslem idO, 0\u003cidO\u003c=NO\u003c/li\u003e\n  \u003cli\u003ePo spuštění vypíše: \u003cem\u003eA: O idO: started\u003c/em\u003e\u003c/li\u003e\n  \u003cli\u003eNásledně čeká pomocí volání usleep náhodný čas v intervalu \u003c0,TI\u003e\u003c/li\u003e\n  \u003cli\u003eVypíše: \u003cem\u003eA: O idO: going to queue\u003c/em\u003e a zařadí se do fronty kyslíků na vytváření molekul.\u003c/li\u003e\n  \u003cli\u003eVe 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: \u003cem\u003eA: O idO: creating molecule noM\u003c/em\u003e (noM je číslo molekuly, ty jsou číslovány postupně od 1).\u003c/li\u003e\n  \u003cli\u003ePomocí usleep na náhodný čas v intervalu \u003c0,TB\u003e simuluje dobu vytváření molekuly.\u003c/li\u003e\n  \u003cli\u003ePo uplynutí času vytváření molekuly informuje vodíky ze stejné molekuly, že je molekula dokončena.\u003c/li\u003e\n  \u003cli\u003eVypíše: \u003cem\u003eA: O idO: molecule noM created\u003c/em\u003e a proces končí.\u003c/li\u003e\n  \u003cli\u003ePokud již není k dispozici dostatek vodíků (ani nebudou žádné další vytvořeny/zařazeny do fronty) vypisuje: \u003cem\u003eA: O idO: not enough H\u003c/em\u003e a proces končí.\u003c/li\u003e\n\u003c/ul\u003e\n\n### Proces Vodík\n\u003cul\u003e\n  \u003cli\u003eKaždý vodík je jednoznačně identifikován číslem idH, 0\u003cidH\u003c=NH\u003c/li\u003e\n  \u003cli\u003ePo spuštění vypíše: \u003cem\u003eA: H idH: started\u003c/em\u003e\u003c/li\u003e\n  \u003cli\u003eNásledně čeká pomocí volání usleep náhodný čas v intervalu \u003c0,TI\u003e\u003c/li\u003e\n  \u003cli\u003eVypíše: \u003cem\u003eA: H idH: going to queue\u003c/em\u003e a zařadí se do fronty vodíků na vytváření molekul.\u003c/li\u003e\n  \u003cli\u003eVe 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: \u003cem\u003eA: H idH: creating molecule noM\u003c/em\u003e (noM je číslo molekuly, ty jsou číslovány postupně od 1).\u003c/li\u003e\n  \u003cli\u003eNásledně čeká na zprávu od kyslíku, že je tvorba molekuly dokončena.\u003c/li\u003e\n  \u003cli\u003eVypíše: \u003cem\u003eA: H idH: molecule noM created\u003c/em\u003e a proces končí.\u003c/li\u003e\n  \u003cli\u003ePokud již není k dispozici dostatek kyslíků nebo vodíků (ani nebudou žádné další vytvořeny/zařazeny do fronty) vypisuje: \u003cem\u003eA: H idH: not enough O or H\u003c/em\u003e a process končí.\u003c/li\u003e\n\u003c/ul\u003e\n\n## Příklady použití\nPříklad výstupního souboru proj2.out pro následující příkaz:\n```sh\n$ ./proj2 3 5 100 100\n```\n\u003chr\u003e\u003cem\u003e\n1: H 1: started\u003cbr\u003e\n2: H 3: started\u003cbr\u003e\n3: O 1: started\u003cbr\u003e\n4: O 1: going to queue\u003cbr\u003e\n5: H 2: started\u003cbr\u003e\n6: H 2: going to queue\u003cbr\u003e\n7: H 1: going to queue\u003cbr\u003e\n8: O 3: started\u003cbr\u003e\n9: O 3: going to queue\u003cbr\u003e\n10: H 5: started\u003cbr\u003e\n11: H 4: started\u003cbr\u003e\n12: O 2: started\u003cbr\u003e\n13: H 1: creating molecule 1\u003cbr\u003e\n14: H 4: going to queue\u003cbr\u003e\n15: O 1: creating molecule 1\u003cbr\u003e\n16: H 2: creating molecule 1\u003cbr\u003e\n17: H 5: going to queue\u003cbr\u003e\n18: H 2: molecule 1 created\u003cbr\u003e\n19: H 1: molecule 1 created\u003cbr\u003e\n20: O 1: molecule 1 created\u003cbr\u003e\n21: H 3: going to queue\u003cbr\u003e\n22: O 3: creating molecule 2\u003cbr\u003e\n23: O 2: going to queue\u003cbr\u003e\n24: H 4: creating molecule 2\u003cbr\u003e\n25: H 5: creating molecule 2\u003cbr\u003e\n26: O 3: molecule 2 created\u003cbr\u003e\n27: H 4: molecule 2 created\u003cbr\u003e\n28: H 5: molecule 2 created\u003cbr\u003e\n29: H 3: not enough O or H\u003cbr\u003e\n30: O 2: not enough H\u003c/em\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariantaragel%2Fh2o-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmariantaragel%2Fh2o-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariantaragel%2Fh2o-builder/lists"}