Process Synchronization(2)

Similar documents
Process Synchronization(2)

Process Synchronization(2)

Prof. Hui Jiang Dept of Computer Science and Engineering York University

Chapter 7: Process Synchronization. Background. Illustration

Process Synchronization

Chapter 7: Process Synchronization. Background

Process Coordination

Background. Module 6: Process Synchronization. Bounded-Buffer (Cont.) Bounded-Buffer. Background

Module 6: Process Synchronization

Process Synchronization

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

Chapter 7: Process Synchronization!

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

Chapter 6: Process Synchronization

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

CSE 4/521 Introduction to Operating Systems

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

Chapter 6: Process Synchronization

Process Synchronization

Lesson 6: Process Synchronization

CHAPTER 6: PROCESS SYNCHRONIZATION

Semaphore. Originally called P() and V() wait (S) { while S <= 0 ; // no-op S--; } signal (S) { S++; }

COP 4225 Advanced Unix Programming. Synchronization. Chi Zhang

Processes. Rafael Ramirez Dep Tecnologia Universitat Pompeu Fabra

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

Process Synchronization: Semaphores. CSSE 332 Operating Systems Rose-Hulman Institute of Technology

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

Chapter 6: Process Synchronization

Dept. of CSE, York Univ. 1

Interprocess Communication By: Kaushik Vaghani

Process Synchronization

High-level Synchronization

Chapter 5: Process Synchronization

CS370 Operating Systems

Chapter 5: Process Synchronization

Synchronization Principles

Synchronization. CS 475, Spring 2018 Concurrent & Distributed Systems

Module 6: Process Synchronization

Process Synchronization

Chapter 7 Process Synchronization

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

Computer Science 322 Operating Systems Mount Holyoke College Spring Topic Notes: Process Synchronization Examples

Chapter 5: Process Synchronization

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

Chapter 6: Process Synchronization. Module 6: Process Synchronization

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

Chapter 6: Synchronization

Process Synchronization

Process Synchronization

Process Synchronization

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

Process Synchronization. studykorner.org

CS420: Operating Systems. Process Synchronization

1. Motivation (Race Condition)

Lecture Outline. CS 5523 Operating Systems: Concurrency and Synchronization. a = 0; b = 0; // Initial state Thread 1. Objectives.

CS370 Operating Systems

Process Synchronization

Introduction to Operating Systems

Process Management And Synchronization

EI 338: Computer Systems Engineering (Operating Systems & Computer Architecture)

$ %! 0,-./ + %/ 0"/ C (" &() + A &B' 7! .+ N!! O8K + 8 N. (Monitors) 3+!

Chapter 6 Process Synchronization

Lecture 9: Thread Synchronizations. Spring 2016 Jason Tang

Synchronization Classic Problems

CS370: System Architecture & Software [Fall 2014] Dept. Of Computer Science, Colorado State University

CSE Opera,ng System Principles

CS370 Operating Systems

Process Synchronization. CISC3595, Spring 2015 Dr. Zhang

Chapter 6 Synchronization

Process Co-ordination OPERATING SYSTEMS

CS3733: Operating Systems

Synchronization Basic Problem:

Process/Thread Synchronization

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

Chapter 6: Process Synchronization

QUESTION BANK. UNIT II: PROCESS SCHEDULING AND SYNCHRONIZATION PART A (2 Marks)

Synchronization. Race Condition. The Critical-Section Problem Solution. The Synchronization Problem. Typical Process P i. Peterson s Solution

Learning Outcomes. Concurrency and Synchronisation. Textbook. Concurrency Example. Inter- Thread and Process Communication. Sections & 2.

Semaphores. To avoid busy waiting: when a process has to wait, it will be put in a blocked queue of processes waiting for the same event

Semaphores. Semaphores. Semaphore s operations. Semaphores: observations

CS3502 OPERATING SYSTEMS

Concurrency: Mutual Exclusion and

Chapter 6: Process Synchronization

OS Process Synchronization!

Concurrency and Synchronisation

Lecture 5: Inter-process Communication and Synchronization

Process/Thread Synchronization

UNIT II PROCESS MANAGEMENT 9

Concurrency and Synchronisation

Real-Time Operating Systems M. 5. Process Synchronization

Operating systems. Lecture 12

Operating Systems Antonio Vivace revision 4 Licensed under GPLv3

Synchronization Principles II

Classic Problems of Synchronization

Semaphores (by Dijkstra)

Semaphores. Jinkyu Jeong Computer Systems Laboratory Sungkyunkwan University

Chapter 6: Process Synchronization. Operating System Concepts 9 th Edit9on

Unit 1: Introduction

9/29/2014. CS341: Operating System Mid Semester Model Solution Uploaded Semaphore ADT: wait(), signal()

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

Transcription:

EECS 3221.3 Operating System Fundamentals No.6 Process Synchronization(2) Prof. Hui Jiang Dept of Electrical Engineering and Computer Science, York University Semaphores Problems with the software solutions. Complicated programming, not flexible to use. Not easy to generalize to more complex synchronization problems. Semaphore (a.k.a. lock): an easy-to-use synchronization tool An integer variable S wait(s) { while (S<=0) ; S-- ; signal(s) { S++ ; 1

Semaphore usage (1): the n-process critical-section problem The n processes share a semaphore, Semaphore mutex ; // mutex is initialized to 1. Process Pi do { " "! wait(mutex); critical section of Pi! signal(mutex);" remainder section of Pi!! while (1);" " " Semaphore usage (2): as a General Synchronization Tool Execute B in P j only after A executed in P i Use semaphore flag initialized to 0 Pi Pj A signal (flag) ; wait (flag) ; B 2

Spinlock vs. Sleeping Lock Previous definition of semaphore requires busy waiting. It is called spinlock. spinlock does not need context switch, but waste CPU cycles in a continuous loop. spinlock is OK only for lock waiting is very short. Semaphore without busy-waiting, called sleeping lock: In defining wait(), rather than busy-waiting, the process makes system calls to block itself and switch to waiting state, and put the process to a waiting queue associated with the semaphore. The control is transferred to CPU scheduler. In defining signal(), the process makes system calls to pick a process in the waiting queue of the semaphore, wake it up by moving it to the ready queue to wait for CPU scheduling. Sleeping Lock is good only for long waiting. Spinlock Implementation(1) In uni-processor machine, disabling interrupt before modifying semaphore. wait(s) { do { Disable_Interrupt; if(s>0) { S-- ; Enable_Interrupt ; return ; Enable_Interrupt ; while(1) ; signal(s) { Disable_Interrupt ; S++ ; Enable_Interrupt ; return ; 3

Spinlock Implementation(1) In uni-processor machine, disabling interrupt before modifying semaphore. wait(s) { do { Disable_Interrupt; if(s>0) { S-- ; Enable_Interrupt ; return ; Enable_Interrupt ; while(1) ; signal(s) { Disable_Interrupt ; S++ ; Enable_Interrupt ; return ; Spinlock Implementation(2) In multi-processor machine, inhibiting interrupt of all processors is not easy and efficient. Use software solution to critical-section problems e.g., bakery algorithm. Treat wait() and signal() as critical sections. Or use hardware support if available: TestAndSet() or Swap() Example: implement spinlock among two processes. Use Peterson s algorithm for protection. Shared data: Semaphore S ; Initially S=1 boolean flag[2]; initially flag [0] = flag [1] = false. int turn; initially turn = 0 or 1. 4

Spinlock Implementation(3) wait(s) { int i=process_id(); //0 P0, 1 P1 int j=(i+1)%2 ; do { flag [ i ]:= true; //request to enter turn = j; while (flag [ j ] and turn = j) ; if (S >0) { //critical section S--; flag [ i ] = false; return ; else { flag [ i ] = false; while (1); signal(s) { int i=process_id(); //0 P0, 1 P1 int j=(i+1)%2 ; flag [ i ]:= true; //request to enter turn = j; while (flag [ j ] and turn = j) ; S++; //critical section flag [ i ] = false; return ; Spinlock Implementation(2) In multi-processor machine, inhibiting interrupt of all processors is neither easy nor efficient. Use software solution to critical-section problems e.g., bakery algorithm. Treat wait() and signal() as critical sections. Or use hardware support if available: TestAndSet() or Swap() Example: implement spinlock between N processes. Use Bakery algorithm for protection. Shared data: Semaphore S ; Initially S=1 boolean choosing[n]; (Initially false) int number[n]; (Initially 0 ) 5

wait(s) { int i=process_id(); Spinlock Implementation(3) choosing[ i ] = true; number[ i ] = max(number[0], number[1],, number [N 1])+1; choosing[ i ] = false; for (j = 0; j < N; j++) { while (choosing[ j ]) ; while ((number[ j ]!= 0) && (number[ j ],j)< (number[ i ],i)) ; if (S >0) { //critical section S--; number[i] = 0; return ; number[i] = 0; while (1); signal(s) { int i=process_id(); choosing[ i ] = true; number[ i ] = max(number[0], number[1],, number [N 1])+1; choosing[ i ] = false; for (j = 0; j < N; j++) { while (choosing[ j ]) ; while ((number[ j ]!= 0) && (number[ j ],j)< (number[ i ],i)) ; S++; //critical section number[i] = 0; return ; Sleeping Lock (I) Define a sleeping lock as a structure: typedef struct { int value; // Initialized to 1 struct process *L; semaphore; Assume two system calls: block() suspends the process that invokes it. wakeup(p) resumes the execution of a blocked process P. Equally applicable to multiple threads in one process. 6

Sleeping Lock (II) Semaphore operations now defined as: wait(s): S.value--; if (S.value < 0) { add this process to S.L; block(); signal(s): S.value++; if (S.value <= 0) { remove a process P from S.L; wakeup(p); Two Types of Semaphores: Binary vs. Counting Binary semaphore (a.k.a. mutex lock) integer value can range only between 0 and 1; simpler to implement by hardware. Counting semaphore integer value can range over an unrestricted domain. We can implement a counting semaphore S by using two binary semaphore. Binary semaphore is normally used as mutex lock. Counting semaphore can be used as shared counter, load controller, etc 7

Implementing counting semaphore with two Binary Semaphores Data structures: binary-semaphore S1, S2; int C: Initialization: S1 = 1 S2 = 0 C = initial value of semaphore S Implementing S wait(s) operation: wait_binary(s1); C--; if (C < 0) { signal_binary(s1); wait_binary(s2); signal_binary(s1); signal(s) operation: wait_binary(s1); C ++; if (C <= 0) signal_binary(s2); else signal_binary(s1); 8

Classical Synchronization Problems The Bounded-Buffer P-C Problem The Readers-Writers Problem The Dining-Philosophers Problem Bounded-Buffer P-C Problem A producer produces some data for a consumer to consume. They share a bounded-buffer for data transferring. Shared memory: A buffer to hold at most n items Shared data (three semaphores) Semaphore filled, empty; /*counting*/ Semaphore mutex; /* binary */ Initially: filled = 0, empty = n, mutex = 1 9

Bounded-Buffer Problem: Producer Process do { produce an item in nextp wait(empty); wait(mutex); add nextp to buffer signal(mutex); signal(filled); while (1); Bounded-Buffer Problem: Consumer Process do { wait(filled) wait(mutex); remove an item from buffer to nextc signal(mutex); signal(empty); consume the item in nextc while (1); 10

The Readers-Writers Problem Many processes concurrently access a data object Readers: only read the data. Writers: update and may write the data object. Only writer needs exclusive access of the data. The first readers-writers problem: Unless a writer has already obtained permission to use the shared data, readers are always allowed to access data. May starve a writer. The second readers-writer problem: Once a writer is ready, the writer performs its write as soon as possible. May starve a reader. The 1 st Readers-Writers Problem Use semaphore to implement 1 st readers-writer problem Shared data: int readcount = 0 ; // keep track the number of readers // accessing the data object Semaphore mutex = 1 ; // mutually exclusive access to // readcount among readers Semaphore wrt = 1 ; // mutual exclusion to the data object // used by every writer //also set by the 1 st reader to read the data // and clear by the last reader to finish reading 11

The 1 st Readers-Writers Problem Writer Process! wait(wrt);"! writing is performed!! signal(wrt);" Reader Process! wait(mutex);" readcount++; "" if (readcount == 1) wait(wrt);" signal(mutex);"! reading is performed!! wait(mutex);" readcount--;" if (readcount == 0) signal(wrt);" signal(mutex);" The Dining-Philosophers Problem Five philosophers are thinking or eating Using only five chopsticks When thinking, no need for chopsticks. When eating, need two closest chopsticks. Can pick up only one chopsticks Can not get the one already in the hand of a neighbor. 12

The Dining-Philosophers Problem: Semaphore Solution Represent each chopstick with a semaphore Semaphore chopstick[5]; // Initialized to 1 Philosopher i (i=0,1,2,3,4) do {" wait(chopstick[i]) ;" wait(chopstick[(i+1) % 5]) ;" " eat! " signal(chopstick[i]);" signal(chopstick[(i+1) % 5]);" " think! " while (1); Incorrect Semaphore Usage Mistake 1: Mistake 2: Mistake 3: Mistake 4: signal(mutex) ; Critical Section wait(mutex) ; wait(mutex) ; Critical Section wait(mutex) ; wait(mutex) ; Critical Section Critical Section signal(mutex) ; 13

Starvation and Deadlock Starvation infinite blocking. A process may never be removed from the semaphore queue in which it is suspended. Deadlock two or more processes are waiting infinitely for an event that can be caused by only one of the waiting processes. Let S and Q be two semaphores initialized to 1 P 0 P 1 wait(s); wait(q); wait(q); wait(s); signal(s); signal(q); signal(q) signal(s); double_rq_lock() in Linux Kernel double_rq_lock(struct runqueue *rq1, struct runqueue *rq2) { if (rq1 == rq2) spinlock(&rq1->lock); else { if (rq1 < rq2) { spin_lock(&rq1->lock); spin_lock(&rq2->lock); else { spin_lock(&rq2->lock); spin_lock(&rq1->lock); 14

Why not? double_rq_lock(struct runqueue *rq1, struct runqueue *rq2) { spin_lock(&rq1->lock); spin_lock(&rq2->lock); struct runqueue *RdQ, *DevQ1, *DevQ2, P1 double_rq_lock(rdq,devq1); P2 double_rq_lock(devq1,rdq); double_rq_unlock() in Linux Kernel double_rq_unlock(struct runqueue *rq1, struct runqueue *rq2) { spin_unlock(&rq1->lock); if (rq1!= rq2) spin_unlock(&rq2->lock); 15

Pthread Semaphore Pthread semaphores for multi-threaded programming in Unix/Linux: Pthread Mutex Lock (binary semaphore) Pthread Semaphore (general counting semaphore) Pthread Mutex Lock #include <pthread.h> /*declare a mutex variable*/ pthread_mutex_t mutex ; /* create a mutex lock */ pthread_mutex_init (&mutex, NULL) ; /* acquire the mutex lock */ pthread_mutex_lock(&mutex) ; /* release the mutex lock */ pthread_mutex_unlock(&mutex) ; 16

Using Pthread Mutex Locks Use mutex locks to solve critical section problems: #include <pthread.h> pthread_mutex_t mutex ; pthread_mutex_init(&mutex, NULL) ; pthread_mutex_lock(&mutex) ; /*** critical section ***/ pthread_mutex_unlock(&mutex) ; Pthread Semaphores #include <semaphore.h> /*declare a pthread semaphore*/ sem_t sem ; /* create and initialize a semaphore */ sem_init (&sem, flag, initial_value) ; /* wait() operation */ sem_wait(&sem) ; /* signal() operation */ sem_post(&sem) ; 17

Using Pthread semaphore Using Pthread semaphores for counters shared by multiple threads: #include <semaphore.h> sem_t counter ; sem_init(&counter, 0, 0) ; /* initially 0 */ sem_post(&counter) ; /* increment */ sem_wait(&counter) ; /* decrement */ volatile in multithread program In multithread programming, a shared global variable must be declared as volatile to avoid compiler s optimization which may cause conflicts: volatile int data ; volatile char buffer[100] ; 18

Process Synchronization for multiple processes in Unix In Unix, a shared global variable must be created with the following systems calls: #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmaddr); int shmctl(int shmid, int cmd, struct shmid_ds *buf); #include <time.h> nanosleep() int nanosleep(const struct timespec *req, struct timespec *rem); struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds 0-999,999,999 */ ; 19