Top Banner
Concurrency: Threads Questions Answered in this Lecture: Why is concurrency useful? What is a thread and how does it differ from a process? What can go wrong if we don’t enforce mutual exclusion for critical sections? 1 Hale | CS450
61

Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Oct 18, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Concurrency:Threads

Questions Answered in this Lecture:• Why is concurrency useful?• What is a thread and how does it differ from a process?• What can go wrong if we don’t enforce mutual exclusion for critical

sections?

1Hale | CS450

Page 2: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Announcements

• P1b due tomorrow! Don’t expect us to stay up until midnight on Piazza ;)• I have office hours today! Come get help!• P1b grades looking good so far

2Hale | CS450

Page 3: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

What is concurrency?

• A more general form of parallelism• The illusion of multiple execution contexts making progress• Execution context = process/thread/etc.• Does not require multiple CPU cores, processors, or machines• But often involves them• We’ve already seen concurrency with CPU virtualization!

(multiprogramming of processes)

3Hale | CS450

Page 4: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

What is parallelism?

• Special case of concurrency• Two execution contexts execute simultaneously• Always requires more hardware (more cores, more processors, more

vector units, more machines, etc.)

4Hale | CS450

Page 5: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Why parallelism?

5Hale | CS450

Page 6: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

The Switching Equation

6

𝑃! = α𝐶𝑉"𝑓

Hale | CS450

Increasing clock frequency is great for performance, but it increases power consumption (and thus heat generated)

We can’t do this forever! At some point clock frequency levels out

Page 7: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Trends

• Can’t keep ramping up frequency due to power (and thus heat) consumption• But we can keep shrinking transistors • What to do with all those extra transistors?• More cores!

• Challenge: make good use of these cores

7Hale | CS450

Page 8: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Remember…

• One of the roles of the OS is to provide abstractions to the hardware• Or a “hardware API” if you like• What’s the right one for multiple cores?

8Hale | CS450

Page 9: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Why concurrency?

• Increase interactivity (doesn’t really help with performance)• The illusion of true parallelism

• latency hiding (don’t wait for long-running operations)• Overlapping activities (you probably do this every day)

9Hale | CS450

Page 10: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

How to make it happen?

• Option 1: Communicating processes• Example: Chrome (process per tab)• Example: Windowing system (process for server, one process per client)

• How do we coordinate processes?• pipe() (buffer shared between producer proc and concumer proc)• messages (message queues)

10Hale | CS450

Page 11: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Pros?

• Don’t need new abstractions• Good for isolation/security

11Hale | CS450

Page 12: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Cons?

• Hard to program!• Communication overheads are high• Context switching is expensive

12Hale | CS450

Page 13: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Option 2: Threads

• Like a process, less state attached• Namely, threads share an address space (they share the page table(s))• Divide your task into parts, one thread works on each part• Communication is via shared memory

13Hale | CS450

Page 14: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Concurrent programming models

• Producer/consumer: some threads/procs create work, others process work• Client/server: one thread/proc fields requests from multiple

consumers• Pipeline: one thread/proc per task, each passes work to the next

thread/proc• Daemon: work gets queued to a background thread• A lot of others, take CS451 and/or CS546!

14Hale | CS450

Page 15: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

CPU 1 CPU 2runningthread 1

runningthread 2

RAM

What state do threads share?

Page 16: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…

What threads share page directories?

CPU 1 CPU 2 RAM

Page 17: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

CPU 1 CPU 2 RAM

Page 18: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

CPU 1 CPU 2 RAM

Page 19: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

IP IP

Do threads share Instruction Pointer?

CPU 1 CPU 2 RAM

Page 20: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

CODE HEAP …Virt Mem(PageDir A)

IP IP

CPU 1 CPU 2 RAM

Page 21: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

IP IP

Share code, but each thread may be executingdifferent code at the same time

à Different Instruction Pointers

CPU 1 CPU 2 RAM

CODE HEAP …Virt Mem(PageDir A)

Page 22: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

IP IP

CPU 1 CPU 2 RAM

CODE HEAP …Virt Mem(PageDir A)

Page 23: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

IP IPSP SP

Do threads share stack pointer?

CPU 1 CPU 2 RAM

CODE HEAP …Virt Mem(PageDir A)

Page 24: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

CODE HEAPVirt Mem(PageDir A)

IP IPSP SP

STACK 1 STACK 2

CPU 1 CPU 2 RAM

Page 25: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

runningthread 1

runningthread 2

PageDir A

PageDir B…PTBRPTBR

IP IPSP SP

threads executing different functions need different stacks

CPU 1 CPU 2 RAM

CODE HEAPVirt Mem(PageDir A) STACK 1 STACK 2

Page 26: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread vs. Process

• Multiple threads within a single process share:• Address space

