프로세스 동기화 및 뮤택스와 세마포어
Created Time: November 27, 2022 10:05 PM
Last Edited Time: November 29, 2022 6:30 PM
References: https://dduddublog.tistory.com/25
왜?
프로세스 동기화에 대해 생각하던중, 임계 영역 처리에 대해서 한번 생각해보았다.
프로세스 동기화에 대해 설명해보세요.
다중 프로세스 환경에서 자원 등에 한 프로세스만이 접근가능하도록 하는 것입니다.
공유된 자원에 대해 프로세스 동기화를 하지 않으면 데이터의 일관성이 깨지기 때문에 연산결과가 잘못 반환될 가능성이 존재하기 때문에 주의해야 합니다.
다음 2가지 영역에서의 방법이 있다.
- 유저 동기화 (임계영역)
- 커널 동기화 (mutex, semaphore)
Race Condition(경쟁 상태): 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근할때 공유된 자원에 대한 접근 순서에 따라 실행 결과가 달라질 수 있는 상황을 의미합니다.
Critical Section(임계 구역): 여러 스레드가 동시에 접근해서는 안되는 공유자원에 접근하는 코드 블럭을 얘기합니다. 한 임계구역에 하나의 스레드 혹은 프로세스만 접근이 가능합니다. 임계 구역에 접근하는 것을 제어하기 위해 세마포어, 뮤텍스와 같은 매커니즘을 사용합니다.
임계 구역 문제를 해결하기 위한 조건(모두 충족해야함)
- 상호 배제(Mutual Exclusion): 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다.
- 진행(Progress): 임계구역에서 작업중인 프로세스가 없다면 입계구역으로 진입하려는 프로세스를 적절히 선택해서 진입할 수 있도록 합니다.
- 유한 대기(Bounded Waiting): 한 프로세스가 임계영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야 합니다. (기아상태 방지)
뮤택스와 세마포어
뮤택스
동시 프로그래밍 환경(멀티 프로세스 및 멀티 쓰레드 같은)에서 공유 불가능한 자원의 동시 사용을 막기 위해 사용되는 알고리즘으로, 임계구역에서 구현된다. 단일 프로세서 시스템에서 상호배제를 구현하는 간단한 방법은 인터럽트를 억제해서 공유데이터 손상을 막는 것이다. 일종의 Locking 메커니즘이라 할 수 있다. lock을 가진 쓰레드만이 임계구역에 접근할 수 있는것이다. 임계구역에서 작업이 끝난 쓰레드는 Unlock하여 lock을 반환한다.
세마포어
두 개의 원자적 함수로 조작되는 정적 변수로써, 멀티 프로그래밍 환경에서 공유 자원(임계구역)에 대한 접근을 제한하는 방법으로 사용된다. 이는 철학자들의 만찬 문제의 고전적인 해결책이지만, 모든 교착 상태를 해결하지는 못한다.
세마포어 S는 정수값을 가지는 변수이며 다음과 같은 P와 V라는 명령어에 의해서만 접근할 수 있다. (P와 V는 try와 increment를 뜻하는 네델란드어에서 따왔다.)
P는 임계구역에 들어가기 전에 수행되고(try) , V는 임계구역에서 나올 때 수행된다. (increase) 이 때 변수값을 수정하는 연산은 모두 ‘원자성’을 만족해야 한다. 다시 말해, 한 프로세스나 쓰레드에서 S값을 변경하는 동안에는 다른 프로세스나 쓰레드가 동시에 접근해서 변경할 수 없다.
값이 0보다 크면 접근을 허용하되 1을 감소하고, 값이 0이면 접근을 block시킨다. 반대로 작업이 끝나고 프로세스나 쓰레드가 나갈때는 값을 1로 증가시켜 다른 프로세스나 스레드가 접근할 수 있도록 한다. 여기서 접근되는 자원은 임계구역이므로 시스템 퍼포먼스에 많은 영향을 끼친다.
뮤택스와 세마포어의 차이
우리(프로세스)가 방(자원)에 들어가려고 할 때, 뮤텍스는 방에 들어가기 위한 열쇠의 개수이며, 세마포어는 빈 방의 열쇠의 개수이다.
즉 뮤텍스는 한 사람이 빈 방에 대한 열쇠를 가지고 있어서 방에 들어간다면, 그 사람이 나와야만 다른 사람이 열쇠를 건네받아 방을 들어갈 수 있다.
반면 세마포어는 방이 네개면 열쇠도 네개일 것이고 한 사람이 들어갈 때마다 들어갈 수 있는 방은 하나씩 줄어들어 0개가 되면 빈 방이 나올때 까지 대기해야 하는 상황이다. 아무나 먼저 나와야만 방과 열쇠를 한개씩 얻어서 들어갈 수 있다.
1.세마포어는 자원의 상태를 나타내는 일종의 ‘변수’로써 소유 개념이 아니지만, 뮤텍스는 자원을 점유한 프로세스나 쓰레드가 잠시 소유하였다가 작업이 끝나면 반환하는 개념이다.
2.뮤텍스는 소유하고 있는 쓰레드가 뮤텍스 자원을 해제할 수 있지만 세마포어는 소유하지 않는 쓰레드여도 해제할 수 있다.
3.가장 큰 차이점은 뮤텍스가 동기화 대상이 자원의 하나라면, 세마포어는 하나 이상일 때 사용된다.
교착상태와 기아상태
교착상태(Deadlock)
서로 다른 프로세스가 서로 점유하고 있는 자원의 반납을 대기하고 있는 상태를 의미합니다.
발생조건(4가지 모두 충족시)
- 상호 배제: 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 합니다.
- 점유 대기: 할당된 자원을 가진 상태에서 다른 자원을 기다립니다.
- 비선점: 다른 프로세스가 자원의 사용을 끝낼 때 까지 자원을 뺏을 수 없습니다.
- 순환대기: 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있습니다.
해결방법(예방: 4가지 조건 중 하나라도 만족되지 않도록 합니다.)
- 데드락의 발생조건 4가지 중 하나라도 발생하지 않게 하는 것
- 회피: 알고리즘을 데드락이 발생하지 않도록 합니다.
- 회복: 교착상태가 발생할 때(탐색), 해결합니다.
- 무시: 회복과정의 성능저하가 심하다면 그냥 무시(재부팅)합니다.
기아상태
프로세스가 원하는 자원을 계속 할당받지 못하는 상태를 의미합니다.
해결방법
- 프로세스 우선 순위를 수시로 변경해서 각 프로세스가 높은 우선 순위를 가질 기회를 준다.
- 오래 기다린 프로세스의 우선 순위를 높여준다. (aging 기법)
- 우선 순위(스케줄링 등)가 아닌 요청 순서대로 처리하는 FIFO 기반 요청 큐를 사용한다.