Skipalong's tistory
240311 TIL - 공유자원과 임계영역 본문
오늘은 공유자원과 임계영역에 대해 정리를 해 보았다.
공유자원
- 공유자원이란 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수 등을 의미 ex) 모니터, 프린터, 메모리, 파일, 데이터
- 공유자원을 두 개 이상의 프로세스(스레드)가 동시에 읽거나 쓰는 상황을 경쟁 상태(race condition)이라고 함 동시에 접근을 시도 할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태 ex) 책의 예시, 우리 프로젝트에서의 좋아요, 티켓팅, 은행 입출금 등등
임계 영역
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
- 임계 영역을 해결하기 위한 방법으로는 뮤텍스, 세마포어, 모니터가 있음(lock 매커니즘을 토대로함)
- 위 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족함
상호배제(mutual exclusion)
- 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
한정 대기(bounded waiting)
- 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안된다.
융통성(progress)
- 만약 어떠한 프로세스도 임계 영역을 사용하지 않는다면 임계 영역 외부의 어떠한 프로세스도 들어갈 수 있으며
이 때 프로세스끼리 서로 방해하지 않는다.
뮤텍스
- 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 객체 → 동시에 하나의 프로세스나 스레드만 공유자원을 점유하도록 보장
- 잠금 또는 잠금 해제라는 상태만을 가짐
- 장점
- 단순하고 이해하기 쉬우며, 임계 영역 접근을 엄격하게 제어할 수 있음
- 단점
- 데드락(Deadlock) 발생 가능성이 있으며, 스레드가 뮤텍스를 잡고 있을 때 다른 스레드는 대기 상태가 되어 자원 활용도가 낮아질 수 있음
세마포어
- 세마포어는 일반화된 뮤텍스
- 간단한 정수 값과 wait(P함수), signal(V함수)함수로 공유 자원에 대한 접근을 처리
- wait()은 자신의 차례가 올 때까지 기다리는 함수(0 < 세마포어 값 이면 세마포어 값 -1, 자원에 접근)
- signal()은 다음 프로세스로 순서를 넘겨주는 함수(공유자원의 사용을 마치면 세마포어 값 +1)
- 작동원리
- 세마포어는 원자적(Atomic)으로 제어되는 정수 변수로, 일반적으로 세마포어의 값이 0이면 자원에 접근할 수 없도록 블럭(Block) 하고 0보다 크면 접근함과 동시에 세마포어의 값을 1 감소시킴
- 반대로 종료하고 나갈 때에는 세마포어의 값을 1 증가시켜 다른 프로세스가 접근할 수 있도록 함
바이너리 세마포어
- 0과 1의 두 가지 값만 가질 수 있는 세마포어
- 뮤텍스와 유사한 방식으로 작동
- 뮤텍스와 차이점은 뮤텍스는 lock기반의 잠금 매커니즘, 바이너리 세마포어는 신호 기반의 신호 매커니즘
- 장점
- 뮤텍스와 마찬가지로 상호 배제를 제공
- 구현이 간단하며, 운영 체제 수준에서 지원
- 단점
- 뮤텍스와 유사하게 데드락 위험이 있으며, 우선순위 역전 문제가 발생할 수 있음
카운팅 세마포어
- 카운팅 세마포어는 여러 개의 값을 가질 수 있는 세마포어
- 공유 자원에 대한 동시 접근이 가능한 개수를 제한 ex) 세마포어의 값이 3이라면 최대 3개의 스레드가 동시에 공유 자원에 접근할 수 있음
- 장점
- 다수의 스레드가 동시에 공유 자원에 접근할 수 있어 자원 활용도가 높음
- 단점
- 올바른 세마포어 값 설정이 어렵고, 데드락과 같은 동기화 문제를 완전히 해결하지 못할 수 있음
모니터
- 세마포어를 사용하기 위해서는 임계 구역에 명시적으로 상호 배제 로직을 구현함
- 모니터는 이 상호 배제 로직을 추상화하고, 공유 자원 접근에 대한 인터페이스만을 제공
- 공유 자원도 외부로부터 캡슐화하여 숨김 → 세마포어에 비해 좀 더 고수준이라고 할 수 있음
- 모니터는 모니터큐에 작업을 순차적으로 쌓아두고, 한번에 한 프로세스/쓰레드만 임계 영역에 접근할 수 있도록 함 → 한번에 하나의 프로세스만 모니터에서 활동할 수 있도록 보장
- 개념적으로는 이진 세마포어의 기능을 제공하는 것
- ex) JAVA의 Syncronized 키워드
- 장점
- 뮤텍스나 세마포어보다 추상화 수준이 높아 사용하기 쉬움, 실수가 줄어듦
- 데드락을 방지하는 추가적인 메커니즘을 제공할 수 있습니다.
- 단점
- 모니터를 지원하지 않는 프로그래밍 언어나 환경에서는 사용하기 어려움
- 성능 저하가 발생할 수 있으며, 설계가 복잡해질 수 있음
이렇게 공유자원과 임계영역에 대해 정리를 해 보았는데 이 부분은 다른 부분과 다르게 최종프로젝트에서 동시성 문제에 대해 많이 찾아보아서 내용이 조금 익숙하고 반가웠다.
앞으로도 배우다보면 익숙한내용이 점점 많아질 거라 생각하고 열심히 해야겠다.
'TIL' 카테고리의 다른 글
240313 TIL - 정규화 (1) | 2024.03.14 |
---|---|
240312 TIL - 데이터베이스의 속성과 도메인 (0) | 2024.03.13 |
240308 TIL - 프로세스의 상태 (0) | 2024.03.09 |
240307 TIL - 가상메모리 (0) | 2024.03.08 |
240306 TIL - SEO와 Https (0) | 2024.03.07 |