뮤텍스와 세마포어에 대해 알아보기 전에 공유 자원에 관련된 것을 학습해야 될 필요가 있다.
프로그램의 실행 시간, 즉 계산 시간을 줄이기 위해 고안된 방법인 병렬 컴퓨터는 프로그램 내의 계산 영역을 여러 개로 나누어 각각에 대한 계산을 여러 프로세스들이 나누어 동시에 수행하는 병렬 처리를 수행한다.
하나에 한 작업만 수행하던 직렬 처리 방식에 비해 여러 프로세서가 동시에 계산을 수행하는 병렬 처리 방식은 실행시간을 크게 단축시켰다.
하지만 동시에 처리하다보니 이로 인한 문제가 생겼는데 둘 이상의 스레드가 동시에 접근하면 안되는 공유 불가능한 자원(이를 임계 구역/critical section이라고 함)에 대한 문제가 생긴 것이다.
이를 해결하기 위해 데이터를 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야 한다.
이러한 동기화 메커니즘에는 뮤텍스와 세마포어가 존재한다.
뮤텍스(Mutex)
뮤텍스는 동시 프로그래밍에서 두 스레드가 임계 구역에 동시에 접근하는 것을 막기 위한 알고리즘이다.
Critical Section을 가진 스레드들의 실행시간이 서로 겹치치 않고 각각 단독으로 실행되도록 하는 기술이다.
이를 상호 배제(Mutual Exclution)라 하는데 이 상호 배제를 축약한 단어가 Mutex인 것이다.
뮤텍스는 lock과 unlock 연산으로 Shared Resource에 대한 접근을 조절한다.
lock -> 임계 구역에 들어갈 권한을 획득함. 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할때까지 대기함.
unlock -> 임계 구역을 모두 사용했음을 알림.
세마포어(Semaphore)
세마포어는 다익스트라(Dijkstra)가 고안한 두 개의 원자적 함수로 조작되는 정수 변수로서, 멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법이다.
세마포어는 원자적으로 제어되는 정수 변수로, 일반적으로 세마포어의 값이 0이면 자원에 접근할 수 없도록 block하고 0보다 크면 접근함과 동시에 세마포어 값을 1 감소시킨다.
반대로 종료하고 나갈 때는 세마포어의 값을 1 증가시켜 다른 프로세스가 접근할 수 있도록 한다.
이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 한다.
세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 대기하도록 해야 한다.
뮤텍스와 세마포어의 가장 큰 차이점은 뮤텍스는 동기화 대상이 오직 하나일 때 사용하고, 세마포어는 동기화 대상이 한 개 이상일 때도 사용할 수 있다.
'정보보안기사 > 추가' 카테고리의 다른 글
프로세스 스케줄링 (0) | 2023.06.01 |
---|---|
TCP Timers (0) | 2023.05.21 |