Modern Concurrency Abstractions for C# Nick Benton Luca Cardelli Cédric Fournet Presenter: Henrik Kragh-Hansen September 27, 2007
Motivation for concurrency Forbedring af concurrency Baggrundsinformation Forfatterne Nick Benton, Luca Cardelli, og Cédric Fournet PhD i computer science Microsoft Research i Cambridge, UK Programming Principles and Tools gruppen 2/22
Motivation for concurrency Forbedring af concurrency Motivation for concurrency Concurrency har stor indflydelse på Opførelsen af programmet Selv assignments er ikke atomare Performance af programmet 3/22
Motivation for concurrency Forbedring af concurrency Motivation for concurrency Concurrent programmer er svære at: Designe Skrive Forstå Debugge Optimere 4/22
Motivation for concurrency Forbedring af concurrency Concurrency som en del af sproget Concurency er stadig ikke en del af mange sprog Er en samling af eksterne libraries De er ofte dårligt specificeret Hvis concurrency er en del af sproget: Kompileren kan analysere koden Producere bedre kode Kan advare programmøren om problemer 5/22
Motivation for concurrency Forbedring af concurrency Concurrency som en del af sproget Concurency er stadig ikke en del af mange sprog Er en samling af eksterne libraries De er ofte dårligt specificeret Hvis concurrency er en del af sproget: Kompileren kan analysere koden Producere bedre kode Kan advare programmøren om problemer 5/22
Motivation for concurrency Forbedring af concurrency Forbedring af concurrency Hvordan kan vi forbedre det? Monitors er blevet mere udbredt Svarer ca. til at tage lock på objekter ved metode kald Kommunikationen er blevet mere asynkron Skal håndtere asynkrone events: Uden nødvendigvis at blokere clienter i lange perioder Uden at resultere i deadlocks 6/22
Motivation for concurrency Forbedring af concurrency Polyphonic C# Abstraktion for asynkron programmering Høj niveau fra programmørens synspunkt Tilbyde lav niveau optimeringer fra kompileres synspunkt En udvidelse til C# 7/22
Oversigt Introduktion Motivation for concurrency Forbedring af concurrency 1 Introduktion 2 3 4 5 8/22
Asynkrone metoder Chords Eksempel Ændringer til C# Asynkrone metoder Asynkrone metoder Returnerer stort set med det samme Returnerer aldrig et resultat, eller kaster exception Erklæres med async i stedet for void Svarer til at sende en besked eller et event ref og out parametre må ikke bruges async postevent(eventinfo data){ //large method body 9/22
Asynkrone metoder Chords Eksempel Ændringer til C# Chords Chords Også kaldet synchonization pattern eller join pattern Metode deklarationer adskilt af & Højest en synkroniseret metode, resten skal være asynkrone Metode kroppen bliver først eksekveret når alle metoderne i headeren er kaldt 10/22
En simpel buffer Introduktion Asynkrone metoder Chords Eksempel Ændringer til C# class Buffer { string get() & async put(string s) { return s; 11/22
En simpel buffer Introduktion Asynkrone metoder Chords Eksempel Ændringer til C# class Buffer { string get() & async put(string s) { return s; An almindelig (synkroniseret) metode uden argumenter, returnerer en streng 11/22
Asynkrone metoder Chords Eksempel Ændringer til C# En simpel buffer class Buffer { string get() & async put(string s) { return s; An almindelig (synkroniseret) metode uden argumenter, returnerer en streng An asynkron metode, med en streng som argument 11/22
Asynkrone metoder Chords Eksempel Ændringer til C# En simpel buffer class Buffer { string get() & async put(string s) { return s; An almindelig (synkroniseret) metode uden argumenter, returnerer en streng An asynkron metode, med en streng som argument Bliver samlet i en chord 11/22
Asynkrone metoder Chords Eksempel Ændringer til C# En simpel buffer class Buffer { string get() & async put(string s) { return s; Kald til put() returnerer med det samme Kald til get() blokerer indtil/medmindre der er en tilsvarende put() Argumentet til put() returneres til den der kalder get() Det er uspecificeret hvilke par af put() og get() der bliver matched 12/22
Asynkrone metoder Chords Eksempel Ændringer til C# En simpel buffer class Buffer { string get() & async put(string s) { return s; Der laves ikke nye tråde Det er thread-safe Altid den synkroniserede metode der returnerer resultatet Kun en synkroniseret metode 13/22
Syntax ændringer Introduktion Asynkrone metoder Chords Eksempel Ændringer til C# return type ::= type void async. method-declaration erstattes med chord-declaration chord declaration ::= method header [& method header] body method header ::= attributes modifiers return type member name(formals). 14/22
Polyphonic C# C# Performance Producer and consumer eksempel i Polyphonic 15/22 public class PBB : Buffer { public PBB(int capacity) { free(capacity); public void Put(string s) & async free(int c){ if (c == 1) {full(); else {free(c 1) p(s); public string Get() & async p(string s) & async full(){ free(1); return s; public string Get() & async p(string s) & async free(int c){ free(c+1); return s;
Polyphonic C# C# Performance Producer and consumer eksempel i C# 16/22 public class LBB : Buffer { private Queue q = new Queue(); private int capacity; public LBB(int capacity) { this.capacity = capacity; public void Put(string s) { lock(this) { while (q.count == capacity) { Monitor.Wait(this); q.enqueue(s); Monitor.PulseAll(this); public string Get() { lock(this) { while (q.count == 0) { Monitor.Wait(this); string s = (string)(q.dequeue()); Monitor.PulseAll(this); return s;
Performance sammenligning Polyphonic C# C# Performance Bounded buffer size = 100 Operations per second (thousands) Single-processor Benchmark polyphonic Standard C# 1 producer, 1 consumer 682 115 2 producers, 2 consumers 423 118 Dual-processor Benchmark polyphonic Standard C# 1 producer, 1 consumer 288 250 2 producers, 2 consumers 125 42 17/22
En simpel Cell klasse Introduktion Cell klasse Reader Writer 18/22 public class OneCell { public OneCell() { empty(); public void Put(object o) & private async empty() { contains(o); public object Get() & private async contains(object o) { empty(); return o;
Cell klasse Reader Writer Reader Writer eksempel class ReaderWriter { ReaderWriter() {idle(); public void Shared() & async idle() {s(1); public void Shared() & async s(int n) {s(n + 1); public void ReleaseShared() & async s(int n) { if (n == 1) idle(); else s(n 1); public void Exclusive() & async idle() { public void ReleaseExclusive() { idle(); Forskellige tilstande idle() s(1) s(2) s(3)... 19/22
Forbedringer til concurrency? Polyphonic C# s bidrag til programmerings sprog? Inddrager tråd programmering som en central del af sproget Gør det lettere at programmere trådet Ideerne er senere blevet viderført i Cω C ω er et research programmerings sprog hos microsoft 20/22
Min vurdering af artiklen Gode ting Masser af kode eksempler En anderledes måde at kode trådet Dårlige ting Savner nogle figurer Først sammenligninger med standard tilsidst Hvorfor er det bedre/nemmere? Generelt mangler der motivation i kode eksemplerne 21/22
Min vurdering af artiklen Gode ting Masser af kode eksempler En anderledes måde at kode trådet Dårlige ting Savner nogle figurer Først sammenligninger med standard tilsidst Hvorfor er det bedre/nemmere? Generelt mangler der motivation i kode eksemplerne 21/22
Tak for jeres opmærksomhed Spørgsmål? 22/22