[OS] 뮤텍스와 세마포어

·2023년 11월 5일

CS

목록 보기
4/11

경쟁상태

여러 프로세스/스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황
=> 공유 자원에 동시에 접근하지 못하도록 접근 순서,타이밍을 제어하는 동기화가 필요하다!

상호 배제(Mutual Exclusion)

임계영역에 하나의 프로세스/스레드만 허용하여 하나의 프로세스/스레드만 데이터를 조작하게 하는 것,
이 때 임계영역이란 '공유 데이터의 일관성을 보장하기 위해 특정 프로세스/스레드만 진입해서 실행 가능한 코드 영역'이다.

이러한 상호 배제를 동기화 기법으로 구현한 것이 뮤텍스와 세마포어!

뮤텍스 (MutEx)

(출처: https://www.joinc.co.kr/w/Site/Thread/Beginning/Mutex)

Mutual Exclusion로부터 따온 이름이다. 여러개의 프로세스/스레드가 공유 자원에 동시에 접근하는 것을 제한하기 위한 락을 사용한다.
임계 영역에 MutexLock이 걸리지 않았다면, 먼저 진입하는 프로세스/스레드가 Lock을 가지고 접근이 가능하며, 이 때 임계 영역에서 나올 때 까지 Lock을 가지고 있지 않은 프로세스/스레드는 대기 큐에서 sleep상태로 존재하게 된다. (이렇듯 CPU를 계속해서 사용하지 않고 대기하는 방식이 Non-Busy-Wait이다.)
먼저 들어가있는 프로세스/스레드가 임계 영역을 벗어난 경우, 대기 큐에 있던 프로세스/스레드는 다시 임계영역에 Lock을 가지고 진입하게 된다.

public static void main(String[] args){
	Person 길동 = new Person("길동");
    Person 둘리 = new Person("둘리");
    
    길동.start();
    둘리.start();
}

class Person extends Therad {
	static final ReentrantLock pairRoomLock = new ReentrantLock();
    
    public void run(){
    	String myName = this.getName();
        try{
        	pairRoomLock.lock();
            //임계 영역 시작
            System.out.println(myName + "은(는) 페어룸에 들어갔다.");
            Thread.sleep(2000);
            System.out.println(myName + "은(는) 페어룸에 나왔다.");
            //임계 영역 종료
        }catch (InterruptedException e){
        	throw new RuntimeException(e);
        } finally{
           pairRommLock.unlock(); // 뮤텍스 락 해제
        }
    }
}

java에서는 뮤텍스를 직접적으로 지원해주지 않아 비슷한 기능을 하는 lock을 통해 구현함

세마포어 (Semaphore)

여러개의 프로세스/스레드가 공유 자원에 동시에 접근하는 것을 제한하기 위한 counter
0보다 큼 => 새로운 스레드 임계 영역 진입 / 0 => 임계 영역 진입 불가
0보다 작음 => 대기 큐에 있는 프로세스/스레드 개수.

  • P연산
    wait-> count-- , 스레드를 준비 큐에 추가, 스레드 중단
    임계 영역의 스레드가 작업을 끝날 때까지 대기하다가 count가 0보다 커지면 진입, 진입하면서 다른 스레드의 추가 진입을 방지하기 위해 P연산 사용

  • V연산
    signal-> count++, 준비 큐에서 스레드를 제거, 신호를 보내 스레드 실행
    스레드가 임계 영역에서 작업을 끝마치고 나올 때 다른 스레드 진입을 허용하기 위해 사용

뮤텍스와 세마포어의 차이

  • 뮤텍스는 동기화 대상이 오직 1개일 때 사용하며, 세마포어는 동기화 대상이 1개 이상일때 사용 => 뮤텍스는 자원 소유가 가능하고 책임을 가지나, 세마포어는 그렇지 않다.

  • 뮤텍스는 상태가 0,1(lock가짐,안가짐)이며, 자원을 소유하고 있는 스레드만이 이 뮤텍스를 해제할 수 있다. 반면 세마포어는 세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있다.

  • 세마포어는 시스템 범위에 걸쳐있고, 파일 시스템 상의 파일로 존재하는 반면, 뮤텍스는 프로세스의 범위를 가지며 프로세스가 종료될 때 자동으로 clean up된다.

profile
풀스택 호소인

0개의 댓글