cs510 concurrent systems class 2 a lock-free multiprocessor os kernel

30
CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Post on 20-Dec-2015

224 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

CS510 Concurrent Systems Class 2

A Lock-Free Multiprocessor OS Kernel

Page 2: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

CS510 - Concurrent Systems 2

The Synthesis kernel

Page 3: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Locking

CS510 - Concurrent Systems 3

Page 4: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

So why not use locking?

CS510 - Concurrent Systems 4

Page 5: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Is there an alternative?

Use lock-free, “optimistic” synchronizationo Execute the critical section unconstrained, and check

at the end to see if you were the only oneo If so, continue. If not roll back and retry

Synthesis uses no locks at all!

Goal: Show that Lock-Free synchronization is...o Sufficient for all OS synchronization needso Practicalo High performance

CS510 - Concurrent Systems 5

Page 6: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Locking is pessimistic

CS510 - Concurrent Systems 6

Page 7: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Optimistic synchronization

CS510 - Concurrent Systems 7

Page 8: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

How does it work?

CS510 - Concurrent Systems 8

Page 9: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 9

Page 10: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 10

loop

Page 11: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 11

Locals -won’t change!

Locals -won’t change!

Global - may change any

time!

Global - may change any

time!

“Atomic”read-modify-write

instruction

“Atomic”read-modify-write

instruction

Page 12: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

CAS

CAS – single word Compare and Swapo An atomic read-modify-write instructiono Semantics of the single atomic instruction are:

CAS(copy, update, mem_addr)

{

if (*mem_addr == copy) {

*mem_addr = update;

return SUCCESS;

} else

return FAIL;

}

CS510 - Concurrent Systems 12

Page 13: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 13

Page 14: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 14

Do Work

Page 15: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 15

Page 16: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Example – stack pop

Pop() { retry: old_SP = SP; new_SP = old_SP + 1; elem = *old_SP; if (CAS(old_SP, new_SP, &SP) == FAIL) goto retry; return elem;}

CS510 - Concurrent Systems 16

Do Work

Page 17: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

What made it work?

It works because we can atomically commit the new stack pointer value and compare the old stack pointer with the one at commit time

This allows us to verify no other thread has accessed the stack concurrently with our operation

o i.e. since we took the copyo Well, at least we know the address in the stack pointer is

the same as it was when we started• Does this guarantee there was no concurrent activity?• Does it matter?• We have to be careful !

CS510 - Concurrent Systems 17

Page 18: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Stack push

Push(elem) {

retry:

old_SP = SP;

new_SP = old_SP – 1;

old_val = *new_SP;

if(CAS2(old_SP, old_val, new_SP, elem, &SP, new_SP)

== FAIL) goto retry;

}

CS510 - Concurrent Systems 18

Page 19: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Stack push

Push(elem) {

retry:

old_SP = SP;

new_SP = old_SP – 1;

old_val = *new_SP;

if(CAS2(old_SP, old_val, new_SP, elem, &SP, new_SP)

== FAIL) goto retry;

}

CS510 - Concurrent Systems 19

Copy

Page 20: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Stack push

Push(elem) {

retry:

old_SP = SP;

new_SP = old_SP – 1;

old_val = *new_SP;

if(CAS2(old_SP, old_val, new_SP, elem, &SP, new_SP)

== FAIL) goto retry;

}

CS510 - Concurrent Systems 20

Do Work

Page 21: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Stack push

Push(elem) {

retry:

old_SP = SP;

new_SP = old_SP – 1;

old_val = *new_SP;

if(CAS2(old_SP, old_val, new_SP, elem, &SP, new_SP)

== FAIL) goto retry;

}

CS510 - Concurrent Systems 21

Page 22: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Stack push

Push(elem) {

retry:

old_SP = SP;

new_SP = old_SP – 1;

old_val = *new_SP;

if(CAS2(old_SP, old_val, new_SP, elem, &SP, new_SP)

== FAIL) goto retry;

}

CS510 - Concurrent Systems 22

Note: this is a double compare and swap!Its needed to atomically update both thenew item and the new stack pointer

Unnecessary

Compare

Page 23: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

CAS2

CAS2 = double compare and swapo Sometimes referred to as DCAS

CAS2(copy1, copy2, update1, update2, addr1, addr2)

{

if(addr1 == copy1 && addr2 == copy2) {

*addr1 = update1;

*addr2 = update2;

return SUCCEED;

} else

return FAIL;

}

CS510 - Concurrent Systems 23

Page 24: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Stack push

Push(elem) {

retry:

old_SP = SP;

new_SP = old_SP – 1;

old_val = *new_SP;

if(CAS2(old_SP, old_val, new_SP, elem, &SP, new_SP)

== FAIL) goto retry;

}

CS510 - Concurrent Systems 24

Do Work

Page 25: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Optimistic synchronization in Synthesis

CS510 - Concurrent Systems 25

Page 26: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Approach

CS510 - Concurrent Systems 26

Page 27: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Why is this trickier than it seems?

CS510 - Concurrent Systems 27

Page 28: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

The fall-back position

CS510 - Concurrent Systems 28

Page 29: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

Lock vs lock-free critical sections

CS510 - Concurrent Systems 29

Lock_based_Pop() {

spin_lock(&lock);

elem = *SP; SP = SP + 1;

spin_unlock(&lock);

return elem;

}

Lock_free_Pop() {

retry:

old_SP = SP;

new_SP = old_SP + 1; elem = *old_SP;

if (CAS(old_SP, new_SP, &SP) == FAIL)

goto retry;

return elem;

}

Page 30: CS510 Concurrent Systems Class 2 A Lock-Free Multiprocessor OS Kernel

CS510 - Concurrent Systems 30

Conclusions