Recap: Thread. What is it? What does it need (thread private)? What for? How to implement? Independent flow of control. Stack

Similar documents
Synchronization. Disclaimer: some slides are adopted from the book authors slides with permission 1

Recap. Mutual exclusion. Peterson s algorithm. Synchronization instructions. s/w solution Assume program order execution. Test&set

Thread. Disclaimer: some slides are adopted from the book authors slides with permission 1

OS Structure. User mode/ kernel mode. System call. Other concepts to know. Memory protection, privileged instructions

OS Structure. User mode/ kernel mode (Dual-Mode) Memory protection, privileged instructions. Definition, examples, how it works?

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

Synchronization. Heechul Yun. Disclaimer: some slides are adopted from the book authors and Dr. Kulkani

Synchronization. Disclaimer: some slides are adopted from the book authors slides 1

Synchronization. Disclaimer: some slides are adopted from the book authors slides 1

Process Synchronization

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

Synchronization I. Jo, Heeseung

Process Synchronization

Synchronization Spinlocks - Semaphores

Synchronization for Concurrent Tasks

Chapter 6: Synchronization. Operating System Concepts 8 th Edition,

Chapter 5: Process Synchronization. Operating System Concepts Essentials 2 nd Edition

CS 31: Introduction to Computer Systems : Threads & Synchronization April 16-18, 2019

Operating Systems. Lecture 4 - Concurrency and Synchronization. Master of Computer Science PUF - Hồ Chí Minh 2016/2017

Lesson 6: Process Synchronization

Operating Systems. Designed and Presented by Dr. Ayman Elshenawy Elsefy

Process Synchronization

Chapter 6: Process Synchronization

Background. The Critical-Section Problem Synchronisation Hardware Inefficient Spinning Semaphores Semaphore Examples Scheduling.

Systèmes d Exploitation Avancés

CS420: Operating Systems. Process Synchronization

Chapter 6: Synchronization. Chapter 6: Synchronization. 6.1 Background. Part Three - Process Coordination. Consumer. Producer. 6.

CSCI 447 Operating Systems Filip Jagodzinski

CHAPTER 6: PROCESS SYNCHRONIZATION

Synchronization Principles

Process Synchronization (Part I)

Synchronization I. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Background. Old Producer Process Code. Improving the Bounded Buffer. Old Consumer Process Code

CS 333 Introduction to Operating Systems. Class 3 Threads & Concurrency. Jonathan Walpole Computer Science Portland State University

CS370 Operating Systems

Dept. of CSE, York Univ. 1

Process Synchronization

Chapter 5: Process Synchronization

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

Chapter 6: Process Synchronization. Operating System Concepts 8 th Edition,

Chapter 6: Process Synchronization

CS 333 Introduction to Operating Systems. Class 3 Threads & Concurrency. Jonathan Walpole Computer Science Portland State University

IV. Process Synchronisation

CS3733: Operating Systems

Process Synchronization

Chapter 5: Process Synchronization

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Steve Gribble. Synchronization. Threads cooperate in multithreaded programs

Synchronization. CSE 2431: Introduction to Operating Systems Reading: Chapter 5, [OSC] (except Section 5.10)

COMP 3430 Robert Guderian

Module 6: Process Synchronization. Operating System Concepts with Java 8 th Edition

Process Synchronization

Review: Thread package API

Concurrency, Thread. Dongkun Shin, SKKU

Chapter 6: Process Synchronization

Chapter 6: Process Synchronization. Module 6: Process Synchronization

Module 6: Process Synchronization

Dealing with Issues for Interprocess Communication

Chapter 6 Process Synchronization

CS 153 Design of Operating Systems Winter 2016

Chapter 6: Process Synchronization

Review: Thread package API

Process & Thread Management II. Queues. Sleep() and Sleep Queues CIS 657

Process & Thread Management II CIS 657

Chapter 5: Process Synchronization

CSE 451: Operating Systems Winter Lecture 7 Synchronization. Hank Levy 412 Sieg Hall

Operating Systems. Synchronization

