so - curs 09 - sincronizareelf.cs.pub.ro/so/res/cursuri/so - curs 09 - sincronizare.pdf · suport...

49
Sincronizare SO: Curs 09

Upload: others

Post on 21-Jan-2021

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Sincronizare

SO: Curs 09

Page 2: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Cuprins

• Recapitulare thread-uri • Contextul sincronizării • Implementarea mecanismelor de

sincronizare • Sincronizarea multi core • Structuri de sincronizare

SO: Curs 09: Sincronizare 2

Page 3: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Suport de curs

• Operating Systems Concepts – Capitolul 6 - Process Synchronization

• Modern Operating Systems – Capitolul 2 - Processes and Threads

• Secțiunea 2.3 - Interprocess Communication

• Allen B. Downey - The Little Book of Semaphores

3SO: Curs 09: Sincronizare

Page 4: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

RECAPITULARE THREAD-URI

SO: Curs 09: Sincronizare 4

Page 5: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Ce este un thread?

• Instanță de execuție (planificabilă) • Instruction Pointer + Stack Pointer + stare

(registre) • Partajează cu alte thread-uri resursele

procesului: fișiere, memorie • Permite paralelism • Necesită sincronizare (partajare date) • User-level threads / kernel-level threads

SO: Curs 09: Sincronizare 5

Page 6: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

De ce thread-uri?

• Lightweight: timp de creare scurt, timp de comutare scurt – nu se face schimbare de tabelă de pagini

(+TLB flush) la context switch

• Comunicare rapidă (memorie partajată) • Calcule multiprocesor cu date comune • Thread pool pentru prelucrarea de task-uri

– mai ușor de programat față de un model asincron

SO: Curs 09: Sincronizare 6

Page 7: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

De ce nu thread-uri?

• O problemă a unui thread afectează întregul proces

• Nevoie de sincronizare – date incoerente, comportament incoerent – probleme ale sincronizării – reentranță

• Mai puțin relevante pentru probleme seriale

SO: Curs 09: Sincronizare 7

Page 8: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

CONTEXTUL SINCRONIZĂRII

SO: Curs 09: Sincronizare 8

Page 9: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Context

• Sisteme multiproces - procese, thread-uri date comune

• Sisteme multicore - magistrală comună, memorie comună

• Nevoie de comunicare - canale de comunicație, date partajate

SO: Curs 09: Sincronizare 9

Page 10: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Situații posibile

• read before write • time of check to time of use (TOCTOU) • interleaved access

SO: Curs 09: Sincronizare 10

Page 11: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Condiții de cursă

• race conditions • output-ul unui sistem depinde de timp sau

de evenimente • dacă ordinea nu e cea dorită e un bug • nedeterminism în execuție • date inconsecvente/neintegre • poate fi vulnerabilitate exploatabilă

SO: Curs 09: Sincronizare 11

Page 12: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Date inconsecvente

SO: Curs 09: Sincronizare 12

unsigned long sum = 0;

void thread_func(size_t i) { sum += i * i * i; print(“sum3(%zu): %lu\n”, i, sum); }

int main(void) { size_t i; for (i = 0; i < NUM_THREADS; i++) create_thread(thread_func, i); [...] }

Ce probleme sunt în codul de mai sus? Cum le-am rezolva?

Page 13: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

TOCTOU

SO: Curs 09: Sincronizare 13

if (access("file", W_OK) != 0) { exit(1); }

/* done by another process */ . . . . . symlink("/etc/passwd", "file"); . . . . .

fd = open("file", O_WRONLY); write(fd, buffer, sizeof(buffer));

https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use#Examples

Page 14: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Sincronizare

• Asigurarea accesului corect la date – date integre – determinism

• Acces exclusiv / serializare / atomizare – regiune critică

• Secvențiere / ordonare – read after write, write after write, use after

create

SO: Curs 09: Sincronizare 14

Page 15: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Primitive de sincronizare

• Ordonare – wait() – notify()

• Acces exclusiv – lock() – unlock()

SO: Curs 09: Sincronizare 15

Page 16: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Mecanisme de sincronizare

• Ordonare – semafoare – cozi de așteptare – variabile condiție – monitoare

• Acces exclusiv – variabile atomice – spinlock-uri – mutex-uri

SO: Curs 09: Sincronizare 16

Page 17: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

