---
# System prepended metadata

title: SO Lista 2
tags: [SO]

---

---
title: SO Lista 2
tags: SO
author: Mateusz Reis
---

# SO Lista 2

## ZADANIE 1

![](https://i.imgur.com/q7Ry20r.png)

### stany procesu:
- Stopped - proces został zatrzymany i może być wznowiony za pomocą sygnału
- Running:
-- ready - proces załadowany do pamięci, oczekuje na wykowanie instrukcji przez procesor
-- executing - procesor aktualnie wykonuje instrukcje procesu
- Uninterruptible - proces jest zablokowany ale nie obsługuje sygnałów 
- Interruptible - proces jest zablokowany i oczekuje na zdarzenie 
- Zombie - proces który się wykonał ale dalej istnieje w tablocy procesów i czeka na pogrzebanie przez rodzica

### akcje zmieniające stan procesu:
- READY <---> EXECUTTING - zaplanowanie wykonania przez scheduler (tylko jądro)
- READY/EXECUTTING <---> STOPPED - otrzymanie sygnału SIGSTOP/SIGCONT (od procesu, który wywołał user np debugger)
- EXECUTTING ---> ZOMBIE - 
-- dobrowolne zakończenie procesu np exit(0) - użytkownik
-- sygnał SIGTERM/SIGKILL (użytkownik/jądro)
-- błąd I/O (np. sterownik urządzenia)
- EXECUTTING ---> UNINTERRUPTIBLE/INTERRUPTIBLE - 
-- wywyołanie operacji I/O (użytkownik)
- UNITERRUPTIBLE/INTERRUPTIBLE ---> READY -
-- zakończenie operacji I/O (jądro)
-- sygnał (użytkownik/jądro)
-- dostępność zasobów (jądro)

### sen przerywalny/nieprzerywalny 
- sen przerywalny - proces śpi, jednak może zostać obudzony przez sygnały
- sen nieprzerywalny - proces śpi i nie może zostać przerwany przez sygnały ~ podczas takiego snu sygnały są kumulowane i zostają obsłużone po wybudzeniu (SIGKILL nie zabija takiego procesu odrazu, dopiero po wybudzeniu)

### blokowanie/ignorowanie sygnałów a SIGKILL
- blokowanie sygnału - jeśli ustawimy maskę sygnałów na blokowanie sygnałów jądro nigdy nie dostarczy takiego sygnału do procesu 
- ignorowanie sygnału - sygnał zostaje dostarczony do procesu jednak nie wie jak go obsłużyć w efekcie nie robi nic 
- nie można zablokować/ignorować SIGKILL, jeśli spróbujemy ustawić taką blokadę na masce bitowej proces automatycznie zostanie zabity  


## ZADANIE 2

### Różnice między tworzeniem procesu W Linuxie oraz WinNT

- Linux - nadaje procesowi nowy PID oraz GPID kopiuje od rodzica, kopiuje część danych od rodzica, zeruje liczniki, mapuje pamieć na pamieć rodzica, wypełnia rejestry
- WinNT - wywoływany jest syscall CreateProcess, który traktuje argument jako nazwę pliku wykonywalnego, otwierany jest obraz programu, który służy do zmapowania programu do nowej pamięci procesu. Adresy jeśli są dziedzone zostają skopiowane do pamięci nowego procesu. Nowy proces nie jest kopią procesu-rodzica i ma z nim niewielu wspólnego.

### FORK I EXECVE

Szkic pochodzi z książki Modern Operating Systems 4th Edition autorstwa Andrew Tanenbaum s.743 

![](https://i.imgur.com/XBqkhnI.png)


Wywołanie **fork** powoduje utworzenie task_struct, który zawiera informacje o procesie, których wymaga kernel. Informacje te są dziedziczone od rodzica. Następnie szukamy wolnego PID dla dziecka i wpisujemy PID do tablicy aby wskazywał na utworzonego task_structa. Następnie ustawiamy wskaźnik na kod i stos rodzica. Oraz tworzymy tablicę stron dla dziecka. Na koniec ustawiamy rejestry 

Wywołanie **execve** powoduje wyszukiwanie polecenia przez jądro, skopiowanie argumentu i zmiennych środowiskowych. Następnie zwalniamy przestrzeń adresową. Po tym przypisujemy nową pamięć do procesu i wypełniamy ją argumentami oraz zmiennymi. Resetujemy sygnały oraz zerujemy rejestry. 

### kopiowanie przy zapisie

Służy optymalizacji przy tworzeniu nowych procesów. Dziecko otrzymuje swoją tablicę stron, jednak jest ona read-only. Próba zapisu skutkuje protection fault, co kernel obsługuje kopiując dane.

## ZADANIE 4

### sygnały wysyłane domyślnie:
- kill - SIGTERM
- pkill - SIGTERM
- xkill - polecienie zamyka połączenie z X-serwer i to proces decyduje czy skończyć działanie czy kontynuować (nie wysyła sygnałów)

### sygnały oczekujące 
- sygnały które zostaną dostarczone do procesu gdy zostanie wybudzony z nieprzerywalnego snu 

### zmiany w masce bitowej SigPnd
- do pokazania w terminalu 

### pozostałe pola dotyczące sygnałów w status
- SigQ - liczba sygnałów w kolejce 
- SigPnd - sygnały oczekujące na wątek
- ShdPnd - sygnały oczekujące na cały proces
- SigBlk - sygnały blokowane 
- SigIgn - sygnały ignorowane
- SigCgt - sygnały złapane



## ZADANIE 5

- SIEROTA - proces którego rodzic przestał istnieć 
- ŻNIWIARZ - proces, który kończy niezakończone procesy 
- KOD WYJŚCIA - wartość zwracana przez proces po wykonaniu, 0 - dla poprawnych wykonań inne - jeśli proces zakończył się błędem 