770 likes | 1.17k Views
Lecture #5. Concurrency: Mutual Exclusion and Synchronization (ìƒí˜¸ë°°ì œì™€ ë™ê¸°í™”). 프로그램 실행 ( Program Execution). í”„ë¡œê·¸ëž¨ì€ í”„ë¡œì„¸ìŠ¤ì˜ ì§‘í•©ìœ¼ë¡œ ì´ë£¨ì–´ì§„다 프로그램 실행( Program Execution) 순차 실행 (Sequential Execution) 병행 실행( Concurrent Execution) ë³‘ë ¬ 실행( Parallel Execution) 병행성(ë™ì‹œì„±: Concurrency) > ë³‘ë ¬ì„±( Parallelism).
E N D
Lecture #5 Concurrency: Mutual Exclusion and Synchronization (상호배제와 동기화) 신라대학교 컴퓨터공학과 - 운영체제
프로그램 실행 (Program Execution) • 프로그램은 프로세스의 집합으로 이루어진다 • 프로그램 실행(Program Execution) • 순차 실행(Sequential Execution) • 병행 실행(Concurrent Execution) • 병렬 실행(Parallel Execution) • 병행성(동시성:Concurrency) > 병렬성(Parallelism) 신라대학교 컴퓨터공학과 - 운영체제
병렬 실행(Concurrent Execution)의 문제점 • 병행 프로세스들(Concurrent processes (or threads))는 일반적으로 데이터와 자원을 공유한다 • 만약 공유 데이터에 대한 접근을 적절하게 제어하지 않으면 일부 프로세스는 잘못된 데이터를 접근하게 된다 • 병행 프로세스의 실행 결과는 병행 프로세스 간의 실행이 섞이는 순서에 의하여 결정되어 진다 신라대학교 컴퓨터공학과 - 운영체제
공유 데이터 접근의 예 • 3 variables: A, B, C which are shared by thread T1 and thread T2 • T1 computes C = A+B • T2 transfers amount X from A to B • T2 must do: A = A -X and B = B+X (so that A+B is unchanged) • But if T1 computes A+B after T2 has done A = A-X but before B = B+X then T1 will not obtain the correct result for C = A + B • The resource sharing requires the synchronization between threads 신라대학교 컴퓨터공학과 - 운영체제
생산자 프로세스 (Producer Process) 소비자 프로세스 (Consumer Process) in out 병행 실행의 예(1) • 생산자 & 소비자 프로세스 1 n n-1 2 3 … 4 신라대학교 컴퓨터공학과 - 운영체제
병행 실행의 예(2) • 소비자 프로세스 코드 repeat while count == 0 do no-op; nextc = buffer[out]; out = (out + 1) mod n; count = count - 1; . . . nextc에서 한 항목을 소비 . . . until FALSE; • 생산자 프로세스 코드 repeat . . . nextp에서 한 항목을 생산 . . . while count == n do no-op; buffer[in] = nextp; in = (in + 1) mod n; count = count + 1; until FALSE; 신라대학교 컴퓨터공학과 - 운영체제
병행 실행의 예(3) • 생산자 프로세스 코드 count = count + 1; register1 = count register1 = register1 + 1 count = register1 • 소비자 프로세스 코드 count = count - 1; register2 = count register2 = register2 - 1 count = register2 신라대학교 컴퓨터공학과 - 운영체제
병행 실행의 예(4) • 생산자 프로세스와 소비자 프로세스가 병행 실행되는 경우 : T0: 생산자 register1 = count {register1 = 5} T1: 생산자 register1 = register1+1 {register1 = 6} T2: 소비자 register2 = count {register2 = 5} T3: 소비자 register2 = register2-1 {register2 = 4} T4: 소비자 count = register2 {count = 4} T5: 생산자 count = register1 {count = 6} • 문제점: 두 개의 프로세스가 동시에 count 변수에 접근 • 해결책: count 변수에 접근하는 순서를 제어, 즉 한번에 하나의 프로세스만이 count 변수에 접근하도록 제어 • 프로세스 동기화(Process Synchronization)가 필요 신라대학교 컴퓨터공학과 - 운영체제
병렬 실행에서의 자원 공유 • 병행 실행에서의 자원 공유에 따른 문제점 • 상호 배제(Mutual Exclusion) • 병행 프로세스들이 공유 자원을 동시에 접근함으로써 전혀 예기치 못하는 결과가 발생할 수 있다 • 한 시점에 공유 자원을 접근하는 실행 단위(프로세스 또는 쓰레드)는 단지 하나만 존재하여야 한다 • 실행 동기화 (Execution Synchronization) • 하나의 프로그램은 구성하는 병행 프로세스들은 상호간에 일련의 실행 순서에 맞추어 실행되어야 한다 • 예: 생산자-소비자 모델에서 생산자가 버퍼에 데이터를 저장하여야 소비자가 데이터 처리가 가능해진다 신라대학교 컴퓨터공학과 - 운영체제
임계구역(critical section) 문제(1) • 임계구역(Critical Section: CS) • 하나의 프로세스가 공유 데이터를 접근하는 코드를 실행할 때에 그 프로세스가 임계구역에 있다라고 정의 • 상호 배제(Mutual Exclusion) • The execution of critical sections must be mutually exclusive • 다중 프로세서 환경에서도 임계구역에서 실행하고 있는 프로세스는 오직 하나만 있어야 한다 • 상호 배제에 대한 접근법 • 병행 실행되는 각 프로세스는 임계구역에 들어가기 위해서는 임계구역 실행에 대한 허용(permission)을 얻어야 한다 신라대학교 컴퓨터공학과 - 운영체제
임계구역(critical section) 문제(2) • 임계 구역(critical section) 문제 • 프로세스 동기화 프로토콜을 설계 • 병행 프로세스의 실행 결과가 실행 순서에 상관없이 일정하도록 프로세스 상호간에 협조하는 프로토콜을 설계 신라대학교 컴퓨터공학과 - 운영체제
임계 구역 문제의 기본 가정(1) • 병행 프로세스의 전형적인 구조 • 진입 구역(entry section) • 임계 구역에 진입하기 위해 허용을 요구하는 코드 영역 • 출구 구역(exit section) • 임계 구역 다음에 나오는 영역으로 임계 구역을 벗어나기 위한 코드 영역 • 잔류 구역(remainder section) • 프로그램의 나머지 코드 영역 신라대학교 컴퓨터공학과 - 운영체제
병행 프로세스의 전형적인 구조(계속) 임계 구역 문제의 기본 가정(2) Repeat entry section critical section exit section remainder section until FALSE 신라대학교 컴퓨터공학과 - 운영체제
각 프로세스는 0이 아닌 속도로 실행된다 n개의 프로세스의 상대적인 실행 속도에 대한 가정은 없다 n 개의 프로세스의 실행순서에 대한 가정은 없다 많은 CPU가 존재할 수 있다 동일한 메모리 영역을 동시에 접근할 수 없도록 제어하는 메모리 하드웨어가 있다 임계 구역 문제에 대한 해결책을 찾는 것은 진입 구역과 출구 구역의 코드를 정의하는 것이다 임계 구역 문제의 기본 가정(3) 신라대학교 컴퓨터공학과 - 운영체제
임계 구역 문제의 해결책에 대한 세 가지 요구조건(1) • 상호배제(Mutual Exclusion) • 항상 최대한 하나의 프로세스만이 임계구역에서 실행할 수 있다 • 한 프로세스가 임계구역에 있으면 다른 프로세스는 임계구역에 진입할 수 없다 • 진행(Progress) • 임계구역에 있는 프로세스가 없고 다른 프로세스들이 임계 구역 진입을 요구할 때에 단지 잔류 구역에서 실행되고 있지 않은 프로세스 만이 임계 구역에 진입할 수 있다 • 임계 구역 진입 프로세스 선택은 무기한 연기될 수 없다 • Deadlock Avoidance 신라대학교 컴퓨터공학과 - 운영체제
임계 구역 문제의 해결책에 대한 세 가지 요구조건(2) • 한계 대기(Bounded Waiting) • 하나의 프로세스가 임계 구역 진입을 요청한 후에 진입이 허용될 때까지 다른 프로세스가 임계 구역을 진입하는 회수(시간)에 한계를 두어야 한다 • 그렇지 않으면 진입 요청한 프로세스는 기아상태(starvation)가 될 수 있다 신라대학교 컴퓨터공학과 - 운영체제
임계 구역 문제 해결책의 분류 • 소프트웨어 해결책(Software solutions) • software algorithms who’s correctness does not rely on any other assumptions • 하드웨어 해결책(Hardware solutions) • rely on some special machine instructions • 운영체제 해결책(Operation System solutions) • OS provide some functions and data structures to the programmer 신라대학교 컴퓨터공학과 - 운영체제
소프트웨어 해결책 • 2개의 프로세스를 위한 해결책 • Algorithm 1 and 2 are incorrect • Algorithm 3 is correct (Peterson’s algorithm) • n 개의 프로세스를 위한 해결책 • the bakery algorithm • Notation • 2 processes: P0 and P1 • When presenting processes, Pi, Pj always denote the other processes (i != j) 신라대학교 컴퓨터공학과 - 운영체제
The shared variable turn is initialized (to 0 or 1) before executing any Pi Pi’s critical section is executed iff turn = i Pi is busy waiting if Pj is in CS: mutual exclusion is satisfied Progress requirement is not satisfied Algorithm 1 Process Pi: repeat while(turn!=i){}; CS turn:=j; RS until FALSE • Ex: P0 has a large RS and P1 has a small RS. If turn=0, P0 enter its CS and then its long RS (turn=1). P1 enter its CS and then its RS (turn=0) and tries again to enter its CS: request refused! He has to wait that P0 leaves its RS. 신라대학교 컴퓨터공학과 - 운영체제
Keep one BOOL variable for each process: flag[0] and flag[1] Pi signals that it is ready to enter it’s CS by: flag[i]:=true Mutual Exclusion is satisfied but not the progress requirement If we have the sequence: T0: flag[0]:=true T1: flag[1]:=true Both process will wait forever to enter their CS: we have a deadlock Algorithm 2 Process Pi: repeat flag[i]:=true; while(flag[j]){}; CS flag[i]:=false; RS until FALSE 신라대학교 컴퓨터공학과 - 운영체제
Initialization: flag[0]:=flag[1]:=false turn := 0 or 1 Willingness to enter CS is specified by flag[i]:=true If both processes attempt to enter their CS simultaneously, only one turn value will last Exit section: specifies that Pi is unwilling to enter CS Algorithm 3 (Peterson’s algorithm) Process Pi: repeat flag[i]:=true; turn:=j; do {} while (flag[j]and turn=j); CS flag[i]:=false; RS until FALSE 신라대학교 컴퓨터공학과 - 운영체제
Algorithm 3: proof of correctness(1) • Mutual exclusion is preserved since: • P0 and P1 are both in CS only if flag[0] = flag[1] = true and only if turn = i for each Pi (impossible) • The progress and bounded waiting requirements are satisfied: • Pi cannot enter CS only if stuck in while() with condition flag[ j] = true and turn = j. • If Pj is not ready to enter CS then flag[ j] = false and Pi can then enter its CS 신라대학교 컴퓨터공학과 - 운영체제
Algorithm 3: proof of correctness(2) • If Pj has set flag[ j]=true and is in its while(), then either turn=i or turn=j • If turn=i, then Pi enters CS. If turn=j then Pj enters CS but will then reset flag[ j]=false on exit: allowing Pi to enter CS • but if Pj has time to reset flag[ j]=true, it must also set turn=i • since Pi does not change value of turn while stuck in while(), Pi will enter CS after at most one CS entry by Pj (bounded waiting) 신라대학교 컴퓨터공학과 - 운영체제
n-process solution: The bakery algorithm (1) • Before entering their CS, each Pi receives a number. Holder of smallest number enter CS (like in bakeries, ice-cream stores...) • When Pi and Pj receives the same number: • if I < j then Pi is served first, else Pj is served first • Pi resets its number to 0 in the exit section • Notation: • (a, b) < (c, d) if a < c or if a = c and b < d • max(a0,…,ak) is a number b such that b >= ai for i=0,..k 신라대학교 컴퓨터공학과 - 운영체제
The bakery algorithm (2) • Shared data: • choosing: array[0..n-1] of boolean; • initialized to false • number: array[0..n-1] of integer; • initialized to 0 • Correctness relies on the following fact: • If Pi is in CS and Pk has already chosen its number[k]!= 0, then (number[i], i) < (number[k], k) 신라대학교 컴퓨터공학과 - 운영체제
The bakery algorithm (3) Process Pi: repeat choosing[i]:=true; number[i]:=max(number[0]..number[n-1])+1; choosing[i]:=false; for j:=0 to n-1 do { while (choosing[j]) {}; while (number[j]!=0 and (number[j],j)<(number[i],i)){}; } CS number[i]:=0; RS until FALSE 신라대학교 컴퓨터공학과 - 운영체제
소프트웨어 해결책의 단점 • 임계 구역에 진입하기를 원하는 프로세스는 busy waiting한다 • 필요 없이 CPU 시간을 낭비한다 • 임계 구역이 긴 경우에는 임계 구역 진입을 기다리는 프로세스를 대기 상태로 전환하는 것( blocking)이 효과적이다 신라대학교 컴퓨터공학과 - 운영체제
On a uniprocessor: mutual exclusion is preserved but efficiency of execution is degraded while in CS, we cannot interleave execution with other processes that are in RS On a multiprocessor: mutual exclusion is not preserved Generally not an acceptable solution 하드웨어 해결책: interrupt disabling Process Pi: repeat disable interrupts critical section enable interrupts remainder section until FALSE 신라대학교 컴퓨터공학과 - 운영체제
하드웨어 해결책: special machine instructions • 일반적으로 하나의 메모리 영역에 대한접근은 배타적이다 • 하나의 메모리에 대해 동시에 여러 개의 접근이 이루어질 수 없다 • 명령어 확장: 같은 메모리 영역에 2 가지의 동작을 원자적으로 (atomically)실행하는 명령어 제공 • 예 - reading and writing a memory location • test-and-set, xchg(swap) instructions • The execution of such an instruction is mutually exclusive (even with multiple CPUs) • 상호배제 문제를 해결하기 위해 이용 신라대학교 컴퓨터공학과 - 운영체제
A C++ description of test-and-set instruction: test-and-set instruction(1) bool testset(int& i) { if (i==0) { i=1; return true; } else { return false; } } 신라대학교 컴퓨터공학과 - 운영체제
An algorithm that uses testset instruction for Mutual Exclusion: Shared variable b is initialized to 0 Only the first Piwho sets b enter CS test-and-set instruction(2) Process Pi: repeat repeat{} until testset(b); CS b:=0; RS until FALSE 신라대학교 컴퓨터공학과 - 운영체제
test-and-set instruction (3) • Mutual exclusion is preserved • if Pi enter CS, the other Pj are busy waiting • Problem: still using busy waiting • When Pi exit CS, the selection of the Pj who will enter CS is arbitrary: no bounded waiting • Hence starvation is possible 신라대학교 컴퓨터공학과 - 운영체제
Processors (ex: Pentium) often provide an atomic xchg(a,b) instruction that swaps the content of a and b. void xchg(int a, int b) { int temp; temp = a; a = b; b = temp; } xchg(a,b) suffers from the same drawbacks as test-and-set instruction xchg instruction 신라대학교 컴퓨터공학과 - 운영체제
Shared variable b is initialized to 0 Each Pi has a local variable k The only Pi that can enter CS is the one who finds b=0 This Pi excludes all the other Pj by setting b to 1 Using xchg for mutual exclusion Process Pi: repeat k:=1 repeat xchg(k,b) until k=0; CS b:=0; RS until FALSE 신라대학교 컴퓨터공학과 - 운영체제
운영체제 해결책 • 운영체제는 프로세스 동기화를 위한 도구를 제공 • 세마포어(Semaphores) • 모니터(Monitors) • 메시지 전송(Message Passing) 신라대학교 컴퓨터공학과 - 운영체제
세마포어(Semaphores) (1) • 정의 definition • Busy waiting을 요구하지 않는 Synchronization tool (provided by the OS) • 운영체제가 제공하는 하나의 자원 • 세마포어 S는 다음의 2 atomic and mutually exclusive operations에 의해서만 접근할 수 있는 정수 • wait(S) • signal(S) • Busy waiting avoidance • when a process has to wait, it will be put in a blocked queue of processes waiting for the same event 신라대학교 컴퓨터공학과 - 운영체제
A semaphore is a record (structure): wait 연산에서 프로세스가 세마포어 S을 기다려야 할 때에는 대기 상태로 전환되어 세마포어 큐에 들어간다 signal 연산은 세마포어 큐로부터 하나의 프로세스를 꺼내어 준비 큐에저장한다 세마포어(Semaphores) (2) type semaphore = record count: integer; queue: list of process end; var S: semaphore; 신라대학교 컴퓨터공학과 - 운영체제
세마포어 연산 (atomic) wait(S): S.count--; if (S.count<0) { block this process place this process in S.queue } signal(S): S.count++; if (S.count<=0) { remove a process P from S.queue place this process P on ready list } • S.count must be initialized to a nonnegative value (depending on application) 신라대학교 컴퓨터공학과 - 운영체제
Semaphores: observations (1) • S.count >=0 일 때 • the number of processes that can execute wait(S) without being blocked = S.count • S.count<0 일 때 • the number of processes waiting on S = |S.count| • Atomicity and mutual exclusion • no 2 process can be in wait(S) and signal(S) (on the same S) at the same time (even with multiple CPUs) • The blocks of code defining wait(S) and signal(S) are critical sections 신라대학교 컴퓨터공학과 - 운영체제
Semaphores: observations (2) • The critical sections defined by wait(S) and signal(S) are very short • typically 10 instructions • Solutions: • uniprocessor: disable interrupts during these operations (i.e: for a very short period) • This does not work on a multiprocessor machine • multiprocessor: use previous software or hardware schemes • The amount of busy waiting should be small. 신라대학교 컴퓨터공학과 - 운영체제
Using semaphores for solving critical section problems • n 개의 프로세스에 적용 • S.count을 1로 초기화 • 단지 하나의 프로세스만 CS 진입이 허용된다 (mutual exclusion) • S.count을 k로 초기화하면 k 개의 프로세스가 CS에 진입할 수 있다 Process Pi: repeat wait(S); CS signal(S); RS until FALSE 신라대학교 컴퓨터공학과 - 운영체제
We have 2 processes: P1 and P2 Statement S1 in P1 needs to be performed before statement S2 in P2 Then define a semaphore ‘synch’ Initialize ‘synch’ to 0 Proper synchronization is achieved by having in P1: S1; signal(synch); And having in P2: wait(synch); S2; Using semaphores to synchronize processes 신라대학교 컴퓨터공학과 - 운영체제
생산자/소비자 문제(producer/consumer problem) • A producer process produces information that is consumed by a consumer process • 예: a print program produces characters that are consumed by a printer • 생성된 정보를 사용할 때까지 저장할 buffer가 필요하다 • A common paradigm for cooperating processes 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: unbounded buffer(1) • 1차원 배열로 구성된 무한 버퍼(unbounded buffer)을 가지는 경우 • in은 다음에 생성된 정보를 저장할 위치를 지정 • Out 은 다음에 소비될 저장하고 있는 위치를 지정 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: unbounded buffer(2) • semaphore S : to perform mutual exclusion on the buffer • only 1 process at a time can access the buffer • semaphore N : to synchronize producer and consumer on the number N (= in - out) of items in the buffer • an item can be consumed only after it has been created 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: unbounded buffer(3) • 생산자는 항상 자유롭게 생성된 정보를 버퍼에 추가할 수 있다 • 버퍼에 저장하기 전에 wait(S) • 버퍼에 저장한 후에 signal(S) • 생산자는 버퍼에 새로운 정보를 추가한 후에 새로운 정보가 생성되었음을 동기화 하기 위해 signal(N) 수행 • 소비자는 먼저 소비할 정보가 있는지를 검사하기 위해 wait(N)을 수행하고, 정보가 버퍼에 있으면 버퍼를 접근하기 위해 wait(S)/signal(S) 을 수행 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: unbounded buffer(4)- Solution append(v): b[in]:=v; in++; Initialization: S.count:=1; N.count:=0; in:=out:=0; take(): w:=b[out]; out++; return w; 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: unbounded buffer(5)- Solution • Producer: • repeat • produce v; • wait(S); • append(v); • signal(S); • signal(N); • until FALSE • Consumer: • repeat • wait(N); • wait(S); • w:=take(); • signal(S); • consume(w); • until FALSE critical sections 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: unbounded buffer(6) • Remarks: • The consumer must perform wait(N) before wait(S), otherwise deadlock occurs if consumer enter CS while the buffer is empty 신라대학교 컴퓨터공학과 - 운영체제
P/C Problem: finite circular buffer(1) • 저장된 정보의 수인 N이 최소한 1 이상일 때에 소비자가 버퍼 접근이 가능하다(ie. N != in – out) • 생산자는 버퍼의 빈 공간의 수 E가 1 이상일 때에 버퍼에 정보를 저장할 수 있다 신라대학교 컴퓨터공학과 - 운영체제