[ OS ] 동기화(Synchronization) 문제

이숭인·2021년 8월 4일
1

[ OS ] 운영체제

목록 보기
5/9

동기화(Synchronization)


공유하는 데이터에 대해 동시에 접근하는 여러 프로세스 사이에서 실행 순서 규칙을 정하여(수행되는 시점을 조절하여) 공유 자원의 일관성 을 보장하는 것을 동기화 라고 한다.

공유 자원은 일관성 을 가져야 하지?


공유 데이터에 대해 여러 프로세스가 동시에 접근하여 변경을 시도 하게 되면 개발자가 원하는 형태의 데이터 값을 반환하지 못할수도 있기때문.


경쟁 상태 (race condition)

여러 프로세스(혹은 스레드)가 공유 자원동기화 메커니즘 없이 동시에 접근할 때, 공유 자원에 대한 접근 순서 에 따라 실행 결과 에 영향을 미칠 수 있는 상태
(데이터의 일관성이 보장되지 않는 상태)

여러 프로세스(혹은 스레드)가 경쟁 상태(race condition) 일때 공유 자원의 일관성 이 보장되지 않기 때문에 동기화 문제가 발생하게 된다. 이 문제(race condition) 를 해결하기 위해 공유 자원의 일관성 을 보장해 주기 위해 공유 자원을 접근하는데 있어서 문제가 발생하지 않도록 공유 자원의 독점을 보장 해주는 역할을 수행해주는 임계 영역 에 대해 알아보자


임계 영역 (Critical Section)

임계 영역이란 프로세스(혹은 스레드)간에 공유 자원 을 접근하는데 있어서 문제가 발생하지 않도록 한번에 하나의 프로세스(혹은 스레드)만 접근할 수 있게끔 보장해주는 영역이다

임계 영역 문제를 해결하기 위해서는 3가지 조건을 충족시켜줘야 한다.

1. Mutual exclution (상호 배제)

  • 하나의 프로세스가 임계 영역에 존재한다면, 다른 프로세스는 임계 영역에 접근 할 수 없어야 한다.

  • 여러 개의 프로세스가 공유하는 데이터 및 자원에 대하여 하나의 프로세스만 접근하여 데이터를 사용하도록 지정하는것

2. Progress (진행)

  • 임계 영역에 프로세스가 존재하지 않는 경우, 다른 프로세스가 접근할 수 있도록 해야 한다. 임계 영역에 접근하고자 하는 프로세스가 여러개라면 어느 것이 들어갈지 결정해줘야 한다.

3. Bounded Waiting (한정 대기)

  • 다른 프로세스의 기아(Starvation) 를 방지하기 위해 한번 임계 구역에 들어간 프로세스는 다음 번 임계 영역에 들어갈 때 제한을 두어야 한다.

기아(Starvation)란?


프로세스가 임계 영역에 들어가기 위해 무한정으로 기다리는 현상(= Starvation)

이러한 임계 영역의 동시 접근을 해결하기 위한 방법으로 3가지 방법이 있다.

- Lock (락)

- Semaphore (세마포어)

- Monitor (모니터)

Lock (락)

하나의 프로세스(혹은 스레드)가 자원을 사용하고 있는 동안 lock을 걸어서 접근을 못하게 하는 방식

문제점

  • 특정한 상황에서 제대로 작동하지 않을 수 있다.

특정한 상황?
A 스레드가 Lock 함수를 실행해서 무한루프를 돌게끔 변수의 값을 변경하기 전에 인터럽트가 발생해 값을 변경하지 못하게되고, 다른 스레드가 Lock 함수에 들어오게 된다면 두개의 스레드가 임계 영역에 동시 접근을 하는 상황이 발생한다.

Semaphore (세마포어)

자원의 개수를 뜻한다. 즉, 동시에 자원에 접근 할 수 있는 허용가능한 counter의 개수 를 뜻한다.

세마포어는 정수 값을 가지는 변수라고 볼 수 있는데, 이 값은 접근할 수 있는 최대 허용가능 프로세스(스레드) 수

  • semWait : 세마포어 값을 감소시킨다. 만약 세마포어가 음수라면 프로세스는 블록 상태가 된다.

  • semSignal : 세마포어 값을 증가시킨다. 만약 값이 0 이거나 음수 일 경우엔 block된 프로세스를 깨운다.

문제점

개발자가 실수 를 했을 때, 멀티 스레드나 멀티 프로세싱 환경에서 실수를 발견하기 쉽지 않다.

+ Mutex

Mutex상호 배제 를 뜻하며, Binary Semaphore 와 같은 의미이다. 즉, 자원에 단 하나의 작업만이 접근할 수 있다.
임계영역을 가진 프로세스(혹은 스레드) 들의 런타임이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다. 다중 프로세스들의 공유 자원에 대한 접근을 조율하기 위해 lockunlock 을 사용한다.

세마포어와의 가장 큰 차이점은 동기화 대상의 개수 이다. Mutex 는 하나의 프로세스만 활동 가능하고, Semaphore 는 동기화 대상이 하나 이상일 때 사용한다.

Monitor (모니터)

세마포어는 아래와 같은 문제점을 가지고 있다.

  • 정확성 입증이 어렵다. (실수를 발견하기 어렵기 때문)

  • 한번의 실수가 모든 시스템에 치명적 영향을 끼친다.

모니터 내에서는 한번에 하나의 프로세스 활동만 가능하다. 때문에 개발자가 동기화를 위한 제약조건을 명시적으로 설정할 필요가 없다. 또한 프로세스가 모니터 안에서 기다릴 수 있도록 Condition Variable 을 사용한다.

Condition Variable**wait / signal** 연산에 의해서만 접근이 가능하다.

wait() : 다른 프로세스가 signal 을 하기 전까지 suspend 된다.
signal() : 정확하게 하나의 suspend 된 프로세스를 깨운다.

Monitor vs Semaphore

  • Monitor 는 자체적으로 하나의 프로세스만 처리

  • 반면 Semaphore 는 직접 lock을 걸고 해제해야한다.

즉, 모니터뮤텍스상위 호환 버전이면서(1) , 세마포어 와는 약간의 차이(2)를 가지고 있다.

(1). 모니터와 뮤텍스는 "공유 자원에 한번에 하나의 프로세스(혹은 스레드) 만이 접근할 수 있다" 는 공통점이 있지만, 모니터는 자체적으로 처리, 뮤텍스는 lock, unlock을 직접 처리해야하기 때문에 상위 호환 버전 이라 하는거같다.

(2). 모니터는 한번에 하나의 프로세스(혹은 스레드) 만 활동이 가능, 세마포어는 여러개의 프로세스(혹은 스레드) 가 활동 가능

profile
iOS Developer

0개의 댓글