Computer Science/OS

[OS] Synchronization 동기화란?

ooeunz 2020. 3. 27. 23:52
반응형

1. 동기화란?

동기화란 컴퓨터 공학의 영역 뿐만 아니라 클라우드 저장소와 같은 우리가 일상 생활 속에서 흔히 접하는 많은 애플리케이션이나 기기에서 접할 수 있는 단어입니다. 그 말의 뜻에서도 알 수 있듯이 무언가 연동된다라는 느낌이 있는 단어입니다. 컴퓨터 공학에서 뜻하는 동기화 역시 이와 다르지 않으며, 동기화란 프로세스 또는 스레드들이 수행되는 시점을 조절하여 서로가 알고 있는 정보가 일치하는 것을 의미합니다.

 

우리가 알다시피 컴퓨터는 프로세스 또는 스레드로 작업을 실행합니다. 예를 들어  a = 2 라는 자원이 있다고 해보겠습니다.

 

P1이라는 프로세스는 a라는 값을 이용해서 어떠한 로직을 수행합니다.

그런데 만약 그 사이 P2라는 프로세스가 a의 값을 3으로 바꾸게 된다면 어떻게 될까요?

 

아마 프로그램은 우리가 원하는 형태의 값을 반환하지 않을 것입니다.

 

이때 우리는 a를 공유 자원이라고 말하고,

이렇게 두개 이상의 프로세스 혹은 스레드가 동기화 없이 접근하려는 현상을 race condition(경쟁 상태)라고 합니다.

그리고 이러한 문제를 해결하는 것. 즉 서로가 알고있는 정보를 일치시키는 것을 synchronization(동기화)라고 합니다.

 

 

 


2. critical section(임계 영역)

임계영역이란 공유되는 자원에서 문제가 발생하지 않도록 독점을 보장해주는 영역을 뜻합니다. 이러한 임계 영역을 잘 제어해야 동기화 문제를 제어할 수 있습니다. 임계영역에는 한 순간에 반드시 하나의 프로세스 또는 스레드만 진입이 가능합니다. 즉 공유 자원 독점을 통해 동기화를 유지할 수 있습니다.

 

 

3. 동기화를 제공하는 방법

1. Lock

이러한 동기화 방법으로 Lock 방법이 있습니다. Lock이라는 의미 그대로 내가 자원을 사용하는 동안 다른 프로세스가 접근하지 못하도록 잠그는 방법 입니다. 아래의 수도 코드를 살펴보겠습니다.

while (lock == true) {
	lock = true;
    
    // 공유 자원에 접근하는 코드
    
    // 기저사례
    if (condition == true) {
    	lock = false;
    }
}

 

위의 코드를 살펴보면 lock이 true인 상태에 while문이 무한 반복상태에 들어갑니다. 그리고 lock이 false가 된 순간 다른 프로세스가 lock을 true로 만들고 임계영역에 진입하게 됩니다.

 

하지만, 이 방식에는 문제가 있습니다.

바로 lock을 true로 바꾸는 행위와 while (lock == true)의 행위가 동시에 일어나지 않는다는 것입니다. 자주있는 일은 아니겠지만, 운이 나쁘다면 저 찰라의 순간에 동시성이 붕괴되는 이슈가 발생할 수 있습니다.

 

 

2. 세마포어

세마포어는 신호등이라는 뜻입니다. 두가지 연산으로 이루어져 있으며, 임계영역의 사용이 끝났으면 사용이 끝난 프로세스가 대기중인 프로세스에게 사용이 끝났다는 사실을 알려주는 방식입니다. 이와 같이 세마포어는 무한반복을 사용하지 않으므로 cpu 리소스를 줄여줄 수 있습니다.

 

세마포어는 정수 값을 가지는 변수로 볼수 있는데, 이 정수 값은 접근할 수 있는 최대 허용치 만큼 동시에 사용자가 접근할 수 있습니다. 세마 포어에는 두가지 연산을 가지고 있습니다.

 

semWait : 세마포어 값을 감소시킵니다. 만약 세마포어가 음수가 되면 프로세스는 블록 상태가 됩니다.

semSignal : 세마포어 값을 증가시킵니다. 만약 값이 0이거나 음수일 경우엔, semwait 연산으로 블록된 프로세스를 깨웁니다.

 

다만 이러한 세마포어 역시 문제점이 존재합니다. 바로 개발자의 실수입니다. 정확히 쓰면 문제가 발생하지 않지만, 멀티 스레드나 멀티 프로세싱 환경에서는 이러한 실수가 잘 발견되지 않기 때문에 개발자의 실수를 줄여줄 다른 방법이 필요하게 됩니다.

 

※ 뮤텍스란?

뮤텍스 역시 세마포어와 마찬가지로 병행 처리를 위한 동기화 기법입니다. 다만 세마포어와는 달리 오직 1개의 프로세스 혹은 스레드만 접근할 수 있습니다.

 

 

3. 모니터

그래서 나온 것이 바로 모니터 방법입니다. 모니터란 공유 자원을 내부적으로 가지고 있고 외부에 공개하지 않습니다. 이는 마치 클래스의 private 접근자 변수와 유사합니다. 그리고 public 메서드 (getter와 같은)를 통해서만 공유 자원에 접근할 수 있습니다. 모니터는 뮤텍스와 같이 한번에 한번의 프로세스만 입장할 수 있다는 특징이 있습니다.

반응형