---
# System prepended metadata

title: Lista 12
tags: [SO]

---

# 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
