CS252: Systems Programming

Slides:



Advertisements
Similar presentations
Global Environment Model. MUTUAL EXCLUSION PROBLEM The operations used by processes to access to common resources (critical sections) must be mutually.
Advertisements

Ch. 7 Process Synchronization (1/2) I Background F Producer - Consumer process :  Compiler, Assembler, Loader, · · · · · · F Bounded buffer.
Chapter 6: Process Synchronization
Silberschatz, Galvin and Gagne ©2009 Operating System Concepts – 8 th Edition, Chapter 6: Process Synchronization.
Process Synchronization. Module 6: Process Synchronization Background The Critical-Section Problem Peterson’s Solution Synchronization Hardware Semaphores.
Mutual Exclusion.
Operating Systems ECE344 Ding Yuan Synchronization (I) -- Critical region and lock Lecture 5: Synchronization (I) -- Critical region and lock.
Race Conditions. Isolated & Non-Isolated Processes Isolated: Do not share state with other processes –The output of process is unaffected by run of other.
Chapter 5 Concurrency: Mutual Exclusion and Synchronization Operating Systems: Internals and Design Principles, 6/E William Stallings Patricia Roy Manatee.
5.6 Semaphores Semaphores –Software construct that can be used to enforce mutual exclusion –Contains a protected variable Can be accessed only via wait.
Concurrency: Mutual Exclusion, Synchronization, Deadlock, and Starvation in Representative Operating Systems.
Threads 1 CS502 Spring 2006 Threads CS-502 Spring 2006.
Jonathan Walpole Computer Science Portland State University
Threads© Dr. Ayman Abdel-Hamid, CS4254 Spring CS4254 Computer Network Architecture and Programming Dr. Ayman A. Abdel-Hamid Computer Science Department.
CPS110: Implementing threads/locks on a uni-processor Landon Cox.
Race Conditions CS550 Operating Systems. Review So far, we have discussed Processes and Threads and talked about multithreading and MPI processes by example.
1 Interprocess Communication Race Conditions Two processes want to access shared memory at same time.
Instructor: Umar KalimNUST Institute of Information Technology Operating Systems Process Synchronization.
Synchronization CSCI 444/544 Operating Systems Fall 2008.
1 Race Conditions/Mutual Exclusion Segment of code of a process where a shared resource is accessed (changing global variables, writing files etc) is called.
CS252: Systems Programming Ninghui Li Final Exam Review.
Introduction to Threads CS240 Programming in C. Introduction to Threads A thread is a path execution By default, a C/C++ program has one thread called.
Concurrency, Mutual Exclusion and Synchronization.
Implementing Synchronization. Synchronization 101 Synchronization constrains the set of possible interleavings: Threads “agree” to stay out of each other’s.
CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 10: Threads and Thread Synchronization.
© Janice Regan, CMPT 300, May CMPT 300 Introduction to Operating Systems Introduction to Concurrency.
CS345 Operating Systems Threads Assignment 3. Process vs. Thread process: an address space with 1 or more threads executing within that address space,
Operating Systems CSE 411 Multi-processor Operating Systems Multi-processor Operating Systems Dec Lecture 30 Instructor: Bhuvan Urgaonkar.
COMP 111 Threads and concurrency Sept 28, Tufts University Computer Science2 Who is this guy? I am not Prof. Couch Obvious? Sam Guyer New assistant.
Operating Systems ECE344 Ashvin Goel ECE University of Toronto Mutual Exclusion.
CS333 Intro to Operating Systems Jonathan Walpole.
Chapter 7 -1 CHAPTER 7 PROCESS SYNCHRONIZATION CGS Operating System Concepts UCF, Spring 2004.
Java Thread and Memory Model
CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 11: Thread-safe Data Structures, Semaphores.
Department of Computer Science and Software Engineering
CS399 New Beginnings Jonathan Walpole. 2 Concurrent Programming & Synchronization Primitives.
Processes, Threads, and Process States. Programs and Processes  Program: an executable file (before/after compilation)  Process: an instance of a program.
CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 12: Thread-safe Data Structures, Semaphores.
1 Condition Variables CS 241 Prof. Brighten Godfrey March 16, 2012 University of Illinois.
© Janice Regan, CMPT 300, May CMPT 300 Introduction to Operating Systems Operating Systems Processes and Threads.
U NIVERSITY OF M ASSACHUSETTS A MHERST Department of Computer Science Computer Systems Principles Synchronization Emery Berger and Mark Corner University.
CSE 153 Design of Operating Systems Winter 2015 Lecture 5: Synchronization.
Operating Systems CMPSC 473 Signals, Introduction to mutual exclusion September 28, Lecture 9 Instructor: Bhuvan Urgaonkar.
Synchronization CSCI 3753 Operating Systems Spring 2005 Prof. Rick Han.
Implementing Lock. From the Previous Lecture  The “too much milk” example shows that writing concurrent programs directly with load and store instructions.
1 Critical Section Problem CIS 450 Winter 2003 Professor Jinhua Guo.
Implementing Mutual Exclusion Andy Wang Operating Systems COP 4610 / CGS 5765.
Mutual Exclusion -- Addendum. Mutual Exclusion in Critical Sections.
Big Picture Lab 4 Operating Systems C Andras Moritz
Web Server Architecture Client Main Thread for(j=0;j
1 Introduction to Threads Race Conditions. 2 Process Address Space Revisited Code Data OS Stack (a)Process with Single Thread (b) Process with Two Threads.
December 1, 2006©2006 Craig Zilles1 Threads & Atomic Operations in Hardware  Previously, we introduced multi-core parallelism & cache coherence —Today.
CSE 120 Principles of Operating
CS703 – Advanced Operating Systems
Background on the need for Synchronization
Threads Threads.
Lecture 11: Mutual Exclusion
Lecture 14: Pthreads Mutex and Condition Variables
Jonathan Walpole Computer Science Portland State University
Implementing Mutual Exclusion
Concurrency: Mutual Exclusion and Process Synchronization
Implementing Mutual Exclusion
Lecture 14: Pthreads Mutex and Condition Variables
Lecture 11: Mutual Exclusion
CSE 451: Operating Systems Autumn 2003 Lecture 7 Synchronization
CSE 451: Operating Systems Autumn 2005 Lecture 7 Synchronization
CSE 451: Operating Systems Winter 2003 Lecture 7 Synchronization
CSE 153 Design of Operating Systems Winter 19
CS333 Intro to Operating Systems
Chapter 6: Synchronization Tools
Presentation transcript:

CS252: Systems Programming Ninghui Li Based on Slides by Prof. Gustavo Rodriguez-Rivera Topic 11: Threads and Thread Synchronization

Clicker Question 1 from Mid-Term Consider the following yacc code: list : NUMBER { numbers[0] = $1; $$ = 1; } | list CM NUMBER { $$ = $1 + 1; if ($1<MAX_LENGTH) numbers[$1] = $3; When parsing [2, 3, -1, 4] When “list: NUMBER” is used, what is value of $1? 1 2 3 None of the above

Clicker Question 2 from Mid-Term Consider the following yacc code: list : NUMBER { numbers[0] = $1; $$ = 1; } | list CM NUMBER { $$ = $1 + 1; if ($1<MAX_LENGTH) numbers[$1] = $3; When parsing [2, 3, -1, 4] How many times is “list: list CM NUMBER” Used? 1 2 3 4 None of the above

Clicker Question 3 from Mid-Term Consider the following yacc code: list : NUMBER { numbers[0] = $1; $$ = 1; } | list CM NUMBER { $$ = $1 + 1; if ($1<MAX_LENGTH) numbers[$1] = $3; When parsing [2, 3, -1, 4] At the second time “list: list CM NUMBER” is used, ($1,$3)= (2,3) (3,-1) (3,4) (2,4) None of the above

Clicker Question 4 from Mid-term Exam (define (foo x y) (ifz x y (ifz y x (inc (foo (dec x) (dec y)))))) What is the value of (foo 2 4)? 1 2 3 None of the above

Clicker Question 5 from Mid-Term Consider the following code for the C programming question: struct queue * new_queue() { struct queue *q = (struct queue*) malloc(sizeof(struct queue)); q->head = NULL; q->tail = NULL; return q; } void enqueue (struct queue *q, char *v) { struct node *nd = (struct node*) malloc(sizeof(struct node)); nd->value = v; if (q->tail == NULL) { q->tail = nd; q->head = nd; } else { q->tail = nd; How many bugs there are in enqueue? 1 2 3 4 or more

Introduction to Threads A thread is a path execution By default, a C/C++ program has one thread called "main thread" that starts the main() function. main() --- printf( "hello\n" ); }

Introduction to Threads You can create multiple paths of execution using: POSIX threads ( standard ) pthread_create( &thr_id, attr, func, arg ) Windows CreateThread(attr, stack_size, func, arg, flags, &thr_id)

Introduction to Threads Every thread will have its own Stack PC – Program counter Set of registers State This information is stored in entry corresponding to the process in the process table entry Each thread will have its own function calls, and local variables.

Memory Layout of Threads A single-threaded process A process with two threads

Applications of Threads Concurrent Server applications Assume a web server that receives two requests: First, one request from a computer connected through a modem that will take 2 minutes. Then another request from a computer connected to a fast network that will take .01 secs. If the web server is single threaded, the second request will be processed only after 2 minutes. In a multi-threaded server, two threads will be created to process both requests simultaneously. The second request will be processed as soon as it arrives.

Application of Threads Taking Advantage of Multiple CPUs A program with only one thread can use only one CPU. If the computer has multiple cores, only one of them will be used. If a program divides the work among multiple threads, the OS will schedule a different thread in each CPU. This will make the program run faster.

Applications of Threads Interactive Applications. Threads simplify the implementation of interactive applications that require multiple simultaneous activities. Assume an Internet telephone application with the following threads: Player thread - receives packets from the internet and plays them. Capture Thread – captures sound and sends the voice packets Ringer Server – Receives incoming requests and tells other phones when the phone is busy. Having a single thread doing all this makes the code cumbersome and difficult to read.

Advantages and Disadvantages of Threads vs. Processes Fast thread creation - creating a new path of execution is faster than creating a new process with a new virtual memory address space and open file table. Fast context switch - context switching across threads is faster than across processes. Fast communication across threads – threads communicate using global variables that is faster and easier than processes communicating through pipes or files.

Advantages and Disadvantages of Threads vs. Processes Threads are less robust than processes – If one thread crashes due to a bug in the code, the entire application will go down. If an application is implemented with multiple processes, if one process goes down, the other ones remain running. Threads have more synchronization problems – Since threads modify the same global variables at the same time, they may corrupt the data structures. Synchronization through mutex locks and semaphores is needed for that. Processes do not have that problem because each of them have their own copy of the variables.

Synchronization Problems with Multiple Threads Threads share same global variables. Multiple threads can modify the same data structures at the same time This can corrupt the data structures of the program. Even the most simple operations, like increasing a counter, may have problems when running multiple threads.

Example of Problems with Synchronization // Global counter int counter = 0; void increment_loop(void *arg){ int i; int max = * ((int *)arg); for(i=0;i<max;i++){ int tmp = counter; tmp=tmp+1; counter=tmp; }

Example of Problems with Synchronization int main(){ pthread_t t1,t2; int max = 10000000; void *ret; pthread_create(&t1,NULL, increment_loop,(void*)&max); pthread_create(&t2,NULL, //wait until threads finish pthread_join(t1, &ret); pthread_join(t2, &ret); printf(“counter total=%d”,counter); }

Example of Problems with Synchronization We would expect that the final value of counter would be 10,000,000+ 10,000,000= 20,000,000 but very likely the final value will be less than that (E.g. 12804354). The context switch from one thread to another may change the sequence of events so the counter may loose some of the counts.

Example of Problems with Synchronization int counter = 0; void increment_loop(int max){ for(int i=0;i<max;i++){ a)int tmp = counter; b)tmp=tmp+1; c)counter=tmp; } int counter = 0; void increment_loop(int max){ for(int i=0;i<max;i++){ a)int tmp= counter; b)tmp=tmp+1; c)counter=tmp; } T1 T2

Example of Problems with Synchronization T0 (main) for(…) a)tmp1=counter (tmp1=0) (Context switch) Join t1 (wait) Starts running a)tmp2=counter (tmp2=0) b)tmp2=tmp2+1 c)counter=tmp2 Counter=1 a)b)c)a)b)c)… Counter=23 (context switch) b)tmp1=tmp1+1 c)counter=tmp1 time

