수 많은 우문은 현답을 만든다

세마포어(Semaphore) 본문

개발지식/Springboot

세마포어(Semaphore)

aiden.jo 2022. 7. 13. 11:00

안녕하세요 조영호입니다.

오늘은 업무 중 세마포어와 관련된 질문을 받았고 바로 명쾌하게 대답하지 못했던 것이 아쉬워서 글로 남겨봅니다.

 

받은 질문과 대답

Q :"현 프로젝트에서 세마포어 구조를 쓰고있나요? 가령, 캐시 사용 같은 부분에서요"

A : "프로세스 간에 함께 공유하는 자원이 없어 세마포어를 쓰고있지 않습니다"

 

자 우선 OS 이론에서 자주 등장하는 세마포어, 뮤텍스, 동기화의 차이에 대해서 알아보겠습니다.

  1. 세마포어(Semaphore) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줍니다(즉, 동기화 대상이 하나 이상)

  2. 뮤텍스(Mutex) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아줍니다(즉, 동기화 대상이 하나)

  3. 동기화(synchronized) : 어떤 Thread가 진입하는 순간 다른 Thread의 진입을 막습니다. 쉽게 말해 하나의 쓰레드가 작업을 완전히 종료 한 뒤에 다른 쓰레드가 작업을 시작할 수 있습니다.

정리하자면, 동기화는 Thread 1번이 처리되고 Thread 2번이 작업을 하는 반면, 세마포어는 설정한 수 만큼 Thread가 동시에 일을하고 나머지는 대기를 하는 구조입니다.

 

 

대답 해설

제 대답의 의미에 대해서 한번 살펴보겠습니다.

참고로 제가 개발한 서비스는 A서비스 B서비스가 각각 실행되고 있고 둘 다 Redis cache에 접근을 합니다.

 
레디스는 공용 캐시로 쓰고있고 두개의 서비스에서 쓰기 읽기를  하고있는데 동시에 세마포어를 구현해야 하지않나요?

  1. 물론 레디스를 읽기 용도로만 쓴다면 공유하는 자원(쓰기가 발생)이 없기 때문에 세마포어를 구현할 필요가 없습니다.

  2. 지금 서비스에서는 수정이 발생합니다. 하지만 Redis 자체가 Single Thread 로 동작하기 때문에 세마포어를 구현할 필요가 없습니다. 즉 생성이나 수정등의 여러 명령어들이 들어오면 Redis는 Queue에 명령어들을 보관했다가 single thread 가 한개씩 처리하는 방식을 사용하기 때문에 따로 제어할 필요가 없는 것이지요.

그럼 파일을 쓰거나 수정하는 경우에는 세마포어 구현이 필요한가요?

Redis와 동일한 경우로 파일을 읽기만 한다면 세마포어가 필요 없습니다. 그러나 파일 수정이 발생한다면(예를들어 이미지 저장이나 수정) 두 개의 쓰레드가 파일을 동시에 수정하지 않도록 File Lock 로직을 구현해야하고 이때 세마포어를 사용하게 됩니다.

 

 

 

감사합니다.

 

 

참고

https://jwprogramming.tistory.com/13

https://javaplant.tistory.com/30

http://wp.koolkuri.com/%ED%8E%8C-%ED%8C%8C%EC%9D%BC%EB%9D%BDfile-lock/