[CS] Synchronization , Race Condition , Critical Section

한호성·2022년 6월 9일
0

Synchronization

목록 보기
1/2

동기화, 경쟁조건 ,임계영역

개념

귤 두 박스에서 상한 귤을 골라내는 작업을 할 것이고, 상한귤이 총 몇 개인지 세는 것이 목표인 상황에서 스레드 두개에서 이 작업을 진행한다고 생각해보자.

for (귤 in 귤박스) {
      if (귤 상태 is 불량) {
            badCounter.increment();       
      }
}


public class Counter {
    private int state = 0;
    public void increment() {
        state++;
    }
    public int get() {
        return state;
    }
}

두 개의 귤박스를 두 스레드를 t1,t2 라고 생각하자 (같은 프로세스 내의)

두 개의 스레드는 Heap 영역에 있는 badCounter라는 객체에 접근해서 increment() 함수를 실행 시킬것으로 예상된다.

CPU는 싱글코어라고 생각하고 위 작업을 진행한다고 생각해보자. t1,t2 두개의 스레드가 context switching 을 통해 작업을 수행할 것이다.

우리는 각 귤박스에서 상한 귤의 개수를 state 변수에 담아져있을거라 생각하지만, 실제로 그렇게 작동하지 않을 수 도 있다!

그 이유는 각 스레드가 할당된 CPU 시간동안 작업을 수행하지 못한 상황에서 context switching이 일어날 수 있기 때문이다. 좀 더 자세하게 이야기해보자.

CPU 에서 increment() 함수에서 state++; 명령을 수행할 때, 다음과 같이 작동한다.

  1. LOAD state to R1 (Register)
  2. R1= R1+ 1
  3. STORE R1 to state

위 작업을 스레드 t1 increment() 함수를 실행하는데 cpu 에서 2번까지 수행하고 context switiching 을 진행했다고 생각해보자

스레드 t2 increment() 함수가 호출된다면, state 값이 0 이기 때문에 위 작업을 수행하게 된다면 결과는 state=1 을 저장했을 것이다.

다시 context swtiching 일어나서 3번부터 t1이 진행하게 된다면 R1 값이 1로 지정되어있었기 때문에 state 값에 다시 1을 지정하게된다.

이처럼 increment 함수가 두 번 호출 됬을 상황에서 결과가 state =2 가 아닌 state=1 이 된다. 위와 같은 현상을 컨텍스트 스위칭의 타이밍에 따라 결과가 달라질 수 있는 것을 알 수 있다.

듀얼코어에서도 마찬가지이다. 저장되어있지 않은 state 값을 참조해 사용하게 되어, 동기화가 이루어지지 않을 가능성이 있다.

용어 정리

Race Condition
여러 프로세스/스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황을 나타낸다.

Synchronization
race condition 없이 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것을 동기화(Synchronization)라고 한다.

Critical Section
공유 데이터의 일관성을 보장하기 위해, 한 번에 하나의 프로세스/스레드만 실행 가능하도록 만든 영역을 critical section 임계영역이라 한다.
(이와 관련된 문제를 critical section problem)이라고 한다.

Synchronization 방법

위의 설명한 상황에서 어떻게 하면 동기화를 유지할 수 있을까?

increment() 라는 함수를 한 스레드만 사용가능하게 한다면 state 값의 동기화를 유지할 수 있을 것이다!

critical section problem 해결하기 위한 기본 뼈대

do{
	entry section
    	critical section
    exit section
    	remainder section
	} while(TRUE)
    

위 Critical section problem 을 해결책이 되기 위한 3가지 조건이 있다.

  1. mutual exculsion 상호 배제
    : 한 번에 하나의 프로세스/스레드만 critical section을 실행할 수 있다는 의미

  2. progress 진행
    : critical section이 비어있고 어떤 프로세스나 스레드들이 critical section 으로 들어가기 원한다면, 그중에 하나는 critcal section안으로 들어갈 수 있어야 한다. 즉 실행 가능해야한다

  3. bounded waiting
    : 어떤 프로세스나 스레드가 영원히 critical section에 들어가지 못하고 기다리고 있으면 안된다는 조건이다.

위 3가지 조건을 모두 만족해야 critical section 문제의 해결책이 될 수 있다!

Reference

https://blog.naver.com/myca11/222626313972

profile
개발자 지망생입니다.

0개의 댓글