본문 바로가기

OS(운영체제)/프로세스

[운영체제] 프로세스 - 프로세스 혹은 스레드 동기화란?

1. 프로세스/스레드 동기화

동기화란 어느 공유자원에 대해 프로세스/스레드가 동시에 그 자원에 접근해서 작업하는것을 제어하는것을 말한다.
즉, 데이터의 일관성을 위해 프로세스/스레드 동기화가 필요하다.

동기화가 필요한 이유에 대해 아래에서 알아보자.

 

2. 동기화가 필요한 이유(경쟁 상태)

경쟁 상태는 상호배제를 하지 않았을때 일어나는 현상을 말한다.

동기화에서 "자원에 접근해서 작업 하는것을 제어하는것" 은 "프로세스/스레드의 상호배제를 고려한다." 고 볼수 있다.
이말은 프로세스/스레드 동기화가 없으면 경쟁 상태가 일어나게 되고 접근 순서에 따라 데이터의 결과 값이 달라지기 때문에 결국엔 데이터의 일관성이 깨지게 된다.

그렇다면 경쟁상태가 일어나지 않게 하기 위해선 어떻게 해야할까?

(참고 - 경쟁상태란 : https://record-developer.tistory.com/77)

 

3. 임계 영역

경쟁상태 발생을 억제하기 위해서 임계 영역을 정의할 필요가 있다.

임계영역이란 여러 프로세스/스레드가 접근하려는 공유자원에 대한 코드 부분을 말하는데 이를 정의해 줘야한다.

 

그리고 결국 여러개의 프로세스/스레드가 공유자원을 사용하기 위해 임계영역에 접근하게 되는데 이때 정의한 임계영역에 대해 프로세스/스레드가 차근차근 접근 할수 있도록 조건을 줘야한다.

  1. 상호배제
    한번에 두개 이상의 프로세스/스레드가 접근할수 없다. 즉, 오직한개만 접근 가능하다.

  2. 진행
    임계영역에 프로세스/스레드가 존재하지 않을땐 임계영역에 접근하여 작업할 수 있다.

  3. 한정된 대기
    현재 진행중인 프로세스/스레드를 제외하고 임계영역에 접근 대기중인 프로세스/스레드가 있을때 무한대기를 방지함으로써 기아현상이 일어나지 않도록 한다.
    이때 대기중인 프로세스/스레드에서 이미 한번이상 임계구역에서 실행을 했던 것들의 우선순위는 뒤로 밀리게 된다.

4. 임계 영역 문제 해결방안

임계 영역의 문제를 해결하는데 3가지 방안이 존재한다.

  1. 피터슨 해결방안
    뮤텍스와 세마포어랑 다르게 오로지 2개의 프로세스/스레드가 공유자원에 접근하려고 할때를 고려한 해결방안 이다.(바쁜 대기?)(추가중)

  2. 뮤텍스와 세마포어
    뮤텍스와 세마포어는 둘다 공유자원 관리를 위한 상호배제 기법중 하나이다.
    뮤텍스와 세마포어 둘다 여러개의 프로세스/스레드가 임계구역에 동시에 접근하는 것을 막음으로써 데이터의 일관성을 유지시킨다.

    다만
    뮤텍스의 경우 임계영역에 접근한 프로세스/스레드는 lock을 걸어 다른 프로세스/스레드가 접근하지 못도록하고 작업이 끝난 프로세스/스레드는 걸었던 lock을 직접 unlock하면서 임계영역을 빠져나오게 된다. 그 후 대기중인 다른 프로세스/스레드는 임계영역에 접근이 가능하다.

    세마포어의 경우 세마포어값에 따라 프로세스/스레드의 임계영역 접근을 막는다.
    세마포어 값은 세마포어 함수인 wait(), signal()로 이루어져 있고 wait()는 세마포어값을 1 감소, signal()은 세마포어값을 1 증가시키면서 값의 변동을 준다.
    이때, 세마포어값이 0보다 작으면 프로세스/스레드의 임계영역 접근을 제한하고, 1보다 크거나 같게되면 임계영역 접근을 허락하는 원리다. 또한 뮤텍스와 다르게 세마포어값은 현재 작업이 끝난 프로세스/스레드가 아닌 대기중인 프로세스/스레드가 signal()함수를 실행함으로써 임계영역 접근의 여부를 결정할 수 있다.

(참고 - 뮤텍스와 세마포어 : https://record-developer.tistory.com/56)