Synchronization for Concurrent Tasks

10/17/ Gribble, Lazowska, Levy, Zahorjan 2. 10/17/ Gribble, Lazowska, Levy, Zahorjan 4

Chapter 6: Process Synchronization. Operating System Concepts 8 th Edition,

Review: Thread package API

CIS Operating Systems Synchronization based on Busy Waiting. Professor Qiang Zeng Spring 2018

Process Synchronization. CISC3595, Spring 2015 Dr. Zhang

CS 5523 Operating Systems: Midterm II - reivew Instructor: Dr. Tongping Liu Department Computer Science The University of Texas at San Antonio

Threads and Synchronization. Kevin Webb Swarthmore College February 15, 2018

Process/Thread Synchronization

Chapter 5 Asynchronous Concurrent Execution

CSE 4/521 Introduction to Operating Systems

Synchronization 1. Synchronization

Review: Easy Piece 1

Synchronization. CSCI 3753 Operating Systems Spring 2005 Prof. Rick Han

Administrivia. Review: Thread package API. Program B. Program A. Program C. Correct answers. Please ask questions on Google group

EECE.4810/EECE.5730: Operating Systems Spring 2017 Homework 2 Solution

CS 333 Introduction to Operating Systems. Class 4 Concurrent Programming and Synchronization Primitives

Concept of a process

Process Coordination

Chapter 6 Synchronization

CSE Traditional Operating Systems deal with typical system software designed to be:

Process Synchronization Mechanisms

CMSC421: Principles of Operating Systems

COP 4225 Advanced Unix Programming. Synchronization. Chi Zhang

Synchronization COMPSCI 386

Process/Thread Synchronization

Lecture 5: Synchronization w/locks

Interprocess Communication By: Kaushik Vaghani

Chapter 5: Process Synchronization. Operating System Concepts 9 th Edition

Synchronization Principles I

Chapter 6: Process Synchronization

CS370 Operating Systems

CS370 Operating Systems

Implementing Mutual Exclusion. Sarah Diesburg Operating Systems CS 3430

Transcription:

What is it? Recap: Thread Independent flow of control What does it need (thread private)? Stack What for? Lightweight programming construct for concurrent activities How to implement? Kernel thread vs. user thread 1

Recap: Process vs. Thread Figure source: https://computing.llnl.gov/tutorials/pthreads/ 2

Multi-threads vs. Multi-processes Multi-processes (+) protection (-) performance (?) Process-per-tab Multi-threads (+) performance (-) protection Single-process multi-threads 3

Threads: Advanced Topics Semantics of Fork/exec() Signal handling Thread pool Multicore 4

Semantics of fork()/exec() Remember fork(), exec() system calls? Fork: create a child process (a copy of the parent) Exec: replace the address space with a new pgm. Duplicate all threads or the caller only? Linux: the calling thread only Complicated. Don t do it! Why? Mutex states, library, Exec() immediately after Fork() may be okay. 5

What is Singal? Signal Handling $ man 7 signal OS to process notification hey, wake-up, you ve got a packet on your socket, hey, wake-up, your timer is just expired. Which thread to deliver a signal? Any thread e.g., kill(pid) Specific thread E.g., pthread_kill(tid) 6

Thread Pool Managing threads yourself can be cumbersome and costly Repeat: create/destroy threads as needed. Let s create a set of threads ahead of time, and just ask them to execute my functions #of thread ~ #of cores No need to create/destroy many times Many high-level parallel libraries use this. e.g., Intel TBB (threading building block), 7

Single Core Vs. Multicore Execution Single core execution Multiple core execution 8

Challenges for Multithreaded Programming in Multicore How to divide activities? How to divide data? How to synchronize accesses to the shared data? How to test and debug? EECS750 9

Thread What is it? Summary Independent flow of control. What for? Lightweight programming construct for concurrent activities How to implement? Kernel thread vs. user thread Next class How to synchronize? 10

Synchronization Disclaimer: some slides are adopted from the book authors slides with permission 11

