Download presentation
Presentation is loading. Please wait.
Published byAlayna Woodard Modified over 9 years ago
1
Multiprocessors and Multithreading – classroom slides
2
compute I/O I/O result Needed (a) Sequential process compute thread I/O result Needed (b) Multithreaded process I/O request I/O complete I/O thread Example use of threads - 1
3
DigitizerTrackerAlarm Example use of threads - 2
4
Programming Support for Threads creation –pthread_create(top-level procedure, args) termination –return from top-level procedure –explicit kill rendezvous –creator can wait for children pthread_join(child_tid) synchronization –mutex –condition variables Main thread thread_create(foo, args) (a) Before thread creation main thread thread_create(foo, args) (b) After thread creation foo thread
5
Sample program – thread create/join int foo(int n) {..... return 0; } int main() { int f; thread_type child_tid;..... child_tid = thread_create (foo, &f);..... thread_join(child_tid); }
6
Programming with Threads synchronization –for coordination of the threads communication –for inter-thread sharing of data –threads can be in different processors –how to achieve sharing in SMP? software: accomplished by keeping all threads in the same address space by the OS hardware: accomplished by hardware shared memory and coherent caches producerconsumer buffer
7
Need for Synchronization digitizer() { image_type dig_image; int tail = 0; loop { if (bufavail > 0) { grab(dig_image); frame_buf[tail mod MAX] = dig_image; tail = tail + 1; bufavail = bufavail - 1; } tracker() { image_type track_image; int head = 0; loop { if (bufavail < MAX) { track_image = frame_buf[head mod MAX]; head = head + 1; bufavail = bufavail + 1; analyze(track_image); } Problem?
8
digitizertracker bufavailbufavail = bufavail – 1; bufavail = bufavail + 1; Shared data structure …… head tail (First valid filled frame in frame_buf ) (First empty spot in frame_buf ) 0 99 frame_buf
9
Synchronization Primitives lock and unlock –mutual exclusion among threads –busy-waiting Vs. blocking –pthread_mutex_trylock: no blocking –pthread_mutex_lock: blocking –pthread_mutex_unlock
10
Fix number 1 – with locks digitizer() { image_type dig_image; int tail = 0; loop { thread_mutex_lock(buflock); if (bufavail > 0) { grab(dig_image); frame_buf[tail mod MAX] = dig_image; tail = tail + 1; bufavail = bufavail - 1; } thread_mutex_unlock(buflock); } tracker() ( image_type track_image; int head = 0; loop { thread_mutex_lock(buflock); if (bufavail < MAX) { track_image = frame_buf[head mod MAX]; head = head + 1; bufavail = bufavail + 1; analyze(track_image); } thread_mutex_unlock(buflock); } Problem?
11
Fix number 2 digitizer() { image_type dig_image; int tail = 0; loop { grab(dig_image); thread_mutex_lock(buflock); while (bufavail == 0) do nothing; thread_mutex_unlock(buflock); frame_buf[tail mod MAX] = dig_image; tail = tail + 1; thread_mutex_lock(buflock); bufavail = bufavail - 1; thread_mutex_unlock(buflock); } tracker() { image_type track_image; int head = 0; loop { thread_mutex_lock(buflock); while (bufavail == MAX) do nothing; thread_mutex_unlock(buflock); track_image = frame_buf[head mod MAX]; head = head + 1; thread_mutex_lock(buflock); bufavail = bufavail + 1; thread_mutex_unlock(buflock); analyze(track_image); } Problem?
12
Fix number 3 digitizer() { image_type dig_image; int tail = 0; loop { grab(dig_image); while (bufavail == 0) do nothing; frame_buf[tail mod MAX] = dig_image; tail = tail + 1; thread_mutex_lock(buflock); bufavail = bufavail - 1; thread_mutex_unlock(buflock); } tracker() { image_type track_image; int head = 0; loop { while (bufavail == MAX) do nothing; track_image = frame_buf[head mod MAX]; head = head + 1; thread_mutex_lock(buflock); bufavail = bufavail + 1; thread_mutex_unlock(buflock); analyze(track_image); } Problem?
13
condition variables –pthread_cond_wait: block for a signal –pthread_cond_signal: signal one waiting thread –pthread_cond_broadcast: signal all waiting threads
14
T1T2 cond_wait (c, m) cond_signal (c) blocked resumed T1T2 cond_wait (c, m) cond_signal (c) (a) Wait before signal (b) Wait after signal (T1 blocked forever) Wait and signal with cond vars
15
Fix number 4 – cond var digitizer() { image_type dig_image; int tail = 0; loop { grab(dig_image); thread_mutex_lock(buflock); if (bufavail == 0) thread_cond_wait(buf_not_full, buflock); thread_mutex_unlock(buflock); frame_buf[tail mod MAX] = dig_image; tail = tail + 1; thread_mutex_lock(buflock); bufavail = bufavail - 1; thread_cond_signal(buf_not_empty); thread_mutex_unlock(buflock); } tracker() { image_type track_image; int head = 0; loop { thread_mutex_lock(buflock); if (bufavail == MAX) thread_cond_wait(buf_not_empty, buflock); thread_mutex_unlock(buflock); track_image = frame_buf[head mod MAX]; head = head + 1; thread_mutex_lock(buflock); bufavail = bufavail + 1; thread_cond_signal(buf_not_full); thread_mutex_unlock(buflock); analyze(track_image); } This solution is correct so long as there is exactly one producer and one consumer
16
Gotchas in programming with cond vars acquire_shared_resource() { thread_mutex_lock(cs_mutex); if (res_state == BUSY) thread_cond_wait (res_not_busy, cs_mutex); res_state = BUSY; thread_mutex_unlock(cs_mutex); } release_shared_resource() { thread_mutex_lock(cs_mutex); res_state = NOT_BUSY; thread_cond_signal(res_not_busy); thread_mutex_unlock(cs_mutex); } T3 is here T2 is here T1 is here
17
cs_mutex T3 res_not_busy T2 (a) Waiting queues before T1 signals cs_mutex T3 res_not_busy T2 (a) Waiting queues after T1 signals State of waiting queues
18
Defensive programming – retest predicate acquire_shared_resource() { thread_mutex_lock(cs_mutex); T3 is here while (res_state == BUSY) thread_cond_wait (res_not_busy, cs_mutex); T2 is here res_state = BUSY; thread_mutex_unlock(cs_mutex); } release_shared_resource() { thread_mutex_lock(cs_mutex); res_state = NOT_BUSY; T1 is here thread_cond_signal(res_not_buys); thread_mutex_unlock(cs_mutex); }
19
mail box Dispatcher workers (a) Dispatcher model mail box mail box (b) Team model (c) Pipelined model stages Threads as software structuring abstraction
20
Threads and OS Traditional OS DOS –memory layout –protection between user and kernel? User Kernel Program data DOS code data
21
Unix –memory layout –protection between user and kernel? –PCB? user kernel P1 P2 process code and data process code and data kernel code and data PCB
22
programs in these traditional OS are single threaded –one PC per program (process), one stack, one set of CPU registers –if a process blocks (say disk I/O, network communication, etc.) then no progress for the program as a whole
23
MT Operating Systems How widespread is support for threads in OS? Digital Unix, Sun Solaris, Win95, Win NT, Win XP Process Vs. Thread? in a single threaded program, the state of the executing program is contained in a process in a MT program, the state of the executing program is contained in several ‘concurrent’ threads
24
Process Vs. Thread –computational state (PC, regs, …) for each thread –how different from process state? P1P2 User Kernel kernel code and data codedata code data PCB T2 T3T1 P1P2
25
(a) ST program(b) MT program code global heap stack stack1stack2stack3stack4
26
threads –share address space of process –cooperate to get job done threads concurrent? –may be if the box is a true multiprocessor –share the same CPU on a uniprocessor threaded code different from non-threaded? –protection for data shared among threads –synchronization among threads
27
Threads Implementation user level threads –OS independent –scheduler is part of the runtime system –thread switch is cheap (save PC, SP, regs) –scheduling customizable, i.e., more app control –blocking call by thread blocks process
28
Kernel User P2 Threads library T1T2 T3 T2 T3 T1 P1P2 P3 process ready_q P3 mutex, cond_var thread ready_q P1 Threads library T1T2 T3 T2 T3 T1 mutex, cond_var thread ready_q
29
Kernel User P1 Threads library T2 T3 T1 Currently executing thread Blocking call to the OS Upcall to the threads library
30
solution to blocking problem in user level threads –non-blocking version of all system calls –polling wrapper in scheduler for such calls switching among user level threads –yield voluntarily –how to make preemptive? timer interrupt from kernel to switch
31
Kernel level –expensive thread switch –makes sense for blocking calls by threads –kernel becomes complicated: process vs. threads scheduling –thread packages become non-portable problems common to user and kernel level threads –libraries –solution is to have thread-safe wrappers to such library calls
32
Kernel User P2 P1P2 P3 process ready_q P3 P1 T2 T3 T1 T2 T1 T2 T3 T1T2 thread level scheduler process level scheduler
33
Solaris Threads Three kinds –user, lwp, kernel user: any number can be created and attached to lwp’s one to one mapping between lwp and kernel threads kernel threads known to the OS scheduler if a kernel thread blocks, associated lwp, and user level threads block as well
34
Kernel User P2 P3 P1 T2 T3 T1 T2 T1 lwp Solaris threads
35
/* original version */ | /* thread safe version */ | | mutex_lock_type cs_mutex; void *malloc(size_t size)| void *malloc(size_t size) { | { | thread_mutex_lock(cs_mutex); |...... |...... | | thread_mutex_unlock(cs_mutex); | return(memory_pointer);| return (memory_pointer); } | } Thread safe libraries
36
Synchronization support Lock –Test and set instruction
37
Shared Memory CPU.. Input/output Shared bus SMP
38
cache Shared Memory CPU Shared bus cache CPU cache CPU.. SMP with per-processor caches
39
X Shared Memory P1 Shared bus X P2 X P3 T1T2 T3 Cache consistency problem
40
X -> X’ Shared Memory P1 Shared bus X -> inv P2 X -> inv P3 T1T2 T3 (b) write-invalidate protocol invalidate -> X -> X’ Shared Memory P1 Shared bus X -> X’ P2 X -> X’ P3 T1T2 T3 (c) write-update protocol update -> Two possible solutions
41
Given the following details about an SMP (symmetric multiprocessor): Cache coherence protocol:write-invalidate Cache to memory policy:write-back Initially: The caches are empty Memory locations: A contains 10 B contains 5 Consider the following timeline of memory accesses from processors P1, P2, and P3. Contents of caches and memory? Time (in increasing order) Processor P1Processor P2Processor P3 T1Load A T2Load A T3Load A T4Store #40, A T5Store #30, B
43
What is multithreading? technique allowing program to do multiple tasks is it a new technique? –has existed since the 70’s (concurrent Pascal, Ada tasks, etc.) why now? –emergence of SMPs in particular –“time has come for this technology”
44
active allows concurrency between I/O and user processing even in a uniprocessor box process threads in a uniprocessor?
45
Multiprocessor: First Principles processors, memories, interconnection network Classification: SISD, SIMD, MIMD, MISD message passing MPs: e.g. IBM SP2 shared address space MPs –cache coherent (CC) SMP: a bus-based CC MIMD machine –several vendors: Sun, Compaq, Intel,... CC-NUMA: SGI Origin 2000 –non-cache coherent (NCC) Cray T3D/T3E
46
What is an SMP? –multiple CPUs in a single box sharing all the resources such as memory and I/O Is an SMP more cost effective than two uniprocessor boxes? –yes (roughly 20% more for a dual processor SMP compared to a uni) –modest speedup for a program on a dual- processor SMP over a uni will make it worthwhile
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.