Föreläsning 15: Parallella subrutiner Parallellitet Varför parallella

Föreläsning 15: Parallella subrutiner
• Parallellitet
• Processer och trådar
• Semaforer, monitorer och synkroniseringsmeddelanden
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
1
Parallellitet
Ofta är det nödvändigt eller önskvärt att programdelar
exekveras parallellt (jämlöpande, eng. concurrently).
Det kan handla om
• fysisk parallellitet – två eller fler processorer används
• logisk parallellitet – konceptuell parallellitet som fysiskt
kan vara sekventiell ("interleaving")
Nivåer på vilka parallellitet kan förekomma är
• instruktionsnivå – maskininstruktioner exekveras parallellt
• satsnivå – enstaka programsatser exekveras parallellt
• underprogramnivå – underprogram exekveras parallellt
• programnivå – flera program exekveras parallellt
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
2
Varför parallella underprogram?
• De är "naturliga"
Ofta avbildar program den parallella realiteten (t.ex.
reaktiva system, simuleringsprogram, osv.)
• De ger bättre möjligheter att utnyttja datorn
Om datorn har flera processorer utnyttjas de på det viset
som programmet tjänar mest på
• De behövs i många interaktiva system
Om något komplext beräknas behöver inte användaren
vänta utan kan jobba på eller eventuellt ingripa
⇒ Lämpliga begrepp i språket behövs
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
3
1
Processer och trådar
Exekveringen av ett parallellt program består av flera
kontrollflöden som kallas trådar (eng. threads). En process
(eng. ofta "task"=uppgift) är en enhet som kan exekveras
parallellt med andra och som kontrollerar en tråd.
Synkronisering behövs för att bearbeta gemensamma data
• synkronisering garanterar att sats S av tråd T exekveras före
eller efter sats S´ av tråd T´
• tävlande synkronisering (eng. competition synchronization)
förekommer om en resurs (t.ex. skrivare) inte kan delas
(mutual exclusion); turordningen är oviktig
• samarbetande synkronisering (eng. cooperation synchronization) förekommer vid gemensamma mål; turordningen är viktig
(ex: producer-consumer)
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
4
Processer
• En ”scheduler” fördelar processer på processorer
• ”Heavyweight” eller ”lightweight” processer
• Möjliga tillstånd:
 Nyskapad
 Ready
 Running
 Blockerad
 Död
• Möjliga problem
 Deadlock
 Utsvältning (=> Fair scheduling)
 Icke-determinism
 Hastighetsberoende (realtid)
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
5
Semaforer
En semafor (Dijkstra 1965) är en datastruktur med två
atomära operationer wait och release. Ofta omger de kod
som ska synkroniseras.
En semafor har en räknare (kapacitet) ≥ 0 och en
väntekö (initialt tom) för blockerade processer
Om en process P exekverar wait(s)…
 och semaforens kapacitet är > 0 minskas den med 1
 annars ställs P i semaforens väntekö
Om en process P exekverar release(s)…
 och väntekön är tom ökas dess kapacitet med 1
 annars får första processen i väntekön fortsätta (och
givetvis tas den bort från kön)
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
6
2
Semaforer
• Semaforoperationerna måste vara odelbara!
• Programmerarens ansvar att semaforen kontrollerar
resursen som avsett. Lätt att göra fel!
• Initialvärde =1 => mutual exclusion (binär semafor)
Exempel: buffert med plats för ett värde
nonempty := 0; nonfull:= 1
producer:
consumer:
wait(nonfull)
wait (nonempty)
lägg in data
hämta data
release(nonempty)
release (nonfull)
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
7
Semaforer
• Om flera semaforer ; ordningen viktig!
nonempty := 0; free:= N; access:=1
producer:
wait(free)
wait(access)
lägg in data
release(access)
release(nonempty)
consumer:
wait (nonempty)
wait(access)
hämta data
release (access)
release (free)
• Omkastad ordning mellan t ex wait(access) och
wait(nonempty) kan leda till deadlock
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
8
Monitorer
En monitor inkapslar datastrukturer och
operationerna som ger access till dem. (ADT!)
Endast en process i taget får tillträde till monitorn.
För att möjliggöra samarbetande synkronisering finns det
en datatyp queue vars operationer delay och continue
endast kan exekveras i en monitor.
• Om delay(q) exekveras blockerar processen. Den ställs i
kön q och andra processer får tillträde till monitoren.
• Om continue(q) exekveras släpper processen monitorn
och första processen som väntar i q får fortsätta (om en
sådan finns).
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
9
3
Synkroniseringsmeddelanden
I Ada kan processer skicka och ta emot synkroniseringsmeddelanden. Om både sändaren och mottagaren är
beredda sker ett rendezvous, annars väntar den ena.
• accept xyz(<parametrar>) <body> betyder
"vänta tills någon process P skickar meddelandet xyz
och exekvera <body> sedan, medan P är blockerad"
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
10
Rendezvous Time Lines
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
11
Synkroniseringsmeddelanden
• Icke deterministiskt urval sker med select-strukturen:
select
when <villkor> => accept abc(…) …
or when <villkor> => accept xyz(…) …
…
end select
• En task deklarerar anropbara ”entry points” som den
accepterar anrop till. Andra tasks kan anropa dem.
(Se exempel, avsnitt 13.5.5)
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
12
4
Jämförelse
• Semaforer är primitiva och flexibla, känsliga för fel,
problemet är att olika programdelar måste samarbeta
på mycket låg nivå.
• Monitorer liknar ADT:er och har liknande fördelar men
samarbetande synkronisering förblir komplicerad.
• Synkroniseringsmeddelanden är enklare och flexiblare
än monitorer, men minst lika strukturerade. De passar
dessutom bra till distribuerade system.
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
13
Parallellitet på satsnivå
• High Performance Fortran
Distribuerar data på flera processorer som exekverar
samma kod, SIMD
• Funktionella språk, ingen inbyggd sekvensialitet, olika
typer av parallellism möjliga. Inga sidoeffekter, endast
databeroende styr exekveringsordningen.
Deluttryck kan evalueras i godtycklig ordning, även
parallellt (Church-Rosser!)
Inga nya språkonstruktioner nödvändiga (i princip),
implicit parallellism
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
14
Undantagshantering
• Ett program som inte klarar av händelser som avviker från
det normalt förväntade (exceptions ) är inte robust .
• Önskvärt att i programmet
- kunna specificera vad som ska göras när vissa
”undantag” uppträder (hantera u.)
- kunna skilja detta från huvudalgoritmen
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
15
5
Undantagshantering (forts)
• Centrala frågor:
 Hur deklararar man ett undantag? Vilken räckvidd har det?
 Kan ett undantag ha parametrar?
 Hur aktiveras ett undantag?
 Hur binds ett aktiverat undantag till en hanterare?
 Hur definierar vi de enheter som ska hantera ett
aktiverat undantag?
 Var fortsätter exekveringen efter hanteringsrutinens slut?
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
16
Ett exempel: exceptions i Ada
• Inbyggda + användardefinierade undantag
• Hanterare kan knytas till ett block / underprogram /
paket / task
• Undantag kan ej ha parametrar
• När ett undantag aktiveras avslutas enheten,
kontrollen går till hanteraren
• Om ingen hanterare finns propageras undantaget till
omslutande paket / anropande underprogram.
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
17
Ada, exempel
procedure P is
BAD_FORMAT: exception;
procedure Q is
begin
…
if S/=’ ’ then raise BAD_FORMAT; end if
…
end Q
procedure R is
begin
Q;
exception when BAD_FORMAT=>handler body 1
end R
begin
R;
Q;
exception when BAD_FORMAT=>handler body 2
end P;
2 0 0 5 -1 0 -1 4
Lennart Edb lom , Inst. f.
datavetenskap
18
6