• Code (instructions) • Most data (heap)

• Open file descriptors • Current working directory • User and group id

• Each thread has its own • Thread ID (TID) • Set of registers, including Program counter and Stack pointer • Stack for local variables and return addresses

(in same address space)

Hale | CS450 26

Page 27: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread API

• Variety of thread systems exist • POSIX Pthreads, Qthreads, Cilk, etc.

• Common thread operations • create() • exit() • join(thethread) (instead of wait() for processes)

Hale | CS450 27

Page 28: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

OS Support: Approach 1

User-level threads: Many-to-one thread mapping• Implemented by user-level runtime libraries

• Create, schedule, synchronize threads at user-level • OS is not aware of user-level threads

• OS thinks each process contains only a single thread of control

Advantages • Does not require OS support; Portable • Can tune scheduling policy to meet application demands • Lower overhead thread operations since no system call

Disadvantages?• Cannot leverage multiprocessors • Entire process blocks when one thread blocks

28Hale | CS450

Page 29: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

OS Support: Approach 2

Kernel-level threads: One-to-one thread mapping • OS provides each user-level thread with a kernel thread • Each kernel thread scheduled independently • Thread operations (creation, scheduling, synchronization)

performed by OS Advantages • Each kernel-level thread can run in parallel on a

multiprocessor • When one thread blocks, other threads from process can

be scheduled Disadvantages • Higher overhead for thread operations • OS must scale well with increasing number of threads

29Hale | CS450

Page 30: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 100%eax: ?%rip = 0x195

processcontrolblocks:

T1

%eax: ?%rip: 0x195

balance = balance + 1; balance at 0x9cd4

30Hale | CS450

Page 31: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 100%eax: 100%rip = 0x19a

processcontrolblocks:

T1

%eax: ?%rip: 0x195

31Hale | CS450

Page 32: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 100%eax: 101%rip = 0x19d

processcontrolblocks:

T1

%eax: ?%rip: 0x195

32Hale | CS450

Page 33: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 101%eax: 101%rip = 0x1a2

processcontrolblocks:

T1

%eax: ?%rip: 0x195

33Hale | CS450

Thread Context Switch

Page 34: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x1a2

State:0x9cd4: 101%eax: ?%rip = 0x195

processcontrolblocks:

T2

%eax: ?%rip: 0x195

34Hale | CS450

Page 35: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x1a2

State:0x9cd4: 101%eax: 101%rip = 0x19a

processcontrolblocks:

T2

%eax: ?%rip: 0x195

35Hale | CS450

Page 36: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x1a2

State:0x9cd4: 101%eax: 102%rip = 0x19d

processcontrolblocks:

T2

%eax: ?%rip: 0x195

36Hale | CS450

Page 37: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x1a2

State:0x9cd4: 102%eax: 102%rip = 0x1a2

processcontrolblocks:

T2

%eax: ?%rip: 0x195

37Hale | CS450

Page 38: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #1

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x1a2

State:0x9cd4: 102%eax: 102%rip = 0x1a2

processcontrolblocks:

T2

%eax: ?%rip: 0x195

38Hale | CS450

Desired result!

Page 39: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Another schedule

Page 40: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 100%eax: ?%rip = 0x195

processcontrolblocks:

T1

%eax: ?%rip: 0x195

balance = balance + 1; balance at 0x9cd4

40Hale | CS450

Page 41: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 100%eax: 100%rip = 0x19a

processcontrolblocks:

T1

%eax: ?%rip: 0x195

41Hale | CS450

Page 42: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: ?%rip: 0x195

State:0x9cd4: 100%eax: 101%rip = 0x19d

processcontrolblocks:

T1

%eax: ?%rip: 0x195

42Hale | CS450

Thread Context Switch

Page 43: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x19d

State:0x9cd4: 100%eax: ?%rip = 0x195

processcontrolblocks:

T2

%eax: ?%rip: 0x195

43Hale | CS450

Page 44: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x19d

State:0x9cd4: 100%eax: 100%rip = 0x19a

processcontrolblocks:

T2

%eax: ?%rip: 0x195

44Hale | CS450

Page 45: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x19d

State:0x9cd4: 100%eax: 101%rip = 0x19d

processcontrolblocks:

T2

%eax: ?%rip: 0x195

45Hale | CS450

Page 46: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x19d

State:0x9cd4: 101%eax: 101%rip = 0x1a2

processcontrolblocks:

T2

%eax: ?%rip: 0x195

46Hale | CS450

Thread Context Switch

Page 47: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x19d

State:0x9cd4: 101%eax: 101%rip = 0x19d

processcontrolblocks:

T1

%eax: 101%rip: 0x1a2

47Hale | CS450

Page 48: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Thread Schedule #2

0x195 mov 0x9cd4, %eax0x19a add $0x1, %eax0x19d mov %eax, 0x9cd4