Mutual exclusion Agenda Peterson s algorithm (Software) Synchronization instructions (Hardware) High-level synchronization mechanisms Mutex Semaphore Monitor 12

Producer/Consumer Producer Thread Buffer[10] Consumer Thread 13

Producer/Consumer Producer while (true) /* wait if buffer full */ while (counter == 10); /* produce data */ buffer[in] = sdata; in = (in + 1) % 10; Consumer while (true) /* wait if buffer empty */ while (counter == 0); /* consume data */ sdata = buffer[out]; out = (out + 1) % 10; /* update number of items in buffer */ counter++; /* update number of items in buffer */ counter--; 14

Producer/Consumer Producer while (true) /* wait if buffer full */ while (counter == 10); /* produce data */ buffer[in] = sdata; in = (in + 1) % 10; Consumer while (true) /* wait if buffer empty */ while (counter == 0); /* consume data */ sdata = buffer[out]; out = (out + 1) % 10; /* update number of items in buffer */ R1 = load (counter); R1 = R1 + 1; counter = store (R1); /* update number of items in buffer */ R2 = load (counter); R2 = R2 1; counter = store (R2); 15

Check Yourself int count = 0; int main() count = count + 1; return count; $ gcc O2 S sync.c movl addl movl count(%rip), %eax $1, %eax %eax, count(%rip)

Race Condition Initial condition: counter = 5 Thread 1 Thread 2 R1 = load (counter); R1 = R1 + 1; counter = store (R1); R2 = load (counter); R2 = R2 1; counter = store (R2); What are the possible outcome? 17

Race Condition Initial condition: counter = 5 R1 = load (counter); R1 = R1 + 1; counter = store (R1); R2 = load (counter); R2 = R2 1; counter = store (R2); R1 = load (counter); R1 = R1 + 1; R2 = load (counter); R2 = R2 1; counter = store (R1); counter = store (R2); R1 = load (counter); R1 = R1 + 1; R2 = load (counter); R2 = R2 1; counter = store (R2); counter = store (R1); counter = 5 counter = 4 counter = 6 Why this happens? 18

Race Condition A situation when two or more threads read and write shared data at the same time Correctness depends on the execution order Thread 1 Thread 2 R1 = load (counter); R1 = R1 + 1; counter = store (R1); read write R2 = load (counter); R2 = R2 1; counter = store (R2); How to prevent race conditions? 19

Critical Section Code sections of potential race conditions Thread 1 Thread 2 Do something.. R1 = load (counter); R1 = R1 + 1; counter = store (R1);... Do something Do something.. R2 = load (counter); R2 = R2 1; counter = store (R2);.. Do something Critical sections 20

Solution Requirements Mutual Exclusion If a thread executes its critical section, no other threads can enter their critical sections Progress If no one executes a critical section, someone can enter its critical section Bounded waiting Waiting (time/number) must be bounded 21

Simple Solution (?): Use a Flag // wait while (in_cs) ; // enter critical section in_cs = true; Do something // exit critical section in_cs = false; T1 while(in_cs); in_cs = true; //enter T2 while(in_cs); in_cs = true; //enter Mutual exclusion is not guaranteed 22

Peterson s Solution Software solution (no h/w support) Two process solution Multi-process extension exists The two processes share two variables: int turn; The variable turn indicates whose turn it is to enter the critical section Boolean flag[2] The flag array is used to indicate if a process is ready to enter the critical section. 23

Peterson s Solution Thread 1 Thread 2 do flag[0] = TRUE; turn = 1; while (flag[1] && turn==1) ; // critical section flag[0] = FALSE; // remainder section while (TRUE) do flag[1] = TRUE; turn = 0; while (flag[0] && turn==0) ; // critical section flag[1] = FALSE; // remainder section while (TRUE) Solution meets all three requirements Mutual exclusion: P0 and P1 cannot be in the critical section at the same time Progress: if P0 does not want to enter critical region, P1 does no waiting Bounded waiting: process waits for at most one turn 24