Example of Problems with Synchronization As a result 23 of the increments will be lost. T1 will reset the counter variable to 1 after T2 increased it 23 times. Even if we use counter++ instead of a)b) c) we still have the same problem because the compiler will generate separate instructions that will look like a)b)c). Worse things will happen to lists, hash tables and other data structures in a multi-threaded program. The solution is to make certain pieces of the code Atomic.

Atomicity Atomic Section: A portion of the code that needs to appear to the rest of the system to occur instantaneously. Otherwise corruption of the variables is possible. An atomic section is also called sometimes a “Critical Section”

Atomicity by disabling interrupts On uni-processor, operation is atomic as long as context switch doesn’t occur during operation To achieve atomicity: disable interrupts upon entering atomic section, and enable upon leaving Context switches cannot happen with interrupt disabled. Available only in kernel mode; thus only used in kernel programming Other interrupts may be lost. Does not provide atomicity with multiprocessor

Achieving Atomicity in Concurrent Programs Our main goal is to learn how to write concurrent programs using synchronization tools We also explain a little bit how these tools are implemented Concurrent Program High-level synchronization tools (mutex locks, semaphores, condition variables, read/write locks) Hardware support (interrupt disable/enable, test & set, and so on)

Atomicity by Mutex Locks Mutex Locks are software mechanisms that enforce atomicity Only one thread can hold a mutex lock at a time When a thread tries to obtain a mutex lock that is held by another thread, it is put on hold (aka put to sleep, put to wait, blocked, etc). The thread may be waken up when the lock is available to the thread. Think of it as a locker in a gym with a lock and a key on it.