Thread 1 Thread 2

%eax: 101%rip: 0x1a2

State:0x9cd4: 101%eax: 101%rip = 0x1a2

processcontrolblocks:

T1

%eax: 101%rip: 0x1a2

48Hale | CS450

WRONG RESULT! Final balance value is 101

Page 49: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Timeline View: Interleaving #1Thread 1 Thread 2mov 0x123, %eaxadd %0x1, %eaxmov %eax, 0x123

mov 0x123, %eaxadd %0x2, %eaxmov %eax, 0x123

How much is added to shared variable? 3: correct!49Hale | CS450

time

Page 50: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Timeline View: Interleaving #2

Thread 1 Thread 2mov 0x123, %eaxadd %0x1, %eax

mov 0x123, %eaxmov %eax, 0x123

add %0x2, %eaxmov %eax, 0x123

How much is added?2: incorrect!

50Hale | CS450

time

Page 51: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Timeline View: Interleaving #3Thread 1 Thread 2

mov 0x123, %eaxmov 0x123, %eax

add %0x2, %eaxadd %0x1, %eax

mov %eax, 0x123mov %eax, 0x123

How much is added?

1: incorrect!51Hale | CS450

time

Page 52: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Timeline View: Interleaving #4Thread 1 Thread 2

mov 0x123, %eaxadd %0x2, %eaxmov %eax, 0x123

mov 0x123, %eaxadd %0x1, %eaxmov %eax, 0x123

How much is added?3: correct!

52Hale | CS450

time

Page 53: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Timeline View: Interleaving #5Thread 1 Thread 2

mov 0x123, %eaxadd %0x2, %eax

mov 0x123, %eaxadd %0x1, %eaxmov %eax, 0x123

mov %eax, 0x123

How much is added? 2: incorrect!

53Hale | CS450

time

Page 54: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Non-Determinism• Concurrency leads to non-deterministic results• Not deterministic result: different results even with same inputs• race conditions

• Whether bug manifests depends on CPU schedule! (heisenbug)• Passing tests means little• How to program: assume scheduler is malicious• Assume scheduler will pick bad ordering at some point…

Hale | CS450 54

Page 55: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

What do we want?

• Want 3 instructions to execute as an uninterruptable group • That is, we want them to be an atomic unit

mov 0x123, %eaxadd %0x1, %eaxmov %eax, 0x123

critical section

More general:Need mutual exclusion for critical sections• if process A is in critical section C, process B can’t be

(okay if other processes do unrelated work)55Hale | CS450

Page 56: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

SynchronizationBuild higher-level synchronization primitives in OS

• Operations that ensure correct ordering of instructions across threads

Motivation: Build them once and get them right

Monitors SemaphoresCondition Variables

Locks

Loads Stores Test&SetDisable Interrupts

56Hale | CS450

Page 57: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

LocksGoal: Provide mutual exclusion (mutex)Three common operations:• Allocate and Initialize

• pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;

• Acquire• Acquire exclusion access to lock; • Wait if lock is not available (some other process in critical section)• Spin or block (relinquish CPU) while waiting• pthread_mutex_lock(&mylock);

• Release• Release exclusive access to lock; let another process enter critical section• pthread_mutex_unlock(&mylock);

57Hale | CS450

Page 58: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Implementing Synchronization

• To implement, need atomic operations• Atomic operation: guarantees no other instructions can be

interleaved• Examples of atomic operations• Code between interrupts on uniprocessors

• Disable timer interrupts, don’t do any I/O• Loads and stores of words

• Load r1, B• Store r1, A

• Special hardware instructions• atomic test & set• atomic compare & swap

Hale | CS450 58

Page 59: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Implementing Locks: Attempt #1Turn off interrupts for critical sections

Prevent dispatcher from running another threadCode executes atomically

void acquire(lock_t *l) {disable_interrupts();

}void release(lock_t *l) {

enable_interrupts();

}

Disadvantages??

59Hale | CS450

Page 60: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Implementing Locks: Attempt #2Code uses a single shared lock variablebool lock = false; // shared variablevoid acquire() {

while (lock) /* wait */ ;lock = true;

}

void release() {lock = false;

}

60Hale | CS450

Why doesn’t this work?

Page 61: Concurrency: Threads · Hale | CS450 26. Thread API •Variety of thread systems exist •POSIX Pthreads, Qthreads, Cilk, etc. •Common thread operations •create() •exit() •join(thethread)

Summary

• Concurrency is needed to obtain high performance by utilizing multiple cores• Threads are multiple execution streams within a single process or

address space (share PID and address space, own registers and stack)• Context switches within a critical section can lead to non-

deterministic bugs (race conditions)• Use locks to provide mutual exclusion

Hale | CS450 61