# Lista 12 ###### tags: `SO` ## Zadanie 1 myid - niewspółdzielone strtab - współdzielony vargp - niewspółdzielony cnt - współdzielony <- źródło wyścigów argc - niewspółdzielony argv[0] - współdzielony ## Zadanie 2 Sekcja krytyczna - fragment kodu wykonywany jednocześnie tylko przez jeden wątek. - wzajemne wykluczenie Czemu nie możemy używać wyłączania przerwań? Możemy pominąć niektóre przerwania. ## Zadanie 3 ![](https://i.imgur.com/Pj4NOmo.png) ![](https://i.imgur.com/DcF8TBO.png) ```c= void unlock(lock_t *lock) { lock->flag = 0; } ``` (1 + n) /2 * n ## Zadanie 4 `yield` może być droższy od aktywnego czekania. ![](https://i.imgur.com/WZsbVj4.png) setpark - informueje o zamiarze parka Bez setparka, ktos inny moze nas obudzic zanim zasniemy ## Zadanie 5 ![](https://i.imgur.com/RKSzfzV.png) Nie radzi sobie z zamkami, które nie spełniają jego początkowych założeń (może zwrócić wynik fałszywie pozytywny). ![](https://i.imgur.com/xLSQY19.png) ## Zadanie 6 turn B blocked A:true B:false blocked A:true B:true turn A ## Zadanie 7 Załóżmy, że wątek A jako pierwszy ustawił zmienną `turn`, a B jako drugi. Wiemy wtedy, że gdy B odczytywał warunek pętli `while`, to flaga wątku A była ustawiona (ponieważ musiał zrobić to przed ustawieniem zmiennej `turn`, a więc przed naszym odczytem) oraz zmienna `turn` wskazywała również na wątek A, zatem wątek B był zmuszony czekać w pętli. ## Zadanie 8 count: 1 V() ## Zadanie 9 a) **push**: n = 2 push() pop() if not full push() if full sleep wakeup push() <- **pop:** push() if not empty pop() if empty: sleep wakeup pop() b) n * push() wakeup cons if queue.full: n * pop() if empty sleep sleep