Coarse-Grained Synchronization
|
|
- Clementine Francis
- 6 years ago
- Views:
Transcription
1 Coarse-Grained Synchronization Ogni metodo opera mediante un lock sull oggetto Code di attesa per operare sull oggetto Nozione di correttezza (linearizability) Modello astratto basato sulla nozione di storia Tecniche statiche (+ model checking) E fatta? 1 Coarse-Grained Synchronization Operare con thread Non aumenta necessariamente l efficienza complessiva di un sistema Attese attive, overhead di gestione, runtime complicato, Multiprocessori? Alcune app sono inerentemente parallele map&reduce come usato da Google 2 1
2 Fine-Grained Synchronization Non utilizziamo un lock globale Strutturiamo l oggetto in un insieme di lock Independently-synchronized components Metodi sono in conflitto quando cercano di accedere Medesima componente contemoraneamente Optimistic Synchronization Si cerca la componente richiesta senza usare lock Una volta trovata OK: e fatta Oops: riprova Valutazione Semplice Errori di programmazione sono costosi 2
3 Metodi add(x) remove(x) contains(x) Interface: Set List-Based Sets public interface Set<T> { public boolean add(t x); public boolean remove(t x); public boolean contains(t x); 3
4 public class Node { public T item; public int key; public Node next; List Node public class Node { public T item; public int key; public Node next; List Node item of interest 4
5 public class Node { public T item; public int key; public Node next; List Node Usually hash code public class Node { public T item; public int key; public Node next; List Node Reference to next node 5
6 List-Based Set - a b c + Ordinata con sentinelle (chiavi min & max) Preservato da add() Invariante remove() contains() Solita induzione sulla struttura 6
7 Rep: Funzione di astrazione a b Astrattamente: {a, b Rep Invariant Rep invariant Definisce quali sono le rappresentazioni legali valide Preservato dai metodi Dipende dai metodi 7
8 Sentinelle Ordinamento Nessun duplicato Rep Invariant S(head) = Abstraction Map { x esiste a tale che a raggoungibile da head e a.item = x 8
9 List Based Set Add(b) a c d Remove(b) a b c List Based Set Add(b) a c d Remove(b) b a b c 9
10 Coarse-Grained Locking a b d Coarse-Grained Locking a b d c 10
11 Coarse-Grained Locking a b d c Semplice e costoso Coarse-Grained Locking Metodi sincronizzati (a la Java) Solo un metodo ha l accesso Corretto Thread multipli Code di attesa Overhead 22 11
12 Fine-grained Locking Pensare prima di programmare Suddividere l oggetto in parti Ogni parte dell oggetto ha un suo lock Metodi che operano su parti disgiunte possono operare senza problema di sincronizzazione 23 a b c 12
13 a b c a b c 13
14 a b c a b c 14
15 Remove a b c d remove(b) Remove a b c d remove(b) 15
16 Remove a b c d remove(b) Remove a b c d remove(b) 32 16
17 Remove a b c d remove(b) Remove a c d remove(b) Problema 2 lock? 17
18 Concurrent Remove a b c d remove(b) remove(c) Concurrent Remove a b c d remove(b) remove(c) 18
19 Concurrent Remove a b c d remove(b) remove(c) Concurrent Remove a b c d remove(b) remove(c) 19
20 Concurrent Remove a b c d remove(b) remove(c) Concurrent Remove a b c d remove(b) remove(c) 20
21 Concurrent Remove a b c d remove(b) remove(c) Concurrent Remove a b c d remove(b) remove(c) 21
22 Concurrent Remove a b c d remove(b) remove(c) Art of Multiprocessor Programming 43 Concurrent Remove a b c d remove(b) remove(c) 44 22
23 a c d remove(b) remove(c) c non viene rimosso a c d remove(b) remove(c) 23
24 Quale e il problema? Rimuovere c Operare sul campo next di b a b c a b c Cerchiamo di capire il problema Se un nodo e lock Nessuno puo cancellare il nodo successore Morale: il thread deve fare il lock Sul nodo da cancellare E sul predecessore 24
25 a b c d remove(b) a b c d remove(b) 25
26 a b c d remove(b) a b c d remove(b) trovato 26
27 a b c d remove(b) trovat o a c d remove(b) 27
28 a b c d remove(b) remove(c) a b c d remove(b) remove(c) 28
29 a b c d remove(b) remove(c) a b c d remove(b) remove(c) 29
30 a b c d remove(b) remove(c) a b c d remove(b) remove(c) 30
31 a b c d remove(b) remove(c) a b c d remove(b) remove(c) 31
32 a b c d wait remove(c) a b c d remove(c) wait 32
33 a b c d Wait! remove(c) a b d Notify 33
34 a b d remove(b) a b d remove(b) 34
35 a d remove(b) a d 35
36 Remove method public boolean remove(item item) { int key = item.hashcode(); Node pred, curr; try { finally { curr.unlock(); pred.unlock(); Remove method public boolean remove(item item) { int key = item.hashcode(); Node pred, curr; try { finally { curr.unlock(); pred.unlock(); Key used to order node 36
37 Remove method public boolean remove(item item) { int key = item.hashcode(); Node pred, curr; try { finally { currnode.unlock(); prednode.unlock(); Predecessor and current nodes Remove method public boolean remove(item item) { int key = item.hashcode(); Node pred, curr; try { finally { curr.unlock(); pred.unlock(); Make sure locks released 37
38 Remove method public boolean remove(item item) { int key = item.hashcode(); Node pred, curr; try { finally { curr.unlock(); pred.unlock(); Everything else Remove method try { pred = this.head; pred.lock(); curr = pred.next; curr.lock(); finally { 38
39 Remove method lock pred == head try { pred = this.head; pred.lock(); curr = pred.next; curr.lock(); finally { Remove method try { pred = this.head; pred.lock(); curr = pred.next; curr.lock(); finally { Lock current 39
40 Remove method try { pred = this.head; pred.lock(); curr = pred.next; curr.lock(); finally { Traversing list Remove: searching while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; 40
41 Remove: searching while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; Search key range pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; Remove: searching while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; At start of each loop: curr and pred locked 41
42 Remove: searching while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); If return item false; found, remove node Remove: searching while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return If node false; found, remove it 42
43 Remove: searching Unlock predecessor while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; Remove: searching Only one node locked! while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; 43
44 Remove: searching while (curr.key <= key) { demote current if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; Remove: searching while (curr.key <= key) { if Find (item and == lock curr.item) new current { pred.next = curr.next; return true; pred.unlock(); pred = currnode; curr = curr.next; curr.lock(); return false; 44
45 Remove: searching while (curr.key <= key) { Lock if (item invariant == curr.item) restored { pred.next = curr.next; return true; pred.unlock(); pred = currnode; curr = curr.next; curr.lock(); return false; Remove: searching while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; Otherwise, not present pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; 45
46 Why does this work? To remove node e Must lock e Must lock e s predecessor Therefore, if you lock a node It can t be removed And neither can its successor remove() e linearizable while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; pred raggiungibile da head curr e pred.next curr.item appartiene 46
47 while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; Linearization point if item is present Why remove() is linearizable while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; Node locked, so no other thread can remove it. 47
48 while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; Item not present curr.lock(); return false; while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; pred.unlock(); pred = curr; curr = curr.next; pred reachable from head curr.lock(); curr is pred.next pred.key < key return false; key < curr.key 48
49 while (curr.key <= key) { if (item == curr.item) { pred.next = curr.next; return true; Linearization point pred.unlock(); pred = curr; curr = curr.next; curr.lock(); return false; Add e lock predecessor lock successor Inserzione 49
50 Tutto bene? Sicuramente meglio del lock globale Thread possono scorrere in parallelo Comportamento ideale? Catena di lock/unlock Potrebbe non essere efficiente Optimistic: scorrere senza fare Lock a b d e add(c) Aha! 50
51 Optimistic a b d e add(c) Optimistic c a b d e add(c)
52 Cosa potrebbe andare storto? a b d e add(c) Aha! Cosa potrebbe andare storto? a b d e add(c)
53 Cosa potrebbe andare storto? a b d e remove(b) 105 Cosa potrebbe andare storto? a b d e remove(b)
54 Cosa potrebbe andare storto? a b d e add(c) 107 Cosa potrebbe andare storto? c a b d e add(c)
55 Cosa potrebbe andare storto? a d e add(c) 109 a b d e add(c) b raggiungibile da head 55
56 Ancora problemi a b d e add(c) Aha! 111 Ancora problemi a b d e add(c) add(b ) 56
57 Ancora problemi a b d e add(c) b add(b ) 113 Ancora problemi a b d e add(c) b
58 Ancora problemi c a b d e add(c) 115 a b d e add(c) Verifica, b punta a d 58
59 Optimistic: Linearization Point a b d e add(c) c Validation private boolean validate(node pred, Node curry) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; 59
60 Validation private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; Predecessor & return false; current nodes private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Validation Begin at the beginning 60
61 Validation private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Search range of keys Validation private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Predecessor reachable 61
62 Validation private boolean validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Is current node next? Validation private boolean Otherwise move on validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; 62
63 Validation private boolean Predecessor not reachable validate(node pred, Node curr) { Node node = head; while (node.key <= pred.key) { if (node == pred) return pred.next == curr; node = node.next; return false; Remove: searching public boolean remove(item item) { int key = item.hashcode(); retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; 63
64 Remove: searching public boolean remove(item item) { int key = item.hashcode(); retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; Search key Remove: searching public boolean remove(item item) { int key = item.hashcode(); retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; Retry on synchronization conflict 64
65 Remove: searching public boolean remove(item item) { int key = item.hashcode(); retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; Examine predecessor and current nodes Remove: searching public boolean remove(item item) { int key = item.hashcode(); retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; Search by key 65
66 Remove: searching public boolean remove(item item) { int key = item.hashcode(); retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; Stop if we find item Remove: searching public boolean remove(item item) { int key Move = item.hashcode(); along retry: while (true) { Node pred = this.head; Node curr = pred.next; while (curr.key <= key) { if (item == curr.item) break; pred = curr; curr = curr.next; 66
67 Remove Method try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Remove Method try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; Always unlock finally { pred.unlock(); curr.unlock(); 67
68 Remove Method try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { Lock both nodes pred.unlock(); curr.unlock(); Remove Method try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { Check for synchronization return false; conflicts finally { pred.unlock(); curr.unlock(); 68
69 Remove Method try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); target found, remove node Remove Method try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.item == item) { pred.next = curr.next; return true; target not found else { return false; finally { pred.unlock(); curr.unlock(); 69
70 Valutazione Buona gestione dei lock Performance Concurrency Problemi Scorrere la lista due volte contains() comunque richiede lock remove() Scan list Lazy List Lock predecessor & current Logical delete Marcare il nodo come eliminato (!!!!) Physical delete Ridirezionare i puntatori 70
71 Lazy Removal a b c d Lazy Removal a b c d Present in list 71
72 Lazy Removal a b c d Logically deleted 143 Lazy Removal a b c d Physically deleted 72
73 Lazy Removal a b d Physically deleted a b c 73
74 a b c a b c 74
75 a b c remove(b) a b c a not marked 75
76 a b c a still points to b a b c Logical delete 76
77 a b c physical delete a b c 77
78 S(head) = Abstraction Map { x esiste a tale che a raggiungibile da head e a.item = x e aunmarked Invariant If not marked then item in the set and reachable from head and if not yet traversed it is reachable from pred 78
79 Validation private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr); List Validate Method private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr); Predecessor not Logically removed 79
80 List Validate Method private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr); Current not Logically removed List Validate Method private boolean validate(node pred, Node curr) { return!pred.marked &&!curr.marked && pred.next == curr); Predecessor still Points to current 80
81 Remove try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); curr.unlock(); Remove try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { Validate as before return false; finally { pred.unlock(); curr.unlock(); 81
82 Remove try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { Key found pred.unlock(); curr.unlock(); Remove try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); Logical remove curr.unlock(); 82
83 Remove try { pred.lock(); curr.lock(); if (validate(pred,curr) { if (curr.key == key) { curr.marked = true; pred.next = curr.next; return true; else { return false; finally { pred.unlock(); physical remove curr.unlock(); Contains public boolean contains(item item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; 83
84 Contains public boolean contains(item item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; Start at the head Contains public boolean contains(item item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; Search key range 84
85 Contains public boolean contains(item item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; Traverse without locking (nodes may have been removed) Contains public boolean contains(item item) { int key = item.hashcode(); Node curr = this.head; while (curr.key < key) { curr = curr.next; return curr.key == key &&!curr.marked; Present and undeleted? 85
86 Lock-free Lists Logical Removal a 0 b 0 c 10 e 0 Physical Removal Non basta 171 Problema Logical Removal a 0 b 0 c 10 e 0 Physical Removal d 0 Node added 86
87 Bit di marcatura e puntatori a 0 b 0 c 10 e 0 AtomicMarkableReference Logical Removal = Set Mark Bit d 0 AtomicMarkableReference Operazione atomica Modificare il puntatore Modificare la marcatura Remove (due passi) Operare sul mark bit del campo next Modificare il predecessor 87
88 In Java AtomicMarkableReference class Java.util.concurrent.atomic package Reference address F mark bit Extracting Reference & Mark Public Object get(boolean[] marked); 88
89 Extracting Reference & Mark Public Object get(boolean[] marked); Returns reference Returns mark at array index 0! Extracting Reference Only public boolean ismarked(); Value of mark 89
90 Changing State Public boolean compareandset( Object expectedref, Object updateref, boolean expectedmark, boolean updatemark); Changing State If this is the current reference Public boolean compareandset( Object expectedref, Object updateref, boolean expectedmark, boolean updatemark); And this is the current mark 90
91 Changing State then change to this new reference Public boolean compareandset( Object expectedref, Object updateref, boolean expectedmark, boolean updatemark); and this new mark Changing State public boolean attemptmark( Object expectedref, boolean updatemark); 91
92 Changing State public boolean attemptmark( Object expectedref, boolean updatemark); If this is the current reference Changing State public boolean attemptmark( Object expectedref, boolean updatemark);.. then change to this new mark. 92
93 To Lock or Not to Lock Locking vs. Non-blocking: visioni estreme La risposta: compinare blocking e non blocking Esempi: Lazy list :blocking add() eremove() con wait-free contains() 93
Linked Lists: Locking, Lock- Free, and Beyond. Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit
Linked Lists: Locking, Lock- Free, and Beyond Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Last Lecture: Spin-Locks CS. spin lock critical section Resets lock
More informationProgramming Paradigms for Concurrency Lecture 6 Synchronization of Concurrent Objects
Programming Paradigms for Concurrency Lecture 6 Synchronization of Concurrent Objects Based on companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Modified by Thomas
More informationLast Lecture: Spin-Locks
Linked Lists: Locking, Lock- Free, and Beyond Last Lecture: Spin-Locks. spin lock CS critical section Resets lock upon exit Today: Concurrent Objects Adding threads should not lower throughput Contention
More informationLinked Lists: Locking, Lock- Free, and Beyond. Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit
Linked Lists: Locking, Lock- Free, and Beyond Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Coarse-Grained Synchronization Each method locks the object Avoid
More informationCoarse-grained and fine-grained locking Niklas Fors
Coarse-grained and fine-grained locking Niklas Fors 2013-12-05 Slides borrowed from: http://cs.brown.edu/courses/cs176course_information.shtml Art of Multiprocessor Programming 1 Topics discussed Coarse-grained
More informationLinked Lists: Locking, Lock-Free, and Beyond. Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit
Linked Lists: Locking, Lock-Free, and Beyond Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Concurrent Objects Adding threads should not lower throughput Contention
More informationLocking Granularity. CS 475, Spring 2019 Concurrent & Distributed Systems. With material from Herlihy & Shavit, Art of Multiprocessor Programming
Locking Granularity CS 475, Spring 2019 Concurrent & Distributed Systems With material from Herlihy & Shavit, Art of Multiprocessor Programming Discussion: HW1 Part 4 addtolist(key1, newvalue) Thread 1
More informationConcurrency. Part 2, Chapter 10. Roger Wattenhofer. ETH Zurich Distributed Computing
Concurrency Part 2, Chapter 10 Roger Wattenhofer ETH Zurich Distributed Computing www.disco.ethz.ch Overview Concurrent Linked List Fine-grained synchronization Optimistic synchronization Lazy synchronization
More informationConcurrent Data Structures
Concurrent Data Structures Chapter 8 Roger Wattenhofer ETH Zurich Distributed Computing www.disco.ethz.ch Overview Concurrent Linked List Fine-grained synchronization Optimistic synchronization Lazy synchronization
More informationIntroduction to Concurrency and Multicore Programming. Slides adapted from Art of Multicore Programming by Herlihy and Shavit
Introduction to Concurrency and Multicore Programming Slides adapted from Art of Multicore Programming by Herlihy and Shavit Overview Introduction Mutual Exclusion Linearizability Concurrent Data Structure
More informationThe Art of Multiprocessor Programming Copyright 2007 Elsevier Inc. All rights reserved. October 3, 2007 DRAFT COPY
The Art of Multiprocessor Programming Copyright 2007 Elsevier Inc. All rights reserved Maurice Herlihy October 3, 2007 Nir Shavit 2 Contents 1 Introduction 13 1.1 Shared Objects and Synchronization..............
More informationNon-Blocking Synchronization
Herlihy Ch 9. Linked Lists: The Role of Locking Non-Blocking Synchronization BJÖRN A. JOHNSSON Overview? So far: Coarse- and fine-grained synchronization Optimistic synchronization Lazy synchronization
More informationLocking. Part 2, Chapter 7. Roger Wattenhofer. ETH Zurich Distributed Computing
Locking Part 2, Chapter 7 Roger Wattenhofer ETH Zurich Distributed Computing www.disco.ethz.ch Overview Introduction Spin Locks Test-and-Set & Test-and-Test-and-Set Backoff lock Queue locks Concurrent
More informationPractice: Small Systems Part 2, Chapter 3
Practice: Small Systems Part 2, Chapter 3 Roger Wattenhofer Overview Introduction Spin Locks Test and Set & Test and Test and Set Backoff lock Queue locks Concurrent Linked List Fine grained synchronization
More informationLinked Lists: The Role of Locking. Erez Petrank Technion
Linked Lists: The Role of Locking Erez Petrank Technion Why Data Structures? Concurrent Data Structures are building blocks Used as libraries Construction principles apply broadly This Lecture Designing
More informationParallel linked lists
Parallel linked lists Lecture 10 of TDA384/DIT391 (Principles of Conent Programming) Carlo A. Furia Chalmers University of Technology University of Gothenburg SP3 2017/2018 Today s menu The burden of locking
More informationAutomatic Creation of Define.xml for ADaM
Automatic Creation of Define.xml for ADaM Alessia Sacco, Statistical Programmer www.valos.it info@valos.it 1 Indice Define.xml Pinnacle 21 Community Valos ADaM Metadata 2 Define.xml Cos è: Case Report
More informationConcurrent Skip Lists. Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit
Concurrent Skip Lists Companion slides for The by Maurice Herlihy & Nir Shavit Set Object Interface Collection of elements No duplicates Methods add() a new element remove() an element contains() if element
More informationIntegrating Transactionally Boosted Data Structures with STM Frameworks: A Case Study on Set
Integrating Transactionally Boosted Data Structures with STM Frameworks: A Case Study on Set Ahmed Hassan Roberto Palmieri Binoy Ravindran Virginia Tech hassan84@vt.edu robertop@vt.edu binoy@vt.edu Abstract
More informationEsempio con Google Play tore Example with Google Play tore
Guida all installazione ed uso dell App VR Tour Camerata Picena Per installare l App occorre aprire lo Store del vostro smartphone (Play Store o App Store) e cercare l App con parola chiave Camerata Picena.
More informationFormal Verification of a Lazy Concurrent List-Based Set Algorithm
Formal Verification of a Lazy Concurrent List-Based Set Algorithm Robert Colvin 1, Lindsay Groves 2, Victor Luchangco 3, and Mark Moir 3 1 ARC Centre for Complex Systems, School of Information Technology
More informationHydraVM: Mohamed M. Saad Mohamed Mohamedin, and Binoy Ravindran. Hot Topics in Parallelism (HotPar '12), Berkeley, CA
HydraVM: Mohamed M. Saad Mohamed Mohamedin, and Binoy Ravindran Hot Topics in Parallelism (HotPar '12), Berkeley, CA Motivation & Objectives Background Architecture Program Reconstruction Implementation
More informationPROGRAMMAZIONE AVANZATA JAVA E C
PROGRAMMAZIONE AVANZATA JAVA E C Massimiliano Redolfi Lezione 10: multithreads, continue ThreadUtils public class ThreadUtils { public static void stop(executorservice executor) { executor.shutdown();
More informationGESTIONE DEL BACKGROUND. Programmazione Web 1
GESTIONE DEL BACKGROUND Programmazione Web 1 Background background-color opacity Immagini nel background background-image background-repeat background-posi:on background-a;achment Programmazione Web 2
More informationTecniche di Progettazione: Design Patterns
Tecniche di Progettazione: Design Patterns GoF: Decorator 1 Decorator Intent Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending
More informationProgrammi di utilità
Programmi di utilità La classe SystemData per il calcolo dei tempi e della occupazione di memoria Per calcolare i tempi e la occupazione di memoria è necessario interagire con il sistema operativo, questo
More informationSurfing Ada for ESP Part 2
Surfing Ada for ESP Part 2 C. Montangero Dipartimento d Informatica Corso di ESperienze di Programmazione a.a. 2012/13 1 Table of contents 2 CHAPTER 9: Packages Packages allow the programmer to define
More informationIstruzioni passo passo per creare qualsiasi CUSTOM AWARD con BBLogger How to create step by step any CUSTOM AWARD by BBLogger
Istruzioni passo passo per creare qualsiasi CUSTOM AWARD con BBLogger How to create step by step any CUSTOM AWARD by BBLogger Aprire l applicazione e con il mouse andare sul pulsante custom award e cliccarci
More informationDesign of Parallel and High-Performance Computing Fall 2015 Lecture: Locks and Lock-Free continued
Design of Parallel and High-Performance Computing Fall 2015 Lecture: Locks and Lock-Free continued Motivational video: https://www.youtube.com/watch?v=-7bpo1quxyw Instructor: Torsten Hoefler & Markus Püschel
More informationDistributed Computing Group
Distributed Computing Group HS 2009 Prof. Dr. Roger Wattenhofer, Thomas Locher, Remo Meier, Benjamin Sigg Assigned: December 11, 2009 Discussion: none Distributed Systems Theory exercise 6 1 ALock2 Have
More informationConcurrency in JavaFX. Tecniche di Programmazione A.A. 2014/2015
Concurrency in JavaFX Tecniche di Programmazione Summary 1. The problem 2. javafx.concurrent package 2 The problem Concurrency in JavaFX UI Responsiveness JavaFX is single threaded The JavaFX application
More informationDraft Rosen Multicast. Massimiliano Sbaraglia
Draft Rosen Multicast Massimiliano Sbaraglia MDT Draft Rosen layer 3 Multicast VPN Consiste in una VPN multicast con PIM (Protocol Indipendent Multicast) configurato sia all interno della VPN stessa che
More informationImplementazione Java di Alberi Binari. A.A. 16/17 DA1 - Andrea Pietracaprina 1
Implementazione Java di Alberi Binari A.A. 16/17 DA1 - Andrea Pietracaprina 1 Idea: struttura linkata Un nodo contiene Element Parent node Left child node Right child node B B A D A D C E C E A.A. 16/17
More informationMW MOC SUPPORTING AND TROUBLESHOOTING WINDOWS 10
MW10-3 - MOC 10982 - SUPPORTING AND TROUBLESHOOTING WINDOWS 10 Categoria: Windows 10 INFORMAZIONI SUL CORSO Durata: Categoria: Qualifica Istruttore: Dedicato a: Produttore: 5 Giorni Windows 10 Microsoft
More informationSolving Tridiagonal Systems on the T3E: a Message Passing RD algorithm.
Solving Tridiagonal Systems on the T3E: a Message Passing RD algorithm. A. Bevilacqua Dipartimento di Fisica, Università di Bologna INFN, Sezione di Bologna G. Spaletta Dipartimento di Matematica, Università
More informationAn Introduction to CP
An Introduction to CP CP = A technique to solve CSPs and COPs CSP = Constraint Satisfaction Problem COP = Constraint Optimization Problem It. Problema di Soddisfacimento/Ottimizzazione di/con Vincoli A
More informationMetodo di Holt-Winters M. Romito 7 dicembre 2016
Metodo di Holt-Winters M. Romito 7 dicembre 2016 Smorzamento esponenziale (SE) e smorzamento esponenziale con trend (SET) auto.data
More informationA Simple Optimistic skip-list Algorithm
A Simple Optimistic skip-list Algorithm Maurice Herlihy Brown University & Sun Microsystems Laboratories Yossi Lev Brown University & Sun Microsystems Laboratories yosef.lev@sun.com Victor Luchangco Sun
More informationDesign of Parallel and High-Performance Computing Fall 2017 Lecture: Locks (contd.) and Lock-Free
Design of Parallel and High-Performance Computing Fall 2017 Lecture: Locks (contd.) and Lock-Free Motivational video: https://www.youtube.com/watch?v=jhapqipqquw Instructor: Torsten Hoefler & Markus Püschel
More informationMonitors; Software Transactional Memory
Monitors; Software Transactional Memory Parallel and Distributed Computing Department of Computer Science and Engineering (DEI) Instituto Superior Técnico October 18, 2012 CPD (DEI / IST) Parallel and
More informationModern High-Performance Locking
Modern High-Performance Locking Nir Shavit Slides based in part on The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Locks (Mutual Exclusion) public interface Lock { public void lock();
More informationSerie Sistema scorrevoleve regolabile o fisso per armadi con ante interne. Adjustable or fixed sliding system for wardrobes with internal doors
Serie Sistema scorrevoleve regolabile o fisso per armadi con ante interne Adjustable or fixed sliding system for wardrobes with internal doors , 1 1 1, 4 1 1 11, 4 4 4 4 4 4 Posizione binari Rails position
More informationChapter 8: Deadlocks. The Deadlock Problem
Chapter 8: Deadlocks System Model Deadlock Characterization Methods for Handling Deadlocks Deadlock Prevention Deadlock Avoidance Deadlock Detection Recovery from Deadlock Combined Approach to Deadlock
More informationSAFE DESIGNED IN ITALY CASSEFORTI PER HOTEL HOTEL SAFES
DESIGNED IN ITALY CASSEFORTI PER HOTEL HOTEL S : I MODELLI : MODELS TOP OPEN DRAWER Innovativa tastiera touch e display led integrato nella porta New touch keypad and stealthy LED display L apertura dall
More informationLecture 7: Transactional Memory Intro. Topics: introduction to transactional memory, lazy implementation
Lecture 7: Transactional Memory Intro Topics: introduction to transactional memory, lazy implementation 1 Transactions New paradigm to simplify programming instead of lock-unlock, use transaction begin-end
More informationVHDL Packages. I Packages incapsulano elementi che possono essere condivisi tra più entity Un package consiste di due parti:
1 VHDL Packages I Packages incapsulano elementi che possono essere condivisi tra più entity Un package consiste di due parti: Declaration Dichiarazione di tutti gli elementi contenuti nel package Body
More informationA Concurrent Skip List Implementation with RTM and HLE
A Concurrent Skip List Implementation with RTM and HLE Fan Gao May 14, 2014 1 Background Semester Performed: Spring, 2014 Instructor: Maurice Herlihy The main idea of my project is to implement a skip
More informationMSQ3-8 - MOC UPDATING YOUR SQL SERVER SKILLS TO MICROSOFT SQL SERVER 2014
MSQ3-8 - MOC 10977 - UPDATING YOUR SQL SERVER SKILLS TO MICROSOFT SQL SERVER 2014 Categoria: SQL Server 2014 e 2012 INFORMAZIONI SUL CORSO Durata: Categoria: Qualifica Istruttore: Dedicato a: Produttore:
More informationTitle Description Participants Textbook
Podcast Ch21c Title: Hash Table Implementation Description: Overview of implementation; load factors; add() method; rehash() method; remove() method Participants: Barry Kurtz (instructor); John Helfert
More informationGeneral Insert Operation
General Insert Operation Inserting a new node before a node referenced by curr involves updating only adjacent links and does not affect the other elements in the sequence. General Insert Operation (continued)
More informationReagent Based Lock Free Concurrent Link List Spring 2012 Ancsa Hannak and Mitesh Jain April 28, 2012
Reagent Based Lock Free Concurrent Link List Spring 0 Ancsa Hannak and Mitesh Jain April 8, 0 Introduction The most commonly used implementation of synchronization is blocking algorithms. They utilize
More informationTecniche di Progettazione: Design Patterns
Tecniche di Progettazione: Design Patterns GoF: Decorator 1 An example 2 Your first idea of implementation 3 In reality 4 Now a beverage can be mixed from different condiment to form a new beverage 5 6
More informationClassical Planning: Limits
Classical Planning: Limits Spacecraft Domain Spacecraft Domain Extensions Time Resources Constraints Uncertainty Utility Model Temporal Interval Relations Interval Algebra (aka Allen Algebra) [Allen 83]
More informationLecture 21: Transactional Memory. Topics: consistency model recap, introduction to transactional memory
Lecture 21: Transactional Memory Topics: consistency model recap, introduction to transactional memory 1 Example Programs Initially, A = B = 0 P1 P2 A = 1 B = 1 if (B == 0) if (A == 0) critical section
More informationLaboratorio di Sistemi Software Design Patterns 2
TITLE Laboratorio di Sistemi Software Design Patterns 2 Luca Padovani (A-L) Riccardo Solmi (M-Z) 1 Indice degli argomenti Tipi di Design Patterns Creazionali, strutturali, comportamentali Design Patterns
More informationMEGA. Project number: IST GEM EyesWeb WK4 Tools software contributions to the MEGA SE. GEMWK4 Library, v
WP4/6 May 2001 MEGA Project number: IST-1999-20410 GEM EyesWeb WK4 Tools software contributions to the MEGA SE GEMWK4 Library, v. 1.0 http:www.generalmusic.com Contact: Carlo Drioli drioli@dei.unipd.it
More informationMW MOC INSTALLING AND CONFIGURING WINDOWS 10
MW10-4 - MOC 20698 - INSTALLING AND CONFIGURING WINDOWS 10 Categoria: Windows 10 INFORMAZIONI SUL CORSO Durata: Categoria: Qualifica Istruttore: Dedicato a: Produttore: 5 Giorni Windows 10 Microsoft Certified
More informationCS 310: Hash Table Collision Resolution Strategies
CS 310: Hash Table Collision Resolution Strategies Chris Kauffman Week 7-1 Logistics HW 2 Due Wednesday night Test Cases Final Questions for group discussion? Goals Today Midterm Exam Next Monday Review
More informationSAFE. DESIGNED in italy CASSEFORTI PER HOTEL HOTEL SAFES
SAFE DESIGNED in italy CASSEFORTI PER HOTEL HOTEL SAFES SAFE TOP OPEN SAFE DRAWER Innovativo sistema touch e display led integrato nella porta attivabile con tast New touch keypad and stealthy LED display,
More informationJava collections framework
Java collections framework Commonly reusable collection data structures Java Collections Framework (JCF) Collection an object that represents a group of objects Collection Framework A unified architecture
More informationRaccolta semiseria di errori comuni e stili di programmazione da evitare.
Lo Stupidario di Fondamenti 2 Raccolta semiseria di errori comuni e stili di programmazione da evitare. Daniele Paolo Scarpazza Politecnico di Milano Ultimo aggiornamento: 2004-03-03 Lo Stupidario di Fondamenti
More informationMonitors; Software Transactional Memory
Monitors; Software Transactional Memory Parallel and Distributed Computing Department of Computer Science and Engineering (DEI) Instituto Superior Técnico March 17, 2016 CPD (DEI / IST) Parallel and Distributed
More informationTecniche di Progettazione: Design Patterns
Tecniche di Progettazione: Design Patterns GoF: Decorator 1 2 3 4 Decorator Intent Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing
More informationHTML avanzato e HTML5 (per cominciare)
HTML avanzato e HTML5 (per cominciare) ugo.rinaldi@gmail.com Argomenti Nuovi elementi semantici Nuovi elementi per il form Tip & Tricks 2 Struttura del documento
More informationImplementazione Alberi Binari. mediante. Linked Structure ( 7.3.4)
Implementazione Alberi Binari mediante Linked Structure ( 7.3.4) 1 Implementazione di AlberoBinario Vedi testo pag. 290 B A D C E 2 1 Implementazione di AlberoBinario Position Tree extends BTPosition extends
More informationCompany Profile 2017
Company Profile 2017 Industrial integrated IoT Solution Provider Leading network attached storage provider Unique Electronic Manufacturing Service Intelligent Medical System Provider Leading Automation
More informationGAF Geography-informed Energy Conservation for Ad Hoc Routing
GAF Geography-informed Energy Conservation for Ad Hoc Routing Ya Xu, John Heidemann, Deborah Estrin USC/ISI, UCLA Energy? Node Density Node Redundancy in Ad Hoc Routing GAF: Geographic Adaptive Fidelity
More information# $ $ A.A. 2006/07 Tutor: Daniele Tiles &== %% & '( ) * + $, $ $ -' %./, $ * $ $ 7 5 &7 2$ $ $ 3&4&&& 5 +8$ 9%:
! A.A. 2006/07 Tutor: Daniele Tiles daniele.tiles@studio.unibo.it # $ $ %% & '( ) * + $, $ $ -' %./, 01 5 6 $ * $ $ 7 5 &7 2$ $ $ 3&4&&& 5 +8$ 9%: 5 6;< &&$ $ &== " 1&:+$? &7$ $ @$ 1&&# &A1+ $ $ $, $,
More informationSass: Syntactically Awesome Stylesheet. Laura Farinetti Dipartimento di Automatica e Informatica Politecnico di Torino
Sass: Syntactically Awesome Stylesheet Laura Farinetti Dipartimento di Automatica e Informatica Politecnico di Torino laura.farinetti@polito.it 1 Sass Syntactically Awesome Stylesheet Sass is an extension
More informationJavaFX Application Structure. Tecniche di Programmazione A.A. 2017/2018
JavaFX Application Structure Tecniche di Programmazione Application structure Introduction to JavaFX Empty JavaFX window public class Main extends Application { @Override public void start(stage stage)
More informationJava collections framework
Java collections framework Commonly reusable collection data structures Abstract Data Type ADTs store data and allow various operations on the data to access and change it ADTs are mathematical models
More informationCompilazione e assert GDB Valgrind. Guida al debugging. Luca Versari. Aprile 19, Luca Versari Guida al debugging
Aprile 19, 2017 Indice 1 Compilazione e assert 2 GDB 3 Valgrind Compilazione Compilazione standard $ gcc programma.c -o programma Compilazione con (quasi) tutti i warning $ gcc -O2 -Wall programma.c -o
More informationCORSO MOC10265: Developing Data Access Solutions with Microsoft. CEGEKA Education corsi di formazione professionale
CORSO MOC10265: Developing Data Access Solutions with Microsoft CEGEKA Education corsi di formazione professionale Developing Data Access Solutions with Microsoft In this course, experienced developers
More informationOptimistic Transactional Boosting
1 Optimistic ransactional Boosting Ahmed Hassan, Roberto Palmieri, Sebastiano Peluso, and Binoy Ravindran Abstract he last two decades witnessed the success of many efficient designs of concurrent data
More informationUguaglianza e Identità. (no, non avete sbagliato corso )
1 Uguaglianza e Identità (no, non avete sbagliato corso ) Fondamenti di Java Che vuol dire "uguaglianza"? Che vuol dire "Identità"? Class P class P { int x; int y; public String tostring() { return ("x="+x+"
More informationCORSO MOC10215: Implementing and Managing Microsoft Server Virtualization. CEGEKA Education corsi di formazione professionale
CORSO MOC10215: Implementing and Managing Microsoft Server Virtualization CEGEKA Education corsi di formazione professionale Implementing and Managing Microsoft Server Virtualization This five-day, instructor-led
More informationPfR Performance Routing. Massimiliano Sbaraglia
PfR Performance Routing Massimiliano Sbaraglia PfR advantage PfR abilita i processi di routing su base best path (non più su prefix-destination) basandosi su definite policy; PfR potenzia i tradizionali
More informationOn Developing Optimistic Transactional Lazy Set
On Developing Optimistic Transactional Set [Technical Report] Ahmed Hassan, Roberto Palmieri, Binoy Ravindran Virginia Tech {hassan84;robertop;binoy}@vt.edu Abstract. Transactional data structures with
More informationMWS3-3 - MOC NETWORKING WITH WINDOWS SERVER 2016
MWS3-3 - MOC 20741 - NETWORKING WITH WINDOWS SERVER 2016 Categoria: Windows Server 2016 INFORMAZIONI SUL CORSO Durata: Categoria: Qualifica Istruttore: Dedicato a: Produttore: 5,00000 Giorni Windows Server
More informationgoogle adwords guida F511591EE4389B71B65D236A6F16B219 Google Adwords Guida 1 / 6
Google Adwords Guida 1 / 6 2 / 6 3 / 6 Google Adwords Guida La tua guida a Google Ads Nozioni di base di Google Ads Creare annunci e campagne Scegliere dove e quando pubblicare gli annunci Come scoprire
More informationRecursive Objects. Singly Linked List (Part 2)
Recursive Objects Singly Linked List (Part 2) 1 Operations at the head of the list operations at the head of the list require special handling because there is no node before the head node 2 Adding to
More informationCampo Minato Nel Form1 sono presenti i seguenti componenti:
Campo Minato Nel Form1 sono presenti i seguenti componenti: menustrip1 panel1 picturebox1 label_livello panel2 menustrip1 button_unknown button_free button_fall button_quest button_expl button_bomb Il
More informationBinary trees. Binary Tree. A binary tree is a tree where each node has at most two children The two children are ordered ( left, right ) 4/23/2013
Binary trees Binary Tree A binary tree is a tree where each node has at most two children The two children are ordered ( left, right ) Right sub-tree vs. Left sub-tree 2 1 Balanced trees (Height-)balanced
More informationDesign and Evaluation of Scalable Software
Design and Evaluation of Scalable Software Damian Dechev 1,2 1: University of Central Florida, CSE S3 Lab, http://cse.eecs.ucf.edu Orlando, FL 2: Sandia Labs, Livermore, CA Traditional Scaling Process
More informationModel Driven Engineering : Basic Concepts
Model Driven Engineering : Basic Concepts Lesson 3 Model to Text Transformations : ACCELEO Guglielmo De Angelis CNR - IASI / ISTI guglielmo.deangelis@isti.cnr.it model transformation MMM model transformation
More informationCORSO MOC : Administering System Center Configuration Manager. CEGEKA Education corsi di formazione professionale
CORSO MOC20703-1: Administering System Center Configuration Manager CEGEKA Education corsi di formazione professionale Administering System Center Configuration Manager This five-day course describes how
More informationCornell University Computer Science 211 Second Preliminary Examination 18 April 2006
Cornell University Computer Science 211 Second Preliminary Examination 18 April 2006 There are 4 problems on this exam. It is 8 pages long, so make sure you have the whole exam. You will have 1 1 hours
More informationcornice vetro trasparente frame transparent glass
m mario nanni 99 corpo illuminante -proiettore da incasso carrabile per interni ed esterni in lega di alluminio peraluman con grado di protezione IP7 IK0 (0 joules). disponibile con vetro sabbiato o trasparente,
More informationHigher-order operators. Higher-order operators. Scala. Higher-order operators. Java8. numerosi operatori higher-order sulle collezioni
numerosi operatori higher-order sulle collezioni fold left /: fold right :\ filter partition find foreach takewhile dropwhile span (Splits into a prefix/suffix pair according to a predicate) forall exists
More informationChapter 3 Transport Layer
Chapter 3 Transport Layer Reti di Elaboratori Corso di Laurea in Informatica Università degli Studi di Roma La Sapienza Prof.ssa Chiara Petrioli Parte di queste slide sono state prese dal materiale associato
More informationConcurrent Data Structures Concurrent Algorithms 2016
Concurrent Data Structures Concurrent Algorithms 2016 Tudor David (based on slides by Vasileios Trigonakis) Tudor David 11.2016 1 Data Structures (DSs) Constructs for efficiently storing and retrieving
More informationCORSO MOC2810: Fundamentals of Network Security. CEGEKA Education corsi di formazione professionale
CORSO MOC2810: Fundamentals of Network Security CEGEKA Education corsi di formazione professionale Fundamentals of Network Security This four-day, instructor-led course provides students with the knowledge
More informationFabrizio Villa INAF / IASF Bologna
Fabrizio Villa INAF / IASF Bologna villa@iasfbo.inaf.it Directivity 54.09 dbi % DEP 0.29 FWHM 23.09 arcmin e 1.41 Spill-over 0.16% Legge di Snell Angolo di incidenza = angolo di riflessione Principio di
More informationCS 310: Hash Table Collision Resolution
CS 310: Hash Table Collision Resolution Chris Kauffman Week 7-1 Logistics Reading Weiss Ch 20: Hash Table Weiss Ch 6.7-8: Maps/Sets Goals Today Hash Functions Separate Chaining In Hash Tables Upcoming
More information6.852: Distributed Algorithms Fall, Class 20
6.852: Distributed Algorithms Fall, 2009 Class 20 Today s plan z z z Transactional Memory Reading: Herlihy-Shavit, Chapter 18 Guerraoui, Kapalka, Chapters 1-4 Next: z z z Asynchronous networks vs asynchronous
More informationBuilding Efficient Concurrent Graph Object through Composition of List-based Set
Building Efficient Concurrent Graph Object through Composition of List-based Set Sathya Peri Muktikanta Sa Nandini Singhal Department of Computer Science & Engineering Indian Institute of Technology Hyderabad
More informationChapter 9 Formattazione Input/Output
1 Chapter 9 Formattazione Input/Output 2 Flussi 9.2 Flussi Sequenze di caratteri organizzate in linee Ogni linea consiste di zero o più caratteri e finisce con il carattere newline Lo standard ANSI C deve
More informationProgrammazione lato server. Cookies e Sessioni. Applicazioni di Rete M. Ribaudo - DISI. Cookies
Programmazione lato server Cookies e Sessioni Cookies a cookie is a bit of text, containing some unique information, that web servers send in the HTTP header. The client s browser keeps a list of cookies
More informationLists. Problem. Store a set of unique words (duplicates shall be ignored) Class interface 4/23/2013. Arrays reloaded
Lists Arrays reloaded Problem Store a set of unique words (duplicates shall be ignored) Class interface public class WordSet { public Boolean add(string str); public void delete(string str); public void
More informationForm HTML FORM E PHP. Un insieme di elemen5 in una pagina web con cui l'utente interagisce per inviare informazioni ad uno script
HTML FORM E PHP 2014-2015 Programmazione Web 1 Form Un insieme di elemen5 in una pagina web con cui l'utente interagisce per inviare informazioni ad uno script Realizzazione di due cose la pagina contente
More information