Peterson s Solution Only supports two processes generalizing for more than two processes has been achieved, but not very efficient Assumes that the LOAD and STORE instructions are atomic Assumes that memory accesses are not reordered your compiler re-orders instructions (gcc O2, -O3, ) your processor re-orders instructions (memory consistency models ) 25

Reordering by the CPU Initially X = Y = 0 Thread 0 Thread 1 Thread 0 Thread 1 Possible values of R1 and R2? 0,1 1,0 1,1 X = 1 R1 = Y Y = 1 R2 = X 0,0 possible on PC R1 = Y X = 1 R2 = X Y = 1 26

Lock-Based Solutions General solution to the critical section problem critical sections are protected by locks process must acquire lock before entry process releases lock on exit do acquire lock; critical section release lock; remainder section while(true); 27

Hardware Support for Lock-Based Solutions For uniprocessor systems Uniprocessors concurrent processes cannot be overlapped, only interleaved process runs until it is interrupted Disable interrupts! active process will run without preemption do disable interrupts; critical section enable interrupts; remainder section while(true); 28

Hardware Support for Lock-Based Solutions In multiprocessors several processes share memory Multiprocessors processors behave independently in a peer manner Disabling interrupt based solution will not work too inefficient OS using this not broadly scalable Provide hardware support in the form of atomic instructions atomic test-and-set instruction atomic compare-and-swap instruction Atomic execution of a set of instructions means that the instructions are treated as a single step that cannot be interrupted. All or nothing property 29

TestAndSet Instruction Pseudo code definition of TestAndSet boolean TestAndSet (boolean *target) boolean rv = *target; *target = TRUE; return rv: 30

Mutual Exclusion using TestAndSet int mutex; init_lock (&mutex); do lock (&mutex); critical section unlock (&mutex); remainder section while(true); void init_lock (int *mutex) *mutex = 0; void lock (int *mutex) while(testandset(mutex)) ; void unlock (int *mutex) *mutex = 0; 31

CAS (Compare & Swap) Instruction Psuedo code definition of CAS instruction int CAS(int *value, int oldval, int newval) int temp = *value; if (*value == oldval) *value = newval; return temp; 32

Mutual Exclusion using CAS int mutex; init_lock (&mutex); do lock (&mutex); critical section unlock (&mutex); void init_lock (int *mutex) *mutex = 0; void lock (int *mutex) while(cas(&mutex, 0, 1)!= 0); void unlock (int *mutex) *mutex = 0; remainder section while(true); Fairness not guaranteed by any implementation! 33

Preemptive Vs. Non-preemptive Kernels Kernel is full of important shared data structures for maintaining file systems, memory allocation, interrupt handling, etc. How to ensure the OS is free from race conditions? Non preemptive kernels process executing in kernel mode cannot be preempted disable interrupts when process is in kernel mode what about multiprocessor systems? Preemptive kernels process executing in kernel mode can be preempted suitable for real-time programming more responsive 34

Roadmap Solutions for mutual exclusion Peterson s algorithm (Software) Synchronization instructions (Hardware) High-level synchronization mechanisms Mutex Semaphore Monitor 35

Spinlock using TestAndSet void init_lock (int *mutex) *mutex = 0; void lock (int *mutex) while(testandset(mutex)) ; void unlock (int *mutex) *mutex = 0; 36

What s Wrong With Spinlocks? Very wasteful Waiting thread continues to use CPU cycles While doing absolutely nothing but wait 100% CPU utilization, but no useful work done Power consumption, fan noise, Useful when You hold the lock only briefly Otherwise A better solution is needed 37

Mutex Blocking Lock Instead of spinning Let the thread sleep There can be multiple waiting threads In the meantime, let other threads use the CPU When the lock is released, wake-up one thread Pick one if there multiple threads were waiting 38

void mutex_init (mutex_t *lock) lock->value = 0; list_init(&lock->wait_list); spin_lock_init(&lock->wait_lock); More reading: mutex.c in Linux Thread waiting list To protect waiting list void mutex_lock (mutex_t *lock) while(testandset(&lock->value)) void mutex_unlock (mutex_t *lock) lock->value = 0; 39

