일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 쿼리셋합치기
- 컨트리뷰팅
- cannot import name
- circuitbreaker
- 상속모델
- 주니어개발자
- Not Null constraint failed
- bean-validator
- circular dependency
- 토이프로젝트
- IOC
- resilience4j
- Npoem
- 일급함수
- n poem
- Spring
- Java
- 마이크로서비스패턴
- 함수형프로그래밍
- 좋은코드란
- DI
- GraphQL
- API문서화
- 객체비교
- django
- SpringBoot
- 2차원배열 정렬
- 프로젝트설정
- bulk_create
- 운영체제
- Today
- Total
코딩 하는 가든
운영체제 - 상호배제의 기법, 세마포어 / 뮤텍스 / 모니터 본문
운영체제 수준에서 지원하는 여러 가지 병행성 기법
운영체제와 프로그래밍 언어 수준에서 병행성을 위해 제공하는 기법에 대해 기록합니다.
우선 이런 기법들이 왜 필요한지 간단하게 알아보겠습니다.
알고 가야 할 것
- 임계자원 : 두 개 이상의 프로세스가 동시에 사용할 수 없는 자원
- 임계영역 : 그 자원을 접근하는 프로그램 코드의 일부분
어떤 프린터가 있다고 하겠습니다. 프린터에 두 개의 프로세스가 동시에 출력을 하려고 한다면 먼저 시작된 하나의 출력이 종료된 후 다음 출력이 진행되어야 할 것입니다. 두 출력이 동시에 진행될 수는 없습니다.
여기에서 프린터는 두 프로세스가 동시에 사용할 수 없는 임계 자원이 됩니다. 그리고 프린터를 사용하기 위해 프로세스가 프린터 관련 작업 명령어를 수행하는 구간이 바로 임계 영역이 됩니다.
그렇다면 이때, 이러한 임계 영역에 두 프로세스가 동시에 접근할 수 없도록 제어하는 것이 상호 배제 기법이며 이는 운영체제 및 프로그래밍 언어 수준에서 지원됩니다.
지금부터 여러 가지 상호 배제 기법 중 대표적인 것들인 세마포어(Semaphore), 뮤텍스(Mutex), 모니터(Monitor)에 대해 알아보겠습니다.
세마포어
세마포어는 프로세스간 시그널을 주고 받기 위해 사용되는 0 또는 양의 정수 값 입니다. 세마포어는 세 가지 동작을 할 수 있습니다.
- 세마포어 초기화 : 세마포어 값을 초기화 한다.
- semWait : 세마포어 값을 감소시킨다.
- semSignal : 세마포어 값을 증가시킨다.
세마포어를 조작하는 방법은 위의 세 가지가 끝입니다.
세마포어의 값은 setWait을 호출하고도 수행 될 수 있는 프로세스의 수 입니다.
예시를 들어 설명 해 보겠습니다.
- processA와 processB가 있고 세마포어는 2로 초기화 되어 있습니다. ( 현재 세마포어 : 2 )
- processA가 semWait을 호출하고 그대로 수행 됩니다. 세마포어는 감소되어 1이 되었습니다. ( 현재 세마포어 : 1 )
- processA가 여전히 수행중이고, processB 또한 semWait을 호출 합니다. 세마포어는 감소되었습니다. ( 현재 세마포어 : 0 )
- 이 때 갑자기 processC가 나타나 semWait을 호출 하려 합니다. 하지만 세마포어는 0 이기 때문에 processC는 그대로 수행되지 않고 보류 됩니다. ( 현재 세마포어 : 0 )
- processA가 일을 마치고 semSignal을 호출하여 세마포어를 증가 시킵니다. ( 현재 세마포어 : 1 )
- 보류 되었던 processC는 세마포어가 1이 되었기 때문에 setWait을 호출 하고 작업을 마저 할 수 있게 됩니다. ( 현재 세마포어 : 0 )
보여드린 예시와 같이 세마포어의 값은 수행 될 수 있는 프로세스 수를 나타냅니다. 한 세마포어에 대해서 semWait을 호출 하려고 할 때 세마포어가 0이라면 semWait을 호출한 프로세스는 보류 되고 세마포어가 양수가 될 때 까지 기다립니다.
[강성 세마포어]
만약 이렇게 보류된 프로세스가 여러개라면 어떻게 될 까요? 이것은 세마포어가 가지는 정책에 따라 다른데 보류 된 프로세스를 순서대로 큐에 넣어 먼저 보류된 프로세스가 먼저 작업을 할 수 있게 해주는 것이 강성 세마포어 입니다.
[약성 세마포어]
약성 세마포어는 강성 세마포어와 다르게 보류된 프로세스들이 누가 먼저 작업을 시작할지 특별히 명시해 놓지 않는 세마포어 입니다.
특히 세마포어 중에서 단지 0과 1의 값만을 갖는 세마포어를 이진(binary) 세마포어 라고 합니다. 이와 연관되어 있는 개념이 이어 설명할 뮤텍스 (Mutual Exclusion Lock) 입니다.
뮤텍스
뮤텍스(Mutex)는 세마포어와 함께 상호배제를 구현하는 기법입니다. 사용하려는 데이터가 공유될 수 없거나 동시에 연산을 수행 할 수 없는경우 뮤텍스를 설정 합니다. 뮤텍스는 세마포어가 마치 0과 1의 두 값만을 갖고 있는 형태와 비슷 합니다. 다른 점이 있다면 세마포어는 semWait(세마포어 감소)과 semSignal(세마포어 증가)가 다른 프로세스에서 일어날 수 있지만 뮤텍스는 0으로 설정한 프로세스만이 값을 1로 올려줄 수 있습니다. 다시 말해 뮤텍스 락을 설정한 프로세스만이 락을 해제할 수 있습니다.
모니터
세마포어는 강력한 상호배제 기법을 제공 합니다. 하지만 세마포어를 이용해서 올바른 프로그램을 만드는것은 어려우며 semWait과 semSignal이 프로그램 전체에 산재 하기 때문에 전체적인 프로그램 파악을 어렵게 합니다. 이러한 문제점의 해결방안으로 제시된것이 모니터 입니다.
세마포어의 제어 기법을 비유 하자면 아래의 그림과 같은데, 세마포어는 자신에 대해 semWait semSignal연산을 하는 프로세스를 찾아다닙니다. 이것은 마치 어디서 semWait, semSignal이 일어나는지 프로그래머가 직접 찾아다니는것과 같습니다.
하지만 모니터를 사용하게 되면 아래의 그림과 같습니다. 세마포어 같은 프로세스 자원 분배를 담당하는 변수가 모니터 내에 있고 이 변수는 모니터 내에서만 접근 할 수 있습니다. 자원이 필요한 프로세스는 모니터에 접근하여 모니터의 허락(조건 변수 판단)을 맡고 보류될지 작업을 수행할지 결정 합니다.
모니터의 특징은 다음과 같습니다.
- 외부에서 모니터 내부 지역변수에 접근 할 수 없다.
- 프로세스는 모니터의 프로시저를 호출함으로써 모니터 내부로 접근 한다.
- 한 순간에 오직 하나의 프로세스만이 모니터 내에 존재할 수 있다. (상호배제 실현)
모니터는 내부에 프로세스의 상호 배제 조건을 가르키는 조건 변수를 제공합니다. 모니터의 조건 변수에는 두 가지 연산을 할 수 있습니다.
-
cwait : 호출한 프로세스를 일시 중지 시킨다. 모니터에는 이제 다른 프로세스가 들어올 수 있다.
-
csignal : cwait에 의해 중지되었던 프로세스가 수행을 재개 한다. 중지된 프로세스가 없다면 시그널은 소실된다.
모니터는 위와 같은 연산을 통해 프로세스가 중지, 재개 되고 한 번에 하나의 프로세스만이 모니터 내에서 실행 될 수 있도록 하며 상호 배제를 보장하는 기법입니다.
'CS > 운영체제' 카테고리의 다른 글
운영체제 - 교착상태(Deadlock)와 해결 방안 (0) | 2020.08.13 |
---|---|
운영체제 - 프로세스와 스레드의 차이 (0) | 2020.08.05 |