Curs 5. Programare Paralela si Distribuita. Forme de sincronizare - Java. Curs 5 - PPD 1

Documente similare
Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Ingineria Sistemelor de Programare

Curs 10

Declararea variabilelor

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Ingineria Sistemelor de Programare

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Paradigme de Programare

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Top

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Proiectarea Sistemelor Software Complexe

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

PPSD

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Laborator 3

PowerPoint Presentation

SUBPROGRAME

Laborator 10 - Paradigme de Programare Corutine - suport nativ pentru paralelism în Kotlin Înainte de a trece la realizarea unei aplicații utilizând c

Programarea şi utilizarea calculatoarelor

LABORATOR I

Slide 1

Platformăde e-learning și curriculăe-content pentru învățământul superior tehnic Sisteme de operare 13. Planificarea proceselor

PowerPoint Presentation

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Ingineria Sistemelor de Programare

RZOLVARE EXERCITIU ZODII declare cursor distributie_zodie is select nume_zodie, count(*) distributie from zodiac z join utilizatori u on to_date(to_ch

Object Oriented Programming

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Textul si imaginile din acest document sunt licentiate Attribution-NonCommercial-NoDerivs CC BY-NC-ND Codul sursa din acest document este licentiat Pu

Limbaje de Programare Curs 8 – Fisiere

L7

Paradigme de programare

Microsoft Word - Curs 7 - JavaScript.doc

Microsoft Word - CarteC.doc

Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuit

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Limbaje de Programare Curs 6 – Functii de intrare-iesire

IBR 8 iulie 2019

Gestionarea I/E

Declaraţii. Instrucţiuni 19 octombrie 2005 Programarea calculatoarelor 2. Curs 3b Marius Minea

Lab6LCD

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Microsoft Word - 2 ES RO.doc

tehnologii web

PowerPoint Presentation

Programarea şi utilizarea calculatoarelor

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Curs 8: Tehnica divizării (I) Algoritmi si structuri de date - Curs 8 1

PowerPoint-Präsentation

Laborator 7: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea I - proceduri) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blo

Microsoft Word - PCLP2_Curs_4_2019.doc

Curs 6 Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reut

Metode de sortare - pregătire admitere - Conf.dr. Alexandru Popa Lect. dr. Andrei Pătraşcu Universitatea din Bucureşti 1

Programarea şi utilizarea calculatoarelor

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ

PHP (II)

PROGRAMARE ORIENTATA PE OBIECTE

I. Navigating LabVIEW

Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate r

Paradigme de Programare

III. Tablouri (Arrays) și Clustere

Slide 1

ALGORITHMICS

Laborator 8: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea II - functii) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de bloc

Microsoft PowerPoint - SD5-RO.ppt

C++ Probleme

2

