Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.02 KB | None | 0 0
  1. Vaším úkolem je implementovat montážní linku automobilů, která je organizovaná jako pásová výroba (jako u Henryho Forda).
  2.  
  3. Předpokládáme, že výrobní proces probíhá v N krocích. Kroky na sebe musejí navazovat, nelze je proházet. Pro těchto N výrobních kroků je zaměstnáno N zaměstnanců (vláken). Každé vlákno má tedy na starosti pouze jeden svůj úkol. Každý pracovník (vlákno) pracuje právě na jednom automobilu. Pokud je se svým úkolem hotovo, předává automobil následujícímu vláknu (pokud následující vlákno stále pracuje, musí počkat) a až teprve potom si může převzít další práci (další automobil) od svého předchůdce. Ve výrobní hale nejsou žádná místa navíc pro odložení rozpracovaných automobilů.
  4.  
  5. Dále máme dva speciální pracovníky - zásobovač (generátor) vyzvedává prefabrikáty ze skladu a předává je první sekci montážní linky. Druhým výsadním vláknem je pracovník expedice, který odebírá automobily za poslední sekcí montážní linky. Tyto dva pracovníci jsou rovněž implementováni vlákny a platí pro ně stejné podmínky předávání automobilů jako pro ostatní pracovníky. Pokud tedy má montážní linka 10 sekcí, může být najednou rozpracováno nejvýše 12 automobilů (10 pracovníky na lince + 1 zásobovač + 1 expedice).
  6.  
  7. V naší simulaci je montážní linka realizovaná rozhraním:
  8. #ifndef __PROGTEST__
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <math.h>
  13. #include <pthread.h>
  14. #include <semaphore.h>
  15. #include <unistd.h>
  16.  
  17. typedef struct TCar
  18. {
  19. int m_Serial;
  20. char m_ProductData[1024];
  21. } TCAR;
  22.  
  23. #endif /* __PROGTEST__ */
  24.  
  25. void AssemblyLine ( int stagesNr,
  26. void (* registerGen) ( void ),
  27. void (* registerStage) ( int ),
  28. void (* registerDis) ( void ),
  29. void (* unregister) ( void ),
  30. TCAR *(* generator) ( void ),
  31. int (** stages) ( TCAR * ),
  32. void (* dispatch) ( TCAR * ),
  33. void (* spoiled) ( TCAR * ) );
  34.  
  35. TCAR
  36. je struktura popisující automobil. Obsahuje složku m_Serial udávající sériové číslo vozu a m_ProductData, která popisují vlastní automobil. Vaše implementace nemusí s těmito daty přímo pracovat, nepotřebuje tedy znát jejich význam. Data ale nesmíte poškodit (přepsat).
  37. AssemblyLine
  38. je funkce, která implementuje vlastní logiku výrobní linky. Tato funkce vytvoří potřebná vlákna, datové struktury pro jejich řízení a synchronizaci, spustí vlastní simulaci a čeká na její dokončení. Funkce má následující parametry:
  39. stagesNr
  40. udává počet kroků (sekcí) výrobní linky. Pro každou sekci musíte vytvořit vlákno, další vlákno pak pro zásobování a expedici (cekem tedy stagesNr + 2 vláken).
  41. registerGen
  42. registrace vlákna zásobovače (generátoru). Tuto funkci musí vlákno zásobovače zavolat před zahájením práce.
  43. registerStage
  44. registrace pracovníka montážní linky. Každé vlákno pracovníka tuto funkci musí zavolat před zahájením své práce. Parametrem volání je číslo sekce, kde pracovník pracuje (od 0 do stagesNr - 1).
  45. registerDis
  46. registrace vlákna expedice hotových automobilů. Vlákno se musí registrovat před zahájením své práce.
  47. unregister
  48. je povinné volání, které musí všechna registovaná vlákna zavolat na konci své práce (pracovníci, zásobovač i expedice).
  49. generator
  50. je volání, které ze skladu vyzvedne další prefabrikát automobilu. Tuto funkci volá v cyklu vlákno generátoru. Testovací prostředí v implementaci funkce generátoru alokuje paměť a vyplní jeho parametery, funkce vrátí ukazatel na takto připravenou datovou strukturu. Vlákno generátoru je pak zodpovědné za předání nového automobilu (prefabrikátu) do první sekce montážní linky (případně počká, pokud pracovník není volný). Pokud funkce generátoru vrátí hodnotu NULL, je sklad prázdný a simulace končí (samozřejmě se musí dokončit rozpracované automobily).
  51. stages
  52. je pole ukazatelů na funkce. Toto pole a odkazy na funkce v něm uvedené jsou realizované v testovacím prostředí. Vaše implementace bude volat funkci stages[i] z tohoto pole jako vlastní výrobní proces v kroku i. Funkci je třeba předat parametrem automobil, na kterém má být příslušný výrobní krok proveden. Funkce vrátí, zda se výrobní krok povedl nebo ne. Hodnota 1 znamená, že výrobní krok uspěl (výroba automobilu může pokračovat dalším výrobním krokem), hodnota 0 znamená chybu, kdy je automobil potřeba odstranit z výroby a sešrotovat (viz funkce spoiled níže).
  53. dispatch
  54. je funkce, kterou bude volat vlákno expedice s hotovými automobily, které získá z poslední sekce montážní linky. Tímto voláním je struktura automobilu předaná testovacímu prostředí, které ji zpracuje (zkontroluje, uvolní prostředky, ...).
  55. spoiled
  56. je funkce, kterou může zavolat libovolné vlákno montážní linky. Tato funkce zajistí odstranění automobilu, který byl při nějakém kroku výrobního procesu poškozen (odpovídající volání stages[i] vrátilo nulu).
  57.  
  58. Úkolem je implementace funkce AssemblyLine. Její implementace znamená vytváření vláken, jejich vzájemnou synchronizaci a ukončování. Zaměřte se zejména na správné předávání automobilů mezi jednotlivými kroky výrobní linky. Vaším úkolem je synchronizací zajistit, že najednou pracuje co nejvíce vláken (pokud to lze) a zároveň nesmíte dopustit zahlcení výrobní linky více automobily než je počet pracovníků (+ zásobovač + expedice). Vaše implementace nesmí používat aktivní čekání. Pokud jej použije, bude Váš program hodnocen nejvýše 50% (případně bude násilně ukončen pro vyčerpání max. doby běhu). Využijte blokování a vhodné synchronizační prostředky. Testovací prostředí je skutečným víceprocesorovým systémem, tedy musíte správně ošetřovat kritické sekce a jejich zamykání.
  59.  
  60. Odevzdávejte soubor, který obsahuje implementaci Vaší funkce AssemblyLine a případné další podpůrné funkce a deklarace, které Vaše implementace potřebuje. Na začátek souboru vložte deklarace struktur uvedené výše, včetně direktiv podmíněného překladu. Pokud necháte v odevzdávaném souboru funkci main nebo nějaké Vaše testovací funkce, zabalte je do bloku podmíněného překladu.
  61.  
  62. Nepoužívejte datové struktury z STL - jejich využití povede k chybě při kompilaci. STL není thread-safe, navíc zde není potřeba žádná komplikovaná datová struktura.
  63. Nápověda:
  64. Nevytvářejte více threadů než je udáno v parametrech volání. Testovací prostředí omezuje celkový počet vytvořených threadů.
  65. Omezte používání globálních proměnných, při každém volání funkce AssemblyLine je inicializujte. Testování volá funkci AssemblyLine několikrát, s různými parametry. Druhé a další vyvolání nemá jistotu, že globální promenné maji na počátku hodnoty dané jejich inicializátory.
  66. Nepoužívejte inicializace PTHREAD_MUTEX_INITIALIZER a jejich varianty. Důvod je stejný jako v minulém bodu.
  67. Uvolňujte prostředky, které alokujete (paměť, mutexy, thready, ...). Testovací prostředí volá funkci AssemblyLine opakovaně. Pokud každé vyvolání zanechá neuvolněné prostředky, můžete prostředky vyčerpat a následné testy kvůli tomu nezvládnout.
  68. Montážní linka vlastně představuje koncept proudového zpracování. Tento princip se v různých podobách uplatňuje v návrhu hardware, např. v procesorech. Na anglické Wikipedii jsou zdařilé obrázky zachycující princip proudového zpracování - heslo pipeline (computing).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement