Parallel Flashcards

1
Q
A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Skriv ett program i Go som skapar en goroutine som skriver ut en text på skärmen

A

```go
package main
import (“fmt”)
func main() {
go func() { fmt.Println(“Hej”) }()
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Skriv ett program i Go som läser ett värde från en kanal och skriver ut det på skärmen

A

```go
package main
import (“fmt”)
func main() {
ch := make(chan string)
go func() { ch <- “Hej” }()
fmt.Println(<-ch)
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Var är GIL i Python och hur påverkar det trådade program i Python?

A

GIL (Global Interpreter Lock) finns i Python och förhindrar flera trådar från att köra Python-kod samtidigt, vilket begränsar parallell prestanda.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Skriv ett program i Go som kan ge upphov till ett data race

A

```go
package main
import (“fmt”)
func main() {
var x int
go func() { x++ }()
go func() { x++ }()
fmt.Println(x)
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Implementera Peterson’s algorithm i Go-liknande kod.

A

```go
var flag [2]bool
var turn int
func enterCriticalSection(id int) {
flag[id] = true
turn = 1 - id
for flag[1-id] && turn == 1-id {}
}
func leaveCriticalSection(id int) {
flag[id] = false
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Implementera en producent i Go-liknande kod som använder mutex för ömesidig uteslutning

A

```go
var mu sync.Mutex
func producer(data *int) {
mu.Lock()
*data++
mu.Unlock()
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Implementera en producent i Go-liknande kod som använder kanaler för ömesidig uteslutning

A

```go
func producer(ch chan int) {
ch <- 1
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Ge ett exempel i Go där två goroutines delar en variabel och använder en mutex för att (korrekt) skydda tillgången

A

```go
package main
import (“sync”)
func main() {
var x int
var mu sync.Mutex
go func() {
mu.Lock()
x++
mu.Unlock()
}()
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Ge ett exempel på ett program i Go med kanaler som kan leda till deadlock

A

```go
package main
func main() {
ch := make(chan int)
ch <- 1
<-ch
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Ge ett exempel på ett program i Go utan kanaler som kan leda till deadlock

A

```go
package main
import (“sync”)
func main() {
var mu sync.Mutex
mu.Lock()
mu.Lock()
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Implementera en parallel prefix sum med goroutines i Go

A

```go
func prefixSum(arr []int) []int {
for i := 1; i < len(arr); i++ {
arr[i] += arr[i-1]
}
return arr
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Implementera en parallel prefix scan med goroutines i Go

A

```go
func prefixScan(arr []int) []int {
for i := 1; i < len(arr); i++ {
arr[i] += arr[i-1]
}
return arr
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Implementera en parallel odd-even transposition sort med goroutines i Go

A

```go
func oddEvenSort(arr []int) {
sorted := false
for !sorted {
sorted = true
for i := 1; i < len(arr)-1; i += 2 {
if arr[i] > arr[i+1] {
arr[i], arr[i+1] = arr[i+1], arr[i]
sorted = false
}
}
for i := 0; i < len(arr)-1; i += 2 {
if arr[i] > arr[i+1] {
arr[i], arr[i+1] = arr[i+1], arr[i]
sorted = false
}
}
}
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Visa hur en for-loop kan paralleliseras i Go med goroutines

A

```go
package main
import (“sync”)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
println(i)
}(i)
}
wg.Wait()
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Hur kan en barrier implementeras med mutex? Visa i Go-liknande kod

A

```go
var mu sync.Mutex
var count int
func barrier() {
mu.Lock()
count++
mu.Unlock()
for count < N {}
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Hur kan en barrier implementeras med kanaler? Visa i Go-liknande kod

A

```go
func barrier(ch chan int, N int) {
ch <- 1
if len(ch) == N {
close(ch)
}
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Ge en concurrent/parallel algoritm för att hitta den minsta värdet i en lista i Go-liknande kod

A

```go
func findMin(arr []int) int {
min := arr[0]
for _, v := range arr {
if v < min {
min = v
}
}
return min
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Vad innebär en atomär variabel i Go

A

En atomär variabel är en variabel som kan ändras utan risk för data race, tack vare atomära operationer.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Visa hur en variabels värde kan jämföras och bytas atomärt i Go

A

```go
import “sync/atomic”
var x int32
atomic.CompareAndSwapInt32(&x, 0, 1)
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Förklara vad happens before i en minnesmodell

A

Happens before är en relation som garanterar att en operation utförs före en annan i en flertrådad miljö.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Vilka antaganden kan göras om två trådar modifierar en delad variabel (enligt Javas minnesmodell)

A

Inga antaganden kan göras utan synkronisering, eftersom det kan leda till data race.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Förklara begreppet multicore cpu

A

En multicore CPU har flera processorkärnor som kan köra flera trådar samtidigt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Vad är skillnaden mellan concurrency och parallelism?

A

Concurrency är att hantera flera uppgifter samtidigt, medan parallelism är att utföra flera uppgifter samtidigt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Vad betyder det att ett problem är embarrassingly parallel?
Ett problem är embarrassingly parallel om det enkelt kan delas upp i mindre delar som kan köras parallellt.
26
Ge exempel på ett problem som är embarrassingly parallel
Beräkning av pi med Monte Carlo-metoden.
27
Förklara begreppet operativsystem
Ett operativsystem är en mjukvara som hanterar hårdvaruresurser och tillhandahåller tjänster till program.
28
Vad betyder det att ett operativsystem kan ses som ett interface mot datorn?
Det betyder att operativsystemet tillhandahåller ett gränssnitt för program att interagera med hårdvaran.
29
Vad betyder det att ett operativsystem kan ses som ett kontrollsystem för datorn?
Det betyder att operativsystemet styr och övervakar hårdvarans resurser och processer.
30
Vad är skillnaden på system mode och user mode?
System mode har full tillgång till hårdvaran, medan user mode har begränsad tillgång.
31
Ange fem tillstånd en process kan befinna sig i och förklara vad de innebär
1. New: Processen skapas. 2. Ready: Processen är redo att köras. 3. Running: Processen körs. 4. Waiting: Processen väntar på en händelse. 5. Terminated: Processen avslutas.
32
Förklara begreppen stack, heap, data och text i relation till processer
Stack: Lokala variabler. Heap: Dynamiskt allokerat minne. Data: Globala och statiska variabler. Text: Programkod.
33
Vad lagras i ett processkontrollblock (PCB)?
Processens tillstånd, programräknare, register, minnesinformation och resurser.
34
Vad är en context switch?
En context switch är när operativsystemet byter från en process till en annan.
35
Förklara vad som händer under en context switch
Operativsystemet sparar tillståndet för den aktuella processen och laddar tillståndet för nästa process.
36
Vad innebär schemaläggning av en process?
Schemaläggning är att bestämma vilken process som ska köras näst.
37
När tas beslut om schemaläggning?
Beslut tas när en process avslutas, blir blockerad eller när ett tidsintervall (quantum) tar slut.
38
Vad gör dispatcher?
Dispatcher ansvarar för att ladda processen som ska köras näst och starta den.
39
Ange tre kriterier som kan användas för att bestämma vilken schemaläggningsalgoritm som skall användas
1. Genomsnittlig väntetid. 2. CPU-utnyttjande. 3. Responsivitet.
40
Vad betyder det att en process är I/O bound?
Processen spenderar mer tid på I/O-operationer än på CPU-beräkningar.
41
Vad betyder det att en process är CPU bound?
Processen spenderar mer tid på CPU-beräkningar än på I/O-operationer.
42
Förklara hur schemaläggning sker om First Come, First Served används
Processer körs i den ordning de anländer, utan avbrott.
43
Förklara hur schemaläggning sker om Round Robin används
Varje process får ett tidsintervall (quantum) att köra, och processerna roterar.
44
Förklara preemptive schemaläggning
Operativsystemet kan avbryta en process och ge CPU:n till en annan process.
45
Förklara non-preemptive schemaläggning
En process behåller CPU:n tills den avslutas eller blir blockerad.
46
Vad är ett quantum?
Ett quantum är det tidsintervall en process får köra i Round Robin-schemaläggning.
47
Hur påverkar ett quantum schemaläggningen?
Ett kort quantum ger bättre responsivitet men högre overhead, och vice versa.
48
Vad är viktigt att tänka på när man bestämmer quantum?
Balansera responsivitet och overhead.
49
Förklara begreppen isolation och encapsulation i relation till processer
Isolation: Processer är skyddade från varandra. Encapsulation: Processens interna tillstånd är dolt.
50
Vad är skillnaden på en process och en tråd?
En process har sitt eget minnesutrymme, medan trådar delar minne inom samma process.
51
Vad används stacken till i en tråd?
Stacken används för att lagra lokala variabler och funktionsanrop.
52
Var är skillnaden på user-level- och kernel-level-trådar?
User-level-trådar hanteras av användarprogram, medan kernel-level-trådar hanteras av operativsystemet.
53
Förklara begreppet blockerande anrop
Ett anrop som förhindrar att tråden fortsätter köra tills en händelse inträffar.
54
Vad händer om en user-level tråd gör ett blockerande anrop?
Hela processen blockeras eftersom operativsystemet inte känner till tråden.
55
Vad händer om en kernel-level tråd gör ett blockerande anrop?
Endast den tråden blockeras, och andra trådar kan fortsätta köra.
56
Varför vill man dela minne mellan trådar?
För att underlätta kommunikation och dela resurser effektivt.
57
Vad är skillnaden mellan att dela minne mellan trådar och processer?
Trådar delar minne automatiskt, medan processer kräver explicita mekanismer som delat minne.
58
Förklara begreppet sequentially consistent i relation till minne
Sequentially consistent innebär att resultatet av körningen är detsamma som om operationerna utförts i sekventiell ordning.
59
Vad innebär ett data race/race condition?
Ett data race uppstår när två eller flera trådar samtidigt försöker komma åt och modifiera samma data utan synkronisering.
60
Vad är en kritisk sektion?
En del av koden där delade resurser åtkommas och modifieras, och som måste skyddas mot samtidig åtkomst.
61
Ge exempel på ett data race
```go var x int func increment() { x++ } go increment() go increment() ```
62
Vad innebär ömesidig uteslutning?
Endast en tråd får åtkomst till en kritisk sektion åt gången.
63
Hur kan ömesidig uteslutning lösas? ge exempel.
Med mutex: ```go var mu sync.Mutex mu.Lock() // Kritisk sektion mu.Unlock() ```
64
Förklara hur strict alteration försöker lösa ömesidig uteslutning. Vilka problem finns?
Strict alteration använder en turordning, men kan leda till busy waiting och låsningar.
65
Förklara Peterson’s algoritm för ömsesidig uteslutning
Peterson’s algoritm använder två variabler, `flag` och `turn`, för att garantera ömsesidig uteslutning.
66
Vad innebär progression i relation till ömesidig uteslutning?
Progression innebär att en tråd som försöker komma in i en kritisk sektion så småningom kommer in.
67
Vad innebär begränsad väntan i relation till ömesidig uteslutning?
Begränsad väntan innebär att en tråd inte behöver vänta oändligt länge.
68
Vad är Peterson’s algoritm?
Peterson’s algoritm använder två variabler, `flag` och `turn`, för att garantera ömsesidig uteslutning.
69
Vad innebär begränsad väntan i relation till ömesidig uteslutning?
Begränsad väntan innebär att en tråd inte behöver vänta oändligt länge för att komma in i en kritisk sektion.
70
Vad är en semafor?
En semafor är en synkroniseringsmekanism som används för att kontrollera åtkomst till en resurs.
71
Vad är ett mutex lock?
Ett mutex lock är en typ av lås som tillåter endast en tråd åtkomst till en resurs åt gången.
72
Vad är skillnaden mellan en binär och en räknande semafor?
En binär semafor har två tillstånd (låst/olåst), medan en räknande semafor kan ha flera tillstånd.
73
Visa hur en räknande semafor kan implementeras med hjälp av binära semaforer
```go var sem = make(chan struct{}, N) func P() { sem <- struct{}{} } func V() { <-sem } ```
74
Vilka risker finns det med låsning?
Risker inkluderar deadlock, livelock och prestandaförsämring.
75
Vad är ett deadlock?
Deadlock är när två eller flera trådar väntar på varandra för att släppa resurser, och ingen kan fortsätta.
76
Vad innebär det att en process är deadlocked?
Processen kan inte fortsätta eftersom den väntar på en resurs som aldrig kommer att bli tillgänglig.
77
Vilka fyra villkor krävs för deadlock?
1. Mutual exclusion. 2. Hold and wait. 3. No preemption. 4. Circular wait.
78
Förklara hold and wait
En process håller en resurs och väntar på en annan resurs som hålls av en annan process.
79
Förklara no preemption
Resurser kan inte tas bort från en process utan dess medgivande.
80
Förklara circular wait
En cirkulär kedja av processer där varje process väntar på en resurs som hålls av nästa process i kedjan.
81
Förklara hur deadlock kan förhindras
Bryt minst ett av de fyra villkoren för deadlock.
82
Hur kan mutual exclusion förhindras för att undvika deadlock?
Använd resurser som inte kräver ömsesidig uteslutning.
83
Hur kan hold and wait förhindras för att undvika deadlock?
Kräv att en process begär alla resurser på en gång.
84
Hur kan no preemption förhindras för att undvika deadlock?
Tillåt att resurser tas bort från processer.
85
Hur kan circular wait förhindras för att undvika deadlock?
Använd en global ordning för att begära resurser.
86
Ge exempel på hur en semafor kan användas så att hold and wait inte gäller
```go var sem = make(chan struct{}, 1) func P() { sem <- struct{}{} } func V() { <-sem } ```
87
Varför kan det vara problematiskt att förhindra no preemption?
Det kan leda till att processer avbryts mitt i kritiska operationer.
88
Varför kan det vara problematiskt att förhindra hold and wait?
Det kan leda till ineffektiv resursanvändning och låsningar.
89
Förklara starvation. Varför är det ett problem?
Starvation är när en process inte får tillgång till resurser den behöver, vilket kan leda till att den aldrig slutförs.
90
Vad är en resource allocation graph och hur används den i samband med deadlock?
En graf som visar resurser och processer, och används för att upptäcka deadlock.
91
Hur kan man avgöra om ett system är i deadlock med hjälp av en resource allocation graph?
Sök efter cykler i grafen.
92
Är det ok att ignorera deadlock?
Ibland, om sannolikheten för deadlock är låg och kostnaden för att hantera den är hög.
93
Vad är skillnaden på att förhindra och undvika deadlock?
Förhindra: Bryt villkoren för deadlock. Undvika: Använd algoritmer för att undvika deadlock.
94
Förklara Banker’s algoritm
Banker’s algoritm används för att undvika deadlock genom att säkerställa att resursallokering är säker.
95
Hur kan ett system återhämta sig från deadlock?
Genom att avbryta processer eller ta bort resurser från processer.
96
Förklara prefix sum
Prefix sum är en beräkning där varje element i en lista ersätts med summan av alla tidigare element.
97
Förklara prefix scan
Prefix scan är en variant av prefix sum där varje element innehåller summan av alla tidigare element.
98
Förklara odd-even transposition sort
En sorteringsalgoritm som jämför och byter plats på element i par (udda-jämna) tills listan är sorterad.
99
Varför är det en dålig idé att skapa nya trådar för varje rekursivt anrop i en divide and conquer-algoritm?
Det kan leda till ett stort antal trådar och hög overhead.
100
Varför kan det vara svårt att parallelisera rekursiva algoritmer?
Rekursiva algoritmer har ofta beroenden mellan anrop som gör parallellisering svårt.
101
Vad är en barrier?
En barrier är en synkroniseringspunkt där trådar väntar tills alla har nått punkten.
102
Hur kan en semafor användas för att signalera mellan trådar?
```go var sem = make(chan struct{}, 1) func signal() { sem <- struct{}{} } func wait() { <-sem } ```
103
Förklara hur depth-first search kan paralleliseras med trådar
Varje tråd kan utforska en gren av trädet parallellt.
104
Förklara hur breadth-first search kan paralleliseras med trådar
Varje nivå i trädet kan utforskas parallellt av olika trådar.
105
Förklara hur Prim’s algoritm kan paralleliseras med trådar
Varje tråd kan hantera en del av grafen och hitta minimala kanter parallellt.
106
Vi kan hitta det minsta värdet i en lista på linjär tid (𝑂(𝑁 )). Hur lång tid tar det att köra med 𝑃 processorer? Motivera.
Tiden blir 𝑂(𝑁/𝑃), eftersom varje processor kan hantera en del av listan.
107
Vad krävs för att vi skall erhålla en speedup på 𝑃 med en algoritm som körs på 𝑃 processorer?
Algoritmen måste vara perfekt parallelliserbar utan beroenden.
108
Är det alltid snabbare att parallelisera en algoritm och köra den på så många processorer som möjligt? Motivera.
Nej, overhead och beroenden kan minska prestandan.
109
Förklara N-ary-sökning.
N-ary-sökning delar upp sökningen i N delar och söker parallellt.
110
Förklara hur N-ary-sökning kan paralleliseras med trådar
Varje tråd söker i en del av intervallet parallellt.
111
Förklara lock free
Lock free innebär att algoritmer inte använder lås för synkronisering, utan istället atomära operationer.
112
Förklara wait free
Wait free innebär att varje tråd garanteras att slutföra sin operation inom ett begränsat antal steg.
113
Vad menas med en optimistisk algoritm (med avseende på ömesidig uteslutning)?
En algoritm som antar att konflikter är sällsynta och hanterar dem vid behov.
114
Förklara compare and set
En atomär operation som jämför och uppdaterar ett värde endast om det inte har ändrats.
115
Visa hur compare and set kan användas för att implementera en binär semafor
```go var sem int32 func P() { for !atomic.CompareAndSwapInt32(&sem, 0, 1) {} } func V() { atomic.StoreInt32(&sem, 0) } ```
116
Förklara hand over hand locking
En teknik där lås tas och släpps stegvis när man traverserar en datastruktur.
117
Vad är nackdelarna med att låsa “för mycket”?
Det kan leda till låsningar och minskad parallellitet.
118
Vad är nackdelarna med att låsa “för lite”?
Det kan leda till data race och inkonsekventa tillstånd.
119
Vad är fördelarna med en optimistisk algoritm (med avseende på låsning)?
Mindre overhead och bättre parallellitet när konflikter är sällsynta.
120
Vad är nackdelarna med en optimistisk algoritm (med avseende på låsning)?
Kan leda till att operationer måste göras om vid konflikter.
121
Förklara hur radering i en länkad lista kan implementeras med en optimistisk algoritm
Använd compare and set för att säkerställa att noden inte har ändrats under raderingen.
122
Ange några problem med att skriva flertrådade program
Data race, deadlock, och svårigheter att felsöka.
123
Varför kan det vara svårt att sätta samman (compose) flera flertrådade funktioner?
Beroenden och synkronisering mellan funktioner kan vara komplexa.
124
Vad är en Future?
En Future representerar ett resultat som kommer att vara tillgängligt i framtiden.
125
Förklara begreppet coroutine
En coroutine är en funktion som kan pausas och återupptas, och som kan köras samtidigt med andra coroutines.
126
Förklara begreppet cooperative multitasking
Cooperative multitasking är när trådar själva avgör när de ska släppa CPU:n.
127
Förklara begreppet asynchronous programming
Asynkron programmering innebär att operationer kan köras utan att blockera huvudtråden.
128
Förklara begreppet callback
En callback är en funktion som skickas som argument till en annan funktion och anropas när en händelse inträffar.
129
Vad händer om en blockerade funktion körs av en funktion på event loop?
Event loopen blockeras, vilket förhindrar andra händelser från att hanteras.
130
När bör man använda asynchronous programming?
När man har I/O-operationer eller långa beräkningar som inte ska blockera huvudtråden.
131
Vad är en kanal i Go?
En kanal är en kommunikationsmekanism som låter goroutines skicka och ta emot värden.
132
Vad gör select i Go?
Select låter en goroutine vänta på flera kanaloperationer och hantera den första som är klar.
133
Förklara begreppet done-kanal
En done-kanal används för att signalera när en goroutine ska avslutas.
134
Visa (i Go-liknande kod) hur en goroutine kan avslutas med hjälp av en done-kanal
```go done := make(chan struct{}) go func() { select { case <-done: return } }() close(done) ```
135
Implementera en funktion i Go som bestämmer det största värdet som skickas på en kanal
```go func maxValue(ch chan int) int { max := <-ch for v := range ch { if v > max { max = v } } return max } ```
136
Implementera en funktion i Go som delar en kanal i flera kanaler (multiplex). Tänk på att använda goroutiner
```go func multiplex(ch chan int, chs []chan int) { for v := range ch { for _, c := range chs { c <- v } } } ```
137
Vad är ett closure i Go?
En closure är en funktion som har tillgång till variabler från sitt omgivande scope.
138
Förklara WaitGroup i Go
En WaitGroup används för att vänta på att en grupp goroutines ska slutföras.