Structuri de date pentru partiţii de mulţimi O partiţie finită a unei mulţimi nevide S este o mulţime finită de submulţimi ale lui S: {S 1, S 2,..., S

PowerPoint Presentation

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

PROCESOARE NUMERICE DE SEMNAL

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

User guide

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil

E_d_Informatica_sp_MI_2015_bar_02_LRO

-

Metode avansate de gestiune a documentelor și a sistemelor de calcul - curs 1 -

Microsoft PowerPoint - Fp_2.ppt

Slide 1

CURS

Microsoft PowerPoint - TDRC_II-10-TCP.ppt

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Limbaje de Programare Curs 5 – Siruri de caractere

Microsoft Word - Curs 11 - PHP.doc

PowerPoint Presentation

PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri

Platforma 5. 1 Introducere in MSSQL Introducere Pe parcursul ultimilor ani, se poate observa o cuplare a limbajelor de programare majore cu tipuri de

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Analiză statică Analiza fluxului de date 23 octombrie 2014

Metode API - integrare FGO v.2.5 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 5 EMITERE... 5 PRINT... 6 S

Inferenţa statistică

Transcriere:

Curs 5 Programare Paralela si Distribuita Forme de sincronizare - Java Curs 5 - PPD 1

Monitor in Java Fiecare obiect din Java are un mutex care poate fi blocat sau deblocat in blocurile sincronizate: Bloc sincronizat Object lock = new Object(); synchronized (lock) { // critical section :> sau metoda (obiectul blocat este this ) synchronized type m(args) { // body echivalent type m(args) { synchronized (this) { // body Curs 5 - PPD 2

Monitor in Java Prin metodele synchronized monitoarele pot fi emulate nu e monitor original variabilele conditionale nu sunt explicit disponibile, dar metodele wait() notify() // signal notifyall() // signal_all pot fi apelate din orice cod synchronized Disciplina = Signal and Continue Java "monitors" nu sunt starvation-free notify() deblocheaza un proces arbitrar. Curs 5 - PPD 3

Synchronized Static Methods Class Counter{ static int count; public static synchronized void add(int value){ count += value; public static synchronized void decrease(int value){ count -= value; -> blocare pe class object of the class => Counter.class Ce se intampla daca sunt mai multe metode statice sincronizate? Curs 5 - PPD 4

fine-grained synchronization public class Counter { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() { synchronized(lock1) { c1++; Ce se intampla daca lock1 sau lock2 se modifica? Ce se intampla daca sunt metode de tip instanta sincronizate dar si metode statice sincronizate? public void inc2() { synchronized(lock2) { c2++; Curs 5 - PPD 5

Exemplu public class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; public synchronized void decrement() { c--; public synchronized int value() { return c; Curs 5 - PPD 6

Transformare => fine-grained synchronization public class Counter { private long c = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); Este corect? public void inc() { synchronized(lock1) { c++; public void dec() { synchronized(lock2) { c--; Ce probleme exista? Curs 5 - PPD 7

Nonblocking Counter public class NonblockingCounter { private AtomicInteger value; public int getvalue() { return value.get(); public int increment() { int v; do { v = value.get(); while (!value.compareandset(v, v + 1)); return v + 1; Curs 5 - PPD 8

Exemplificari wait() notify() // signal notifyall() // signal_all Curs 5 - PPD 9

Exemplu > Producator- Consumator / Buffer de dimensiune = 1 public class Producer extends Thread { ITER private CubbyHole cubbyhole; private int number; //id public Producer(CubbyHole c, int number) { cubbyhole = c; this.number = number; public class Consumer extends Thread { ITER private CubbyHole cubbyhole; private int number; //id public Consumer(CubbyHole c, int number) { cubbyhole = c; this.number = number; public void run() { for (int i = 0; i < ITER; i++) { cubbyhole.put(i); public void run() { int value = 0; for (int i = 0; i < ITER; i++) { value = cubbyhole.get(); Curs 5 - PPD 10

public class CubbyHole { private int contents; // shared data : didactic private boolean available = false; /* Method used by the consumer to access the shared data */ public synchronized int get() { while (available == false) { try { wait(); // Consumer enters a wait state until notified by the Producer catch (InterruptedException e) { available = false; notifyall(); // Consumer notifies Producer that it can store new contents return contents; /* Method used by the consumer to access (store) the shared data */ public synchronized void put (int value) { while (available == true) { try { wait(); // Producer who wants to store contents enters // a wait state until notified by the Consumer catch (InterruptedException e) { contents = value; available = true; notifyall(); // Producer notifies Consumer to come out // of the wait state and consume the contents Curs 5 - PPD 11

class BlockingQueue { int n = 0; Queue data =...; exemplu: BlockingQueue : buffer size >1 public synchronized Object remove() { // wait until there is something to read while (n==0) this.wait(); n--; // return data element from queue public synchronized void write(object o) { n++; // add data to queue notifyall(); Curs 5 - PPD 12

Missed Signals- Starvation Apelurile metodelor notify() si notifyall() nu se salveaza in cazul in care nici un thread nu asteapta atunci cand sunt apelate. Astfel semnalul notify se pierde. Acest lucru poate conduce la situatii in care un thread asteapta nedefinit, pentru ca mesajul corespunzator de notificare se pierde. Curs 5 - PPD 13

public class MyWaitNotify2{ MonitorObject mymonitorobject = new MonitorObject(); boolean wassignalled = false; Propunere: Evitarea problemei prin salvarea semnalelor in interiorul clasei care le trimite. =>analiza! public void dowait(){ synchronized(mymonitorobject){ if(!wassignalled){ try{ mymonitorobject.wait(); catch(interruptedexception e){... //clear signal and continue running. wassignalled = false; public void donotify(){ synchronized(mymonitorobject){ wassignalled = true; mymonitorobject.notify(); Curs 5 - PPD 14

Condition in Java java.util.concurrent.locks Interface Condition Imparte metodele monitorul definit pentru Object (wait, notify, notifyall) in obiecte distincte pentru a permite mai multe wait-sets per object. Curs 5 - PPD 15

Exemplu class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notfull = lock.newcondition(); final Condition notempty = lock.newcondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; public void put(object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notfull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notempty.signal(); finally { lock.unlock(); public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notempty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notfull.signal(); return x; finally { lock.unlock(); Curs 5 - PPD 16

Similar C++11 struct BoundedBuffer { int* buffer; int capacity; int front, rear, count; std::mutex lock; std::condition_variable not_full; std::condition_variable not_empty;... void deposit(int data){ std::unique_lock<std::mutex> l(lock); int fetch(){ std::unique_lock<std::mutex> l(lock); //se asociaza cu un lock(mutex) //si cu o functie booleana not_full.wait(l, [this](){return count!= capacity; ); buffer[rear] = data; rear = (rear + 1) % capacity; ++count; not_empty.notify_one(); not_empty.wait(l, [this](){return count!= 0; ); int result = buffer[front]; front = (front + 1) % capacity; --count; not_full.notify_one(); return result; Curs 5 - PPD 17

Semaphore (java.util.concurrent.semaphore) Semafor binar (=> excludere mutuala) Semaphore semaphore = new Semaphore(1); //critical section semaphore.acquire(); semaphore.release(); Fair Semaphore Semaphore semaphore = new Semaphore(1, true); Curs 5 - PPD 18

Exemplu Thread loop = new Thread( new Runnable() { public void run() { while (true) { if (Thread.interrupted()) { break; // Continue to do what it should be done ); loop.start(); loop.interrupt(); Curs 5 - PPD 19

Lock (java.util.concurrent.locks.lock) public class Counter{ private int count = 0; public int inc(){ synchronized(this){ return ++count; public class Counter{ private Lock lock = new ReentrantLock(); private int count = 0; public int inc(){ lock.lock(); int newcount = ++count; lock.unlock(); return newcount; Curs 5 - PPD 20

Metode ale interfetei Lock lock() lockinterruptibly() trylock() trylock(long timeout, TimeUnit timeunit) unlock() The lockinterruptibly() method locks the Lock unless the thread calling the method has been interrupted. Additionally, if a thread is blocked waiting to lock the Lock via this method, and it is interrupted, it exits this method calls. Curs 5 - PPD 21

Diferente Lock vs synchronized Nu se poate trimite un parametru la intrarea intr-un bloc synchronized => nu se poate preciza o valoare timp corespunzatoare unui interval maxim de asteptare-> timeout. Un bloc synchronized trebuie sa fie complet continut in interiorul unei metode lock() si unlock() pot fi apelate in metode separate. Curs 5 - PPD 22

Lock Reentrance Blocurile sincronizate in Java au proprietatea de a permite reintrarea (reentrant Lock). Daca un thread intra intr-un bloc sincronizat si blocheaza astfel monitorul obiectului corespunzator, atunci threadul poate intra in alt cod sincronizat prin monitorul aceluiasi obiect. public class Reentrant{ public synchronized outer(){ inner(); public synchronized inner(){ //do something Curs 5 - PPD 23

Read / Write Lock Read Access -> daca nici un thread nu scrie si nici nu cere acces pt scriere. Write Access -> daca nici un thread nici nu scrie nici nu citeste. Exemplu: ThreadSafeArrayList Curs 5 - PPD 24

Non blocking public class ConcurrentStack<E> { AtomicReference<Node<E>> head = new AtomicReference<Node<E>>(); static class Node<E> { final E item; Node<E> next; public Node(E item) { this.item = item; public void push(e item) { Node<E> newhead = new Node<E>(item); Node<E> oldhead; do { oldhead = head.get(); newhead.next = oldhead; while (!head.compareandset(oldhead, newhead)); public E pop() { Node<E> oldhead; Node<E> newhead; do { oldhead = head.get(); if (oldhead == null) return null; newhead = oldhead.next; while (! head.compareandset(oldhead,newhead)); return oldhead.item; Curs 5 - PPD 25

Michael-Scott non-blocking queue algorithm: Insertion public class LinkedQueue <E> private static class Node <E> { final E item; final AtomicReference<Node<E>> next; Node(E item, Node<E> next) { this.item = item; this.next = new AtomicReference<Node<E>>(next); private AtomicReference<Node<E>> head = new AtomicReference<Node<E>>( new Node<E>(null, null)); private AtomicReference<Node<E>> tail = head; * B */; public boolean put(e item) { Node<E> newnode = new Node<E>(item, null); while (true) { Node<E> curtail = tail.get(); Node<E> residue = curtail.next.get(); if(curtail == tail.get()) { if (residue == null) /* A */ { if (curtail.next.compareandset( null, newnode)) /* C */ { tail.compareandset(curtail, newnode) /* D */ ; return true; else { tail.compareandset(curtail, residue) / Curs 5 - PPD 26