void mutex_init (mutex_t *lock) lock->value = 0; list_init(&lock->wait_list); spin_lock_init(&lock->wait_lock); void mutex_lock (mutex_t *lock) while(testandset(&lock->value)) current->state = WAITING; list_add(&lock->wait_list, current); schedule(); void mutex_unlock (mutex_t *lock) lock->value = 0; More reading: mutex.c in Linux Thread waiting list To protect waiting list Thread state change Add the current thread to the waiting list Sleep or schedule another thread 40

void mutex_init (mutex_t *lock) lock->value = 0; list_init(&lock->wait_list); spin_lock_init(&lock->wait_lock); void mutex_lock (mutex_t *lock) spin_lock(&lock->wait_lock); while(testandset(&lock->value)) current->state = WAITING; list_add(&lock->wait_list, current); schedule(); spin_unlock(&lock->wait_lock); void mutex_unlock (mutex_t *lock) lock->value = 0; More reading: mutex.c in Linux Thread waiting list To protect waiting list Thread state change Add the current thread to the waiting list Sleep or schedule another thread 41

void mutex_init (mutex_t *lock) lock->value = 0; list_init(&lock->wait_list); spin_lock_init(&lock->wait_lock); void mutex_lock (mutex_t *lock) spin_lock(&lock->wait_lock); while(testandset(&lock->value)) current->state = WAITING; list_add(&lock->wait_list, current); spin_unlock(&lock->wait_lock); schedule(); spin_lock(&lock->wait_lock); spin_unlock(&lock->wait_lock); void mutex_unlock (mutex_t *lock) lock->value = 0; More reading: mutex.c in Linux Thread waiting list To protect waiting list Thread state change Add the current thread to the waiting list Sleep or schedule another thread 42

void mutex_init (mutex_t *lock) lock->value = 0; list_init(&lock->wait_list); spin_lock_init(&lock->wait_lock); void mutex_lock (mutex_t *lock) spin_lock(&lock->wait_lock); while(testandset(&lock->value)) current->state = WAITING; list_add(&lock->wait_list, current); spin_unlock(&lock->wait_lock); schedule(); spin_lock(&lock->wait_lock); spin_unlock(&lock->wait_lock); More reading: mutex.c in Linux Thread waiting list To protect waiting list Thread state change Add the current thread to the waiting list Sleep or schedule another thread void mutex_unlock (mutex_t *lock) lock->value = 0; if (!list_empty(&lock->wait_list)) wake_up_process(&lock->wait_list) Someone is waiting for the lock Wake-up a waiting thread 43

void mutex_init (mutex_t *lock) lock->value = 0; list_init(&lock->wait_list); spin_lock_init(&lock->wait_lock); void mutex_lock (mutex_t *lock) spin_lock(&lock->wait_lock); while(testandset(&lock->value)) current->state = WAITING; list_add(&lock->wait_list, current); spin_unlock(&lock->wait_lock); schedule(); spin_lock(&lock->wait_lock); spin_unlock(&lock->wait_lock); More reading: mutex.c in Linux Thread waiting list To protect waiting list Thread state change Add the current thread to the waiting list Sleep or schedule another thread void mutex_unlock (mutex_t *lock) spin_lock(&lock->wait_lock); lock->value = 0; if (!list_empty(&lock->wait_list)) wake_up_process(&lock->wait_list) spin_unlock(&lock->wait_lock); Someone is waiting for the lock Wake-up a waiting thread 44

High-level Synchronization Primitives Lock (mutex) is great, but Too low-level primitive Sometimes we need more powerful primitives Semaphore Binary/integer semaphore Monitor Condition variable 45

Semaphore High-level synchronization primitive Designed by Dijkstra in 1960 Definition Semaphore is an integer variable Only two operations are possible: P() or wait() or down() Wait until the semaphore value to become > 0, then decrements it by 1. V() or signal() or up() Increments the semaphore value by 1 46