Mutex Locks Usage Declaration: Initialize Start atomic section #include <pthread.h> pthread_mutex_t mutex; Initialize pthread_mutex_init( &mutex, atttributes); Start atomic section pthread_mutex_lock(&mutex); End atomic section pthread_mutex_unlock(&mutex);

Example of Mutex Locks #include <pthread.h> int counter = 0; // Global counter pthread_mutex_t mutex; void increment_loop(int max){ for(int i=0;i<max;i++){ pthread_mutex_lock(&mutex); int tmp = counter; tmp=tmp+1; counter=tmp; pthread_mutex_unlock(&mutex); } Threads

Example of Mutex Locks int main(){ pthread_t t1,t2; pthread_mutex_init(&mutex,NULL); pthread_create(&t1,NULL, increment,10000000); pthread_create(&t2,NULL, //wait until threads finish pthread_join(&t1); pthread_join(&t2); printf(“counter total=%d”,counter); }

Example of Mutex Locks T1 T2 T0 (main) time for(…) mutex_lock(&m) a)tmp1=counter (tmp1=0) (Context switch) Join t1 (wait) Starts running mutex_lock(&m) (context switch) b)tmp1=tmp1+1 c)counter=tmp1 Counter=1 mutex_unlock(&m) a)tmp2=counter b)tmp2=tmp2+1 c)counter=tmp2 time

