Shine's dev log

프로세스 동기화_1 (Synchronization) 본문

운영체제

프로세스 동기화_1 (Synchronization)

dong1 2020. 5. 25. 17:44

앞서 살펴봤듯이, 시스템에서는 여러개의 프로세스가 동시에 실행되고있다.

 

이 때, 각 프로세스의 쓰레드가 동시에 돌게 되는데, 만약 여러 쓰레드가 같은 값에 동시에 접근하면 여러가지 문제들이 발생할 수 있다.

 

이 문제들과 해결책을 알아보자.

 

 

 

1. 동기화 문제 (Synchronization Problem)

 

두개 이상의 concurrent 하게 동작하는 쓰레드가 공유된 메모리에 있는 자원을 동시에 접근하면, 누가 먼저 접근하느냐에 따라 값이 매번 달라질 것이다.

 

즉, 일관성없이 운에 좌지우지되는 문제점을 race condition이라고 한다. 이는 정확한 결과를 필요로 하는 시스템에 매우 치명적이다.

 

따라서 Synchronization(동기화) 작업을 통해 쓰레드들의 메모리 접근을 적절하게 조절해줌으로써, race condition 문제점을 해결할 수 있다.

 

 

 

2. Critical Section

 

Shared resource 에 동시에 접근하는 코드로서, race condition을 발생시킬 수 있는 부분이다.

 

따라서 critical section에 여러개의 쓰레드가 동시에 못들어가도록 해주면, race condition을 막을 수 있다.

 

 

 

3. Locks

 

Lock은 Mutual exclusion을 제공하는 오브젝트이다. 주로 아래 두 명령어를 활용한다.

 

1) acquire : lock이 풀릴때까지 기다리고, 풀리면 해당 자원을 갖는다.

 

2) release : unlock하고, 그 자원을 acquire하기 위해 기다리고 있는 다른 쓰레드를 깨운다.

 

critical section에 들어가기 전에 aquire()을 사용하고, 빠져나올 때 release()를 사용하면 된다.

 

 

 

4. Locks을 잘 구현하기 위한 조건들

 

  • Correctness

Lock을 구현할 때 Correctness를 만족하기위한 조건들로 매우 중요하다.

 

1) Mutual exclusion

 

- 하나의 쓰레드만 critical section에 들어가야 한다.

 

2) Progress

 

- 여러개의 쓰레드가 동시에 같은 critical section에 접근하려 할 때, 하나의 쓰레드는 무조건 접근해야 한다.

 

3) Bounded waiting

 

- 특정 쓰레드가 starvation이 발생하지 않아야 한다.

 

 

  • Fairness

- 각각의 쓰레드들은 lock을 acquire하기 위한 공정한 기회를 가져야 한다.

 

  • Performance

- lock을 처리할 때의 overhead가 너무 크면 안된다.

 

 

 

5. 동기화를 위한 방법들

 

1) 첫번째 방법 (Initial Approach)

 

 

위의 방법은 무한 반복문을 통해 계속해서 lock이 release 되었는지 확인하는 방법이다. (spinlock)

 

하지만, 이 방법은 동시에 여러 쓰레드가 acquire을 얻을 수 있다. 따라서 이 방법은 Mutual exclusion을 위배한다.

 

 

2) 두번째 방법 (Software-only Algorithm)

 

Synchronization 2

 

위의 그림과 같은 방법은 lock을 acquire하기 전에 다른 쓰레드들이 acquire하는 지 검토후 acquire 하는 방법이다.

 

약간 컴퓨터 네트워크의 CSMA/CA방식과 유사하다고 할 수 있다.

 

하지만, 만약 동시에 물어보는 단계로 들어가면, 영원히 동시에 무한루프를 도는 문제점이 발생할 수 있다. 따라서 이 방법은 Progress를 위배한다.

 

 

3) 세번째 방법 (Peterson's Algorithm)

 

Synchronization 3

 

peterson's Algorithm이라고 알려진 세번째 방법은, 두번째 방법에서 turn이라는 변수를 추가해 준 것이다.

 

두개의 쓰레드가 있다면, 먼저 양보한 놈이 결국 먼저 들어가게 되는데 그래서 두번째 방법에서 발생할 수 있었던 Progress 위배 문제점을 해결해 준다.

 

이 방식은 Mutual exclusive, Progress, Bounded waiting 을 모두 만족하는 방법이다.

 

 

오늘 배운 내용을 정리해 보면, 

 

1. 여러 쓰레드가 공유된 자원에 동시에 접근하면 race condition이 발생한다.

 

2. race condition을 발생시키는 코드를 critical section이라 한다.

 

3. lock이란 오브젝트를 활용하여 race condition을 방지한다.

 

4. 올바르게 lock을 활용하려면, 1) Mutual exclusion 2) Progress 3) Bounded waiting 을 만족해야 한다.

 

본 내용은 공부하며 정리한 것으로, 치명적인 오류가 있을 수 있습니다.