Documente Academic
Documente Profesional
Documente Cultură
Fire de execuție
Cuprins
• fire de execuție
– kernel
– utilizator
• NPTL
2
Bibliografie
3
Tipuri de procese (CPU)
4
Stările proceselor
5
Exemple de procese
• Editoare de text
• Server Web
• Jocuri
6
FIRE DE EXECUȚIE
7
Fire de execuție
• Unitatea de planificare
8
Procese și fire de execuție
9
Fire de execuție
10
Spațiul de memorie
11
Propietățile unui fir de execuție
• TID – identificator
• TLS – thread local storage
• Stack – stiva
• Registre de CPU
• State – starea
• Priority – prioritea
12
Tipuri de fire de execuție
• Nucleu
– Sunt cunoscute de kernel
– Se face schimbare de context
• Utilizator
– Nu sunt cunoscute de kernel
– Nu se face schimbare de context
13
Tipuri de fire de execuție
14
Întrebare?
15
Starea proceselor
16
Schimbarea de context
17
Schimbarea de context
18
Implementarea firelor de execuție
• Many to one
• One to one
• Many to many
19
Many to one
• Fire de execuție
utilizator
20
One to one
• Fire de execuție nucleu
• Fiecare fir de execuție este planificat pe
un fir de execuție nucleu
21
Many to many
22
Oprirea unui fir de execuție
• Asincron
– Firul de execuție este oprit imediat
• Deffered
– Fire de execuție se oprește singur
23
Implementare
• Windows
– Threads
– Fibers
• UNIX
– pthreads (NPTL)
– bibliotecă
• Java/Go
– Many to many
24
Windows
• Threads
– Nucleu
– Un proces are mai multe fire de execuție nucleu
• Fibers
– Utilizator
– Un fir de execuție nucleu are mai multe fire de
execuție utilizator
25
POSIX
26
Proces nou - UNIX
27
Fire de execuție nou - UNIX
29
Funcții
// create a thread
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
// stop a thread
int pthread_cancel(pthread_t thread);
// detach a thread
int pthread_detach(pthread_t thread)
30
Exemplu
31
Start
void *data;
int main ()
{
int r;
pthread_t run_thread;
32
Probleme
• fork et exec
– se clonează toate firele de execuție?
– exec înlocuiește un singur fir de execuție?
• semnale
– care fire de execuție primește semnalele?
33
Fire de execuție și fork
• detalii
https://www.linuxprogrammingblog.com/threads
-and-fork-think-twice-before-using-them
34
Exemplu descriptori de fișiere
fd = open("file",O_RDWR|O_CREAT|O_TRUNC, 0600);
if (fd < 0) {
perror ("open()");
return 0;
}
35
Soluția
int pthread_atfork(
void (*prepare)(void),
void (*parent)(void),
void (*child)(void)
);
36
Semnale
37
Cuvinte cheie
38
Întrebări
39
Sisteme de operare
Sincronizare
Cuprins
• cursa
• zona critică
• acțiuni atomice
• busy waiting
• semafor
• mutex
2
Bibliografie
3
Sincronizare
• Secvențiere / ordonare
– read after write
– write after write
– use after create
4
Primitive de sincronizare
• Ordonare
– wait
– notify
• Acces exclusiv
– lock
– unlock
5
CURSA
6
Cursa
Proces 1 Proces 2
// shared variable a // shared variable a
int a = 0; int a = 0;
if (a == 0) if (a == 0)
{ {
a++; a++;
} }
printf ("%d\n", a); printf ("%d\n", a);
7
Cursa – varianta secvențială
Proces 1 Proces 2
// shared variable a // shared variable a
int a = 0;
if (a == 0) {
a++;
}
printf ("%d\n", a);
int a = 0;
if (a == 0) {
a++;
}
printf ("%d\n", a);
1 1
8
Cursa – varianta intercalată
Proces 1 Proces 2
// shared variable a // shared variable a
int a = 0;
if (a == 0) {
int a = 0;
if (a == 0) {
a++;
}
a++;
}
2 2
9
Cursa – varianta corectă
Proces 1 Proces 2
// shared variable a // shared variable a
int a = 0;
int a = 0;
if (a == 0) {
a++;
}
if (a == 0) {
a++;
}
1 1
zona critică
10
Zona critică
if (a == 0) {
a++;
}
if (a == 1) {
a--;
}
• Întreruperi posibile
– întrerupere sau excepție
– semnal
– schimbare de context
int main ()
{
int a = 0;
a++;
}
13
Exemplu – x86-64
14
Exemplu – ARM
15
Instrucțiuni pentru sincronizare
; rbp-4 address of variable test
test = 1;
mov DWORD PTR [rbp-4], 1
// do some work
; do some work
test = 0;
} mov DWORD PTR [rbp-4], 0
.L2:
Nu este atomică
Problema TOCTOU
Time of Check, Time of Utilization
16
Test and set / Compare and swap
• O instrucțiune care
– Execută o comparație
– Execută o atribuire în funcție de comparație
• TSL / CAS
r = value;
value = 1;
if (r == 0) ...
17
Instrucțiune pentru sincronizare
; rbp-4 address of variable test
18
Instrucțiune pentru sincronizare
; rbp-4 address of variable test
19
Primitive cod atomic
• Spinlock
• Semafor
• Mutex
20
SPINLOCK
21
Spinlock
while (test != 0)
Spinlock
continue;
test = 1; Atomic?
test = 0;
22
Spinlock x86
; rbp-4 address of variable test
Nu este atomic
23
Spinlock
test = 0;
24
Spinlock x86
; rbp-4 address of variable test
Este atomic
25
lock și unlock
• lock
– acaparează spinlock-ul
• unlock
– eliberează spinlock-ul
26
lock și unlock
// s - spinlock
27
Exemplu
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
lock (s); lock (s);
if (a == 0)
{
a++;
}
unlock (s);
if (a == 0)
printf ("%d\n", a); {
a++;
}
unlock (s);
printf ("%d\n", a);
1 1 28
Exemplu
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
lock (s); lock (s);
if (a == 0)
{
a++;
}
unlock (s);
if (a == 0)
{ printf ("%d\n", a);
a++;
}
unlock (s);
printf ("%d\n", a);
1 1 29
Deadlock
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
lock (s); lock (s);
if (a == 0)
{
a++;
}
... 1 31
Folosirea lui de lock mai multe ori
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
lock (s); lock (s);
lock (s);
... ... 32
Oprirea înainte de unlock
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
lock (s); lock (s);
if (a == 0)
{
a++;
}
... eroare 33
SEMAFOR
34
Spinlock
test = 0;
35
Busy Waiting
36
Stările proceselor
Spinlock
37
Stările proceselor
38
Semafor
• Obiect al SO
• Valoare inițială
39
Funcțiile semaforului
40
Variabilă de condiție
– wakeup / notify
• oprește toate procesele blocate de această variabilă
– starea READY
41
Stările proceselor
block
wakeup
42
Funcționarea semaforului
43
Tipuri de semafoare
• binare
– valoarea poate fi doar 0 sau 1
• contor
– naloare poate fi orice număr întreg
44
Semafor binar
45
Exemplu
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
wait (s); wait (s);
if (a == 0)
{
a++;
}
signal (s);
if (a == 0)
printf ("%d\n", a); {
a++;
}
signal (s);
printf ("%d\n", a);
1 1 46
Exemplu
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
wait (s); wait (s);
if (a == 0)
{
a++;
}
signal (s);
if (a == 0)
{ printf ("%d\n", a);
a++;
}
signal (s);
printf ("%d\n", a);
1 1 47
Deadlock
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
wait (s); wait (s);
if (a == 0)
{
a++;
}
... 1 49
Folosirea lui wait de mai multe ori
Processus 1 Processus 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
wait (s); wait (s);
wait (s);
... ... 50
Oprirea înainte de signal
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
int s; int s;
wait (s); wait (s);
if (a == 0)
{
a++;
}
... eroare 51
MUTEX
52
Mutex
• Mutual Exclusion
53
lock și unlock
• lock
– acaparează mutex-ul și reține TID-ul care l-a
acaparat
• funcția lock este re-entrantă
• unlock
– eliberează mutex-ul
• la terminare (thread) mutex-ul este eliberat
54
Deadlock
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
mutex s; mutex s;
lock (s); lock (s);
if (a == 0)
{
a++;
}
if (a == 0)
{
a++;
}
unlock (s);
printf ("%d\n", a);
1 1 56
Folosirea lui lock de mai multe ori
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
mutex s; mutex s;
lock (s); lock (s);
lock (s);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%d\n", a);
if (a == 0)
{
a++;
}
unlock (s);
printf ("%d\n", a);
1 1 57
Oprirea înainte de unlock
Proces 1 Proces 2
// shared variables a and s // shared variables a and s
int a = 0; int a = 0;
mutex s; mutex s;
lock (s); lock (s);
if (a == 0)
{
a++;
}
if (a == 0)
{
a++;
}
unlock (s);
printf ("%d\n", a);
1 eroare 58
Spinlock vs semafor/mutex
Spinlock Semafor
• Implementat în user space • Implementat în kernel
• Busy waiting • Blochează procese
• Uitarea lui unlock • Uitarea lui notify
59
Sincronizarea în Java
class Run
{
private Object a;
60
Producător / Consumator
61
Buffer
https://blog.grijjy.com/2017/01/12/expand-
your-collections-collection-part-2-a-generic-
ring-buffer/ 62
Consumare
https://blog.grijjy.com/2017/01/12/expand-
your-collections-collection-part-2-a-generic-
ring-buffer/ 63
Producere
https://blog.grijjy.com/2017/01/12/expand-
your-collections-collection-part-2-a-generic-
ring-buffer/ 64
Producător / Consumator
Producător Consumator
lock(mutex); lock(mutex);
if (is_buffer_full()) if (is_buffer_empty())
wait(buffer_not_full,mutex); wait(buffer_not_empty, mutex);
produce_item(); consume_item();
signal(buffer_not_empty); signal(buffer_not_full);
unlock(mutex); unlock(mutex);
65
Sincronizare
66
Cuvinte cheie
67
Întrebări
68
Sisteme de operare
Dispozitive de Intrare/Ieșire
Cuprins
• tipuri de dispozitive
• comunicarea cu
dispozitivele
• tipul de operații I/O
– kernel preemtiv/ne-preemtiv
2
Bibliografie
3
Top view
4
Sistemul de Intrare și Ieșire
5
DISPOZIVE
6
Dispozitiv
• Controller
– un procesor care controlează dispozitivul
• probabil are firmware
• Registre (port-uri)
– pentru schimb de date
• Sistem de conectare
7
Registre
• data-in register
• data-out register
• status register
– READY / BUSY
• control register
– trimiterea comenzilor
8
Tipuri de dispozitive (transfer)
• Caracter
– transferul de date se face la nivel de byte
• Block
– transferul de date se face doar în blocuri
9
Tipuri de dispozitive (acces)
• Serial
– transferul de date se face doar serial
• nu se poate face seek
• Aleator
– transferul de date se face către orice poziție
• se poate face seek
10
Tipuri de dispozitive (timp)
• Sincron
– perifericul transferă date doar la cerere
• Asincron
– perifericul transferă date oricând
11
COMUNICAREA CU DISPOZITIVELE
12
Comunicarea cu dispozitivele
13
Sistemul de Intrare și Ieșire
14
Port Mapped I/O
15
Memory Mapped I/O
16
Port vs Memory Mapped I/O
• Mai lent
17
Tipuri de interacțiune
18
Polling
19
Interrupts
Se repetă
20
Interrupts
int p = 0, bool sending = false;
void handle_interrupt() {
if (p < BUFFER_SIZE) {
DATA_OUT = data[p]; p = p + 1;
}
else { disable_interupt(); sending = false; send_done(); }
}
bool send() {
if (!sending) {
p = 0; sending = true; enable_interrupt();
return true;
}
return false;
}
21
Direct Memory Access
22
Direct Memory Access
bool sending = false;
void handle_dma_interrupt () {
sending = false; disable_dma_interupt ();
send_done ();
}
bool send () {
if (!sending) {
sending = true;
DMA_DATA = &data;
DMA_LEN = BUFFER_SIZE;
enable_dma_interrupt ();
return true;
}
return false;
}
23
Direct Memory Access
• Nu încarcă procesorul
24
Drivere
25
TIPURI DE OPERAȚII IO
26
Tipuri de operații IO
Sincrone Asincrone
27
Sincrone
• Blocante
– daca așteaptă date
– read, write
• Ne-blocante
– nu așteaptă date, întorc buffer gol
– read, write (O_NONBLOCK)
28
Secvența I/O
29
Subsistemul de IO
• Cache
• Buffer de date
• Rearanjarea cererilor
30
API DE INTRARE ȘI IEȘIRE
31
API
• Inițializare
• Control
• Transfer date
32
API Sincron
• Dispozitive block/character
– inițializare: open, close
– control: ioctl
– transfer: read, write
• Dispozitive de rețea
– inițializare: socket, shutdown
– control: setsockopt, getsockopt
– transfer: recv, send
33
API Asincron
• Dispozitive block/character
– inițializare: open, close
– control: ioctl
– transfer:
• read, write + select, poll, epoll
• aio_read, aio_write, aio_suspend
• Dispozitive de rețea
– inițializare: socket, shutdown
– control: setsockopt, getsockopt
– transfer: recv, send + select, poll, epoll
34
IO Completion Port
• Flag: OVERLAPPED
35
MSG_ZEROCOPY
36
Scatter
37
Cuvinte cheie
38
Întrebări
39
Sisteme de operare
Implementarea sistemelor
de fișiere
Contenu
• Fișiere
• Sisteme de fișiere
• Exemple
– DOS (FAT)
– Linux (ext)
– Windows (NTFS)
2
Bibliografie
3
FIȘIER
4
Discul
• persistent
• dimensiune de stocare
mare
• tabel de blocuri
5
Sistem de fișiere
6
Operații pe disc
partiționare
formatare montare backup
disc
fsck folosire
7
Partition
• Zonă contiguă
8
Tipuri de partiționare
9
MBR
10
GPT
11
SISTEM DE FIȘIERE
12
Sistem de fișiere
Aplicații
• fișiere și
directoare
Sistemul de
operare
• Structuri de date
13
Exemple de sisteme de fișiere
• ext3
• ReiserFS
• HFS
• NTFS
• FAT32
• ISO9660
• UDF
14
IMPLEMENTAREA
15
Discul
• Pagini
– Mai multe blocuri
• Bloc
– Unitatea de citire și scriere
– Sub-multiplu unei pagini de memorie
• (în general 512 B)
16
Partiția
17
Folosirea
18
Structura sistemului de fișiere
Fișier
• Date
– Conțiunutul fișierului
• Metadate
– Informații despre fișier
– FCB – File Control Block
20
Director
• Un fișier special
– în general
• Date
– lista de fișiere
• Metadate
– Informații despre fișier
– FCB – File Control Block
21
Alocarea fișierelor
• Contiguă
– Fișierele sunt stocate una după alta
• Fragmentare
• Liste
– Fiecare bloc are un pointer către următorul bloc
• Viteză de acces redusă
• Evită fragmentarea
• Indexată
– FCB-ul conține o listă de pointeri către fiecare bloc de date
• Evită fragmentarea
22
Alocarea contiguă
• Metdate (FCB)
– Pointer spre primul bloc al fișierului
– Numărul de blocuri alocate fișierului
• Implementare simplă
• Citire rapidă
23
Alocarea contiguă
Metadate
Date
24
Utilizare
25
Alocarea cu liste
• Metadate (FCB)
– Pointer sper primul bloc al fișierului
– Pointer spre ultimul bloc al fișierului
• Nu există fragmentare
• Implementare simplă
26
Alocarea cu liste
metadate
date
27
Alocarea cu liste
28
Utilizare
• FAT
• FAT32
• vFAT
29
Alocare indexată
• Metdate (FCB)
– Dimensiunea fișierlui
– Lista de pointeri spre blocurile de date ale fișierlui
• Nu are fragmentare
30
Alocare indexată
metadate
date
31
Utilizare
• Ext2,3,4
• NTFS
• RaiserFS
• HPFS
• AppleFS
• …
32
Exemplu de FCB (i-node)
33
Director
• Un fișier special
• Date
– listă de dentry (directory entry)
• Dimensiunea depinde de numărul de intrări
din listă
• . și .. sunt speciale
34
dentry
• Informații
– numele fișierlui
– id-ul fișierului (entry pentru FAT sau inode)
–…
• Windows
– WIN32_FIND_DATA
• POSIX
– struct dirent
35
Exemplu ext2
36
Link-uri
• Hard Links
– două structuri dentry spre aceelași i-node
– Nu se poate folosi între partiții diferite
• Sym Links (Soft Links)
– i-node special
– datele fișierului reprezintă numele (cu cale)
fișierului original
37
Exemple de link-uri
38
Spațiu liber
• Vector de biți
– 1 liber
– 0 ocupat
• Listă de blocuri
– Un bloc liber are un pointer către următorul bloc
liber
– Primul bloc liber este stocat
39
Exemplu
• disc de 512 GB
• bloc 512 B
• Adresa unui bloc are 32 biți
• Care este dimensiunea:
– Listei de blocuri
– Vectorului de biți
40
Buffer Cache
• Buffer Cache
41
Buffer Cache
42
Unified Buffer Cache
43
Alte memorii cache
• i-node cache
– Pune în RAM inode-uri pentru a le putea accesa
mai rapid
• dcache
– Rezolvarea fișierelor
44
Consistența sistemului de fișiere
• Blocuri de date
– erorile nu sunt detectabile
– E numai problema fișierlului
• Blocuri de metadate
– erorile sunt detectabile
– Este problema sistemului de fișiere
45
fsck/scandisk
46
fsck/scandisk
47
Exemplu fsck/scandisk
• Avantaje
– Reducerea timpului necesare la verificarea sistemului
de fișiere
– Reducerea posibilității de a pierde date la reboot
• Dezavantaje
– Sistemul de fișiere este mai lent
50
Virtual File System – VFS
• Windows
– IFS
• Linux
– VFS
51
Virtual File System – VFS
52
Cuvinte cheie
• metadate • FAT
• date • inode
• pagini • dirent
• bloc • buffer cache
• partiție • fsck
• FCB • fdisk
• alocare contiguă • jurnal
• alocare cu liste • VFS
• alocare indexată • vnode
53
Întrebări
54