IMPLEMENTAREA MECANISMELOR DE SINCRONIZARE

17SO: Curs 09: Sincronizare

Page 18: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Atomicitatea unei operații

• Atomicitate: operația se execută fără intervenția unui alt proces sau core

• Este a += 5 atomică în C?

SO: Curs 09: Sincronizare 18

Page 19: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Single core / multi core

• a += 5 • x86: add [ebp-12], 5

- atomică single core - înseamnă read-update-write - poate fi “întreruptă” de alt core - neatomică multi core

• ARM: load, add, store - neatomică nici pe single core

SO: Curs 09: Sincronizare 19

Page 20: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Adunare atomică

• __sync_fetch_and_add (GCC) • https://gcc.gnu.org/onlinedocs/gcc-4.1.0/

gcc/Atomic-Builtins.html • pe x86 multi core pune lock pe magistrală • pe ARM leagă face operații tranzacționale

• tranzațional: totul sau nimic • dacă nu iese, încearcă iar

SO: Curs 09: Sincronizare 20

Page 21: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Atomic pe multi core

• un singur core să poată folosi exclusiv magistrala

• prefixul lock pe x86 • ldrex, strex pe ARM

SO: Curs 09: Sincronizare 21

Page 22: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Locking (implementare naivă)

lock = 0; /* init */

while (lock == 1) ; /* do nothing */ lock = 1; /* get lock */

SO: Curs 09: Sincronizare 22

Page 23: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Compare and Swap (CAS)

• Compare and Exchange • Prevenirea TOCTOU pentru locking naiv • Operație atomică simultană de verificare și

actualizare • compare_and_exchange(lock, 0, 1);

SO: Curs 09: Sincronizare 23

Page 24: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Compare and Swap (CAS) (2)

• compare_and_exchange(lock, 0, 1); • atomic for:

if (value == to_compare) value = to_update; return value;

SO: Curs 09: Sincronizare 24

Page 25: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Locking using CAS

• show demo

SO: Curs 09: Sincronizare 25

Page 26: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Spinlock

• basic exclusive access primitive • CAS-based, în general optimizat • suport multi core, access exclusiv la magistrală • uses busy waiting • spin_lock(), spin_unlock() • show demo

SO: Curs 09: Sincronizare 26

Page 27: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Mutex

• primitivă de acces exclusiv • blocantă, are o coadă de așteptare pentru

procese • adecvat pentru regiuni critice mai mari

SO: Curs 09: Sincronizare 27

Page 28: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Implementare mutex

• o structură • un câmp stare internă • o coadă de așteptare de procese • un spinlock pentru protejarea structurii interne • dacă regiunea critică nu e ocupată (not

contended) nu intră în coada de așteptare (fast path)

• futex: implementare cu suport user-space în Linux - evită apeluri de sistem pentru not contended

SO: Curs 09: Sincronizare 28

Page 29: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Spinlock vs. mutex

Spinlock• Busy-waiting • Simplu • Pentru regiuni critice

scurte

Mutex• Blocant • Coadă de așteptare • Pentru regiuni critice

mari sau în care thread-ul se blochează

SO: Curs 09: Sincronizare 29

Page 30: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

SINCRONIZAREA MULTI CORE

30SO: Curs 09: Sincronizare

Page 31: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

SMP

• Symmetric Multi Processing - memorie comună - magistrală comună de acces la memorie

• sincronizarea pe un cor nu ține cont de magistrală - de exemplu: dezactivare întreruperi

• pe multi core: acces exclusiv la magistrală

SO: Curs 09: Sincronizare 31

Page 32: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Acces exclusiv pe magistrală

• prefixul lock pe x86 lock add [ebp-12], 5

• ldrex, strex pe ARM ldrex … … strex … cmp … ; if not transactional, try again

• overhead de serializare a accesului

SO: Curs 09: Sincronizare 32

Page 33: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Sincronizarea cu lock multi core

• lock-ul este o variabilă comună • este încăcată în memoria cache a fiecărui core • modificările unui core (lock, unlock) se fac în

cache-ul local • modificările se propagă la celelalte cache-uri

SO: Curs 09: Sincronizare 33

Page 34: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Cache thrashing

• modificări într-un cache se propagă în celelalte cache-uri

• intrările în celelalte cache-uri se invalidează • spinlock-urile pe core-uri diferite duc la

modificări pe un core și invalidări pe celelalte • are loc cache thrashing