Example of Mutex Locks As a result, the steps a),b),c) will be atomic so the final counter total will be 10,000,000+ 10,000,000= 20,000,000 no matter if there are context switches in the middle of a)b)c)

Mutual Exclusion Mutex Locks enforce the mutual exclusion of all code between lock and unlock Mutex_lock(&m) A B C Mutex_unlock(&m) Mutex_lock(&m) D E F Mutex_unlock(&m)

Mutual Exclusion This means that the sequence ABC, DEF, can be executed as an atomic block without interleaving. Time ------------------------> T1 -> ABC ABC T2 -> DEF DEF T3 -> ABC DEF

Mutual Exclusion If different mutex locks are used (m1!=m2) then the sections are no longer atomic ABC and DEF can interleave Mutex_lock(&m2) D E F Mutex_unlock(&m2) Mutex_lock(&m1) A B C Mutex_unlock(&m1)

Test_and_set There is an instruction test_and_set that atomically set a variable to a certain value, and return its original value Pseudocode: int test_and_set(int *v){ int oldval = *v; *v = 1; return oldval; } This instruction is implemented by the CPU. You don’t need to implement it.

Implementing Mutex Locks using Test and Set (pseudo code) mutex_lock(mutex) { while (test_and_set (&mutex.m) != 0); if (mutex.lock) { mutex.queue( currentThread)); mutex.m = 0; setWaitState(); pthread_yield(); } else{ mutex.lock = true; } The mutex has the following fields: lock indicates whether the mutex has been locked by some thread queue stores all threads that are waiting for the mutex m ensures that only one thread is performing update to lock & queue Implements a busy-wait lock (aka spin lock).

Implementing Mutex Locks using Test and Set (pseudo code) Implements a busy-wait lock (aka spin lock). mutex_unlock() { while (test_and_set (&mutex.m) != 0); if (mutex.queue. nonEmpty) { t=mutex.dequeue(); t.setReadyState(); } else { mutex.lock=false; } mutex.m = 0; If some thread is waiting, get the first thread ready to run, keep the mutex locked, because now this thread holds the mutex.

Review Questions What does the system need to maintain for each thread? Why one wants to use multiple threads? What are the pros and cons of using threads vs. processes? What is an atomic section? Why disabling interrupt ensures atomicity on a single CPU machine?

Review Questions What is the meaning of the “test and set” primitive? What is a mutex lock? What is the semantics of lock and unlock calls on a mutex lock? How to use mutex locks to achieve atomicity? The exam does not require implementation of mutex lock.