ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 모니터와 세마포어
    운영체제 2023. 8. 15. 13:04
    728x90

    스레드와 공유 자원 사이의 상호작용을 할 제어할때 스레드 동기화 메커니즘을 사용하게 됩니다. 스레드 동기화는 모니터(Monitor)와 세마포어(Semaphore)로 구성됩니다.
     
    먼저 모니터상호 배제 자물쇠로 보호되는 집단을 뜻합니다. 스레드는 자물쇠를 획득하기 전까지는 모니터에 속하는 루틴을 실행 할 수 없습니다. 즉 한 모니터 안에서는 하나의 스레드씩 실행되게 됩니다. 다른 스레드드들은 실행 중인 스레드에서 그 자물쇠를 반납할 때 까지 대기해야합니다. 모니터에 속한 스레드가 특정 이벤트까지 기다리기 위해 스스로 멈추면 대기 중이던 다른 스레드가 모니터로 진입할 수 있습니다. 

     
    세마포어는 공유자원을 보호하기위한 자물쇠만 있는 것이라고 생각하면 됩니다. 스레드에서 공유 자원을 사용하려면 자물쇠를 획득해야합니다. 자물쇠를 소유하고있는 스레드에서 자물쇠를 반납하기 전까지는 그 자원을 획득하여 사용하려는 다른 스레드는 대기하게되고, 자물쇠를 반납하는 순간 대기 중이던 스레드가 그 자물쇠를 획득하게 됩니다.
    이런 방식이 가장 기본적인 방식인 세마포어인데 이를 상호배제 세마포어 줄여서 mutex라고 합니다.(상호 배제 과제에서 사용한적이..)

    모니터와 세마포어 모두 멀티 스레드 환경에서 공유자원사용을 제어한다는 목적을 달성하는데에 사용되지만 자물쇠의 획득과 해제를 모두 처리해주는 모니터 쪽이 더 간단하게 쓰기좋다고 합니다.
    세마포어를 사용할때 예상치못한 스레드 종료 등의 문제 발생을 대비해 각 스레드에서 획득한 자물쇠를 해제하는 작업을 일일히 처리해주어야한다는 단점이있습니다. 반면에 모니터에서는 컴파일러에서 명시적으로 자물쇠획득하는것을 잡아주지않아 생기는 실수를 방지하기위해 자동으로 필요한 자물쇠를 획득하고 해제해줍니다.
     
    대부분의 시스템에서는 일정 시간 안에 자원을 획득하지 못할 시 스레드가 타임아웃에 걸리게하는 방식을 사용하는데, 이 방식으로 스레드가 에러를 알려주고 재시도하게해줍니다.
     
    공유자원에 접근할때 자물쇠를 획득하고 해제하는 시간이 걸리는데, 이런 이유때문에 일반적으로 라이브러리에서 스레드용과 비스레드용 클래스를 별도로 제공합니다. 
    대표적으로 자바의 StringBuffer(스레드용), StringBuilder(비스레드용)이 있습니다. 비스레드용이 빠르기 때문에 일반적으로는 비스레드용을 사용하고, 스레드용은 필요시에만 사용합니다.
     

    '운영체제' 카테고리의 다른 글

    데드락(DeadLock)  (1) 2023.08.15
    프로세스와 쓰레드  (0) 2023.08.01
Designed by Tistory.