- invalidări frecvente - citiri din memoria principală - overhead

SO: Curs 09: Sincronizare 34

Page 35: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Variabile per-CPU

• câte o variabilă per procesor • nu e nevoie de sincronizare inter-core • exemplu: procesul curent care rulează • partiționare a datelor, eliminarea overhead-ului

de sincronizare

SO: Curs 09: Sincronizare 35

Page 36: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

STRUCTURI DE SINCRONIZARE

36SO: Curs 09: Sincronizare

Page 37: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Acces la date comune

• acces concurent - nevoie de acces exclusiv

• acces comunicativ/colaborativ - nevoie de ordonare citire/scriere - producător-consumator

SO: Curs 09: Sincronizare 37

Page 38: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Producător consumator

• zonă comună partajată • unul sau mai mulți scriitori (producători) • unul sau mai mulți cititori (consumatori) • buffer/zonă cu mai multe celule

- diferență de viteză producători/consumatori - networking, I/O, message passing

SO: Curs 09: Sincronizare 38

Page 39: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Implementare producător consumator

producer

lock(mutex); if (is_buffer_full()) wait(buffer_not_full,mutex); produce_item(); signal(buffer_not_empty); unlock(mutex);

consumer

lock(mutex); if (is_buffer_empty()) wait(buffer_not_empty, mutex); consume_item(); signal(buffer_not_full); unlock(mutex);

SO: Curs 09: Sincronizare 39

Page 40: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Buffer circular

• circular buffer, ring buffer

SO: Curs 09: Sincronizare 40

https://blog.grijjy.com/2017/01/12/expand-your-collections-collection-part-2-a-generic-ring-buffer/

Page 41: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Buffer circular

• buffer obișnuit cu “wrap around” • consume() / produce() sau get() / put() • index = (index + 1) % BUFFER_SIZE • read_index, write_index, capacity, size • demo • exemplu implementare: kfifo în nucleul

Linux

SO: Curs 09: Sincronizare 41

Page 42: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

CONCLUZII

42SO: Curs 09: Sincronizare

Page 43: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Contextul sincronizării

• Sisteme multiproces - procese, thread-uri date comune

• Sisteme multicore - magistrală comună, memorie comună

• Nevoie de comunicare - canale de comunicație, date partajate

• Nevoie de ordonare, determinism, date integre

SO: Curs 09: Sincronizare 43

Page 44: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Mecanisme de sincronizare

• necesită suport hardware • compare and swap (CAS) • acces exclusiv/serial

- variabile atomice - spinlock - mutex

• secvențiere/determinism/ordonare - semafoare - cozi de așteptare - variabile condiție - monitoare

SO: Curs 09: Sincronizare 44

Page 45: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Sincronizare SMP

• acces exclusiv pe magistrală (lock) • cache thrashing • variabile per-CPU

SO: Curs 09: Sincronizare 45

Page 46: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Buffer circular

• folosit pentru producător-consumator • viteze diferite de scriere și citire • buffer obișnuit cu “wrap around”

SO: Curs 09: Sincronizare 46

Page 47: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Probleme de sincronizare

• race conditions • TOCTOU • deadlock: așteptare mutuală • livelock: “așteptare” cu spinlock-uri

SO: Curs 09: Sincronizare 47

Page 48: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Overhead de apel

• Apelurile de lock, unlock, wait, notify sunt costisitoare

• În general înseamnă apel de sistem • De multe ori invocă planificatorul • Mai multe apeluri, mai mult overhead • Lock contention generează mai mult

overhead • De preferat, unde se poate, operații atomice

SO: Curs 09: Sincronizare 48

Page 49: SO - Curs 09 - Sincronizareelf.cs.pub.ro/so/res/cursuri/SO - Curs 09 - Sincronizare.pdf · Suport de curs • Operating Systems Concepts – Capitolul 6 - Process Synchronization

Cuvinte cheie

• sincronizare • multi core • determinism • condiție de cursă • inconsecvență • TOCTOU • acces exclusiv • atomicitate • secvențiere • operații atomice • mutex • spinlock

• CAS (compare and swap) • cmpxchg() • lock() • unlock() • signal() • wait() • locking pe magistrală • cache thrashing • per-cpu variables • ring buffer • producător-consumator • overhead de sincronizare

49SO: Curs 09: Sincronizare