본문 바로가기
ComputerScience/OS

뮤텍스와 세마포어, 동기화 문제 해결 도구

by whitele 2021. 11. 14.
반응형

동기화 도구 필요성과 이해

동기화 문제

 프로세스가 공유하는 데이터를 병렬로 처리하게 될 때 문제가 발생할 수 있습니다.  실행 순서가 뒤바뀌거나 다른 프로세스가 한번 처리될 때 2번이 처리되는 순간 결과는 완전히 달라집니다. 이런 경쟁 상황을 막기 위해 프로세스 간 동기화가 필요합니다.

 

임계 구역 문제

 프로세스 처리 루틴에는 임계 구역이라는 부분을 가지고 있습니다. 적어도 하나 이상의 프로세스와 공유 데이터를 접근 또는 갱신합니다. 임계 구역에서는 동시에 두 개 이상의 프로세스가 실행되지 못해야 합니다. 각 프로세스들이 진입 요청을 하고 임계 구역에 진입을 해야 합니다.

 

임계구역

 

임계 구역에 대한 해결 조건

  1. 상호 배제
  2. 진행
  3. 한정된 대기

상호 배제, 한 프로세스가 자신의 임계 구역에서 실행 시 다른 프로세스는 그 자신의 임계 구역에서 실행할 수 없습니다. 

진행, 임계 구역이 비어있고 자신의 임계 구역에 진입하려는 프로세스들 중 누가 임계구역에 들어갈지 정하는 것은 나머지 구역에서 실행 중이지 않은 프로세스들만 참여할 수 있습니다.

한정된 대기, 자기의 임계 구역에 진입 요청을 한 뒤 허용 될 때까지 다른 프로세스들이 자신의 임계 구역에 진입 허용 횟수에는 한계가 있어야 합니다.

 

Mutex 락

 mutex는 mutual exclusion(상호 배제)의 축약으로 임계 구역을 보호하고 경쟁 상황을 방지하기 위해 사용할 수 있습니다. 임계 구역에 진입하기 위해서는 락을 획득해야 하고 빠져나갈 때 반드시 락을 반환해야 합니다.

mutex락 진입요청
mutex 진입과 거부

mutex락은 기본적으로 acquire() 함수를 통해 락을 획득하고 release() 함수를 통해 락을 반환합니다. available이라는 변수를 가지고 락의 사용 가능 여부를 표시합니다. mutex를 지속적으로 그리고 정상적으로 사용하기 위해서는 이 두 함수가 원자적으로 실행되어야 합니다.

 리눅스 c에서는 pthread를 이용하여 mutex를 구현할 수 있습니다.

 

 

세마포어 Semaphore

 세마포어 S는 wait()과 signal()로만 접근이 가능합니다. mutex보다 더 정교하게 동작하는 동기화 도구입니다. 여기서 wait함수는 s의 값을 감소시키고 signal은 증가시킵니다.

 

세마포어의 사용

 계수(카운팅) 세마포어와 이진 세마포어로 나눌 수 있습니다. 이진 세마포어는 0과 1만을 가지며 mutex와 유사하게 동작합니다. 반대로 카운팅 세마포어는 제한 없는 값을 사용합니다. 물론 카운팅 세마포어의 초깃값은 해당 환경에서 가능한 만큼입니다.

 자원을 사용하려는 프로세스는 세마포어에 wait()연산을 수행하고 완료된 뒤에는 signal() 연산으로 세마포어를 증가시킵니다. 세마포어의 값이 0이 되는 순간 증가할 때까지 사용이 불가합니다.

 

세마포어의 구현, 설명

 세마포어 역시 자원을 모두 사용하면 뮤텍스와 동일하게 대기를 하게 됩니다. 하지만 프로세스를 일시 중지하고 큐에 할당한 뒤 다시 스케줄링하는 방안도 있습니다. 이런 방식의 세마포어 구현 설명입니다.

세마포어의 기본정의

typedef struct{
    int value;
    S list;
}S;

wait(s){
	s--;
    if(s<0)
    	add(process)->s.list
        sleep();
}

 C문법과 유사하게 세마포어의 의사 코드 정의입니다.

세마포어

 

 

모니터 Monitor

뮤 텍스와 세마포어는 간단하면서도 효과적으로 사용할 수 있습니다. 그러나 예기치 않은 타이밍 오류 및 코드 오류로 인한 정상적이지 않은 동작을 할 가능성이 존재합니다. 프로그래머가 잘못해서 wait signal 순서 또는 중복의 실수 등을 이유로 다양한 오류 상황에 부딪힐 가능성이 존재합니다. 이러한 오류를 처리하기 위한 도구 중 하나가 모니터입니다.

 모니터 사용과 구현

 ADT는 데이터와 데이터를 조작하는 함수들의 집합을 하나로 묶어 보호합니다. 이런 모니터형은 모니터 내부에서 상호 배제가 보장되는 프로그래머가 정의한 일련의 연산자 집합을 포함하는 ADT입니다. 

 모니터형은 변수들의 선언을 포함합니다. 인스턴스의 상태를 정의하는 변수입니다. 이 변수들을 조작하는 프로시저들도 포합 합니다. 모니터 타입을 프로세스들이 직접 사용할 수 없고 모니터 내에 정의된 함수로 지역 전 변수와 형식 매개변수에 접근할 수 있습니다. 

728x90
반응형

댓글