멀티 프로그래밍환경에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, 임계 구역으로 불리는 코드 영역에 의해 구현된다.
* 하나의 프로세스가 공유 자원을 사용할 때 다른 프로세스의 접근을 막는 것
멀티 프로세스나 멀티 스레드 동기화에 사용 :
동기화(Syncronize) : 상호배제를 위해 실행을 제어. * 뮤텍스, 세마포어, 모니터 등
상호배제 관련 내용은 아래 링크 참고
https://hojinjeong.tistory.com/245
[운영체제] 교착상태
교착 상태(DeadLock) 두 가지 이상의 작업이 서로 상대방의 작업이 끝나기를 무한정 기다리는 상태. 멀티 쓰레드 프로그래밍에서 동기화를 통해 락을 획득하여 자원을 여러 곳에서 함부로 사용하
hojinjeong.tistory.com
공유자원에 접근하는 프로세스 내부의 코드 영역으로 어떤 한 프로세스가 이 영역을 수행중일 때, 다른 프로세스가 같은 영역을 수행한다면 문제가 발생할 수 있다.
* 공유자원 : 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일
이러한 문제가 발생하지 않도록 한번에 하나의 프로세스만 이용할 수 있도록 보장해야 하는 영역이다.
1. 상호배제
2. 진행
3. 한정 대기
임계영역의 동시접근을 해결하기 위한 방법으로 락(lock), 세마포어(semaphore), 모니터(monitor)등이 있다.
멀티 프로그래밍 환경에서 자원에 대한 접근에 제한을 강제하기 위한 동기화 기법이다.
뮤텍스 알고리즘
데커(Dekker) 알고리즘 : flag와 turn 변수를 통해 임계영역에 들어갈 프로세스를 결정
while(1) { // 프로세스i의 진입 영역
flag[i] = ture; // 프로세스i가 임계구역에 진입하기 위해 진입을 알림
while(flag[j]) { // 프로세스j가 임계구역에 진입하려고 하는지 확인
if (turn == j) { // 프로세스j가 임계구역에 있다면
flag[i] = flase; // 프로세스i가 진입을 취소하고
while (turn == j); // 프로세스i의 차례가 올 때까지 대기 함.
flag[i] =ture; // 차례가 넘어왔다면 진입을 알림.
}
}
// 임계영역
turn = j; // 임계구역의 사용이 끝났다면 차례를 프로세스j에게 넘김.
flag[i] = false; // 진입을 취소하여 임계구역 사용완료를 알림.
}
피터슨(Peterson) 알고리즘 : 데커 알고리즘과 유사하지만 상대방(다른 프로세스 또는 다른 스레드)에게 진입기회를 양보
while(1) {
flag[i] = true; // 프로세스i가 임계영역에 진입을 시도
turn = j; // 다른 프로세스에 진입 기회를 양보
while(flag[i] && turn==j); // 다른 프로세스가 진입을 시도하면 대기 아니면 진입
/* 이곳은 임계영역이다. */
...
flag[i] = false; // 임계영역 사용 완료
...
}
램퍼드의 베이커리 알고리즘(Lamport's Bakery Algorithm) : 여러 개의 프로세스(혹은 스레드)에 대한 처리가 가능하다. 가장 작은 수의 번호표를 가지고 있는 프로세스가 입계영역에 진입한다.
while(1) {
...
isReady[i] = true; // 번호표를 받을 준비
number[i] = max(number[0~n-1]) +1 // 현재 실행 중인 프로세스 중 가장 큰 번호로 배정
isReady[i] = false; // 번호표 수령 완료
for( j =0; j < n; j++ ) { // 모든 프로세스에 대해 번호표를 비교한다.
while( isReady[j] ); // 비교할 프로세스가 번호표를 받을 때까지 대기
while(number[j] && number[j] < number[i] && j<i);
// 프로세스 j가 번호표를 가지고 있고,
// 프로세스 j의 번호표가 프로세스i의 번호표보다 작거나 같을 경우
// j가 i보다 작다면(프로세스 j가 i보다 먼저 온 프로세스이면)
// 프로세스 j의 종료(number[j]=0)까지 대기
}
/* 이곳은 임계영역이다. */
...
number[i] = 0; // 임계영역 사용 완료
...
}
멀티 프로그래밍 환경에서 다수의 프로세스나 스레드가 n개의 공유 자원에 대한 접근을 제한하는 방법으로 사용되는 동기화 기법이다.
* 강성 세마포어 : 큐에 연결된 스레드를 깨울 때 FIFO 정책.
* 약성 세마포어 : 큐에 연결된 스레드를 깨울 때 순서를 특별히 명시하지 않음.
* wait이 먼저 호출되어 임계영역에 들어갈 수 있는지 확인 / 먼저 실행되어야 하는 프로세스가 실행되는지 확인
* 조건에 만족하면 wait을 빠져나와 임계영역으로 들어간다.
* 이후 signal이 호출되어 임계영역에서 빠져나왔음을 알린다.
예시
counting semaphore 예시
semaphore 접근 함수 wait(), signal()
공유 자원을 사용하려 했지만, 현재 사용할 수 있는 공유 자원이 없어 기다려야 한다. - wait()
비어있는 공유 자원이 있으면 기다리지 않고 사용한다.
현재 세마포어의 값이 0이라면, wait()이다.
공유자원을 사용하고 반납하면 세마포어 값을 증가시켜주어야 한다. 대기하고 있는 프로세스가 있다면 사용할 수 있다는 것을 알려줘야 하므로 신호를 보내준다. - signal()
뮤텍스, 세마포어를 사용할 때 타이밍 오류가 발생할 수 있다. 예를 들어, wait(), signal() 연산의 순서가 바뀌는 경우, 임계영역이 끝나고 signal()대신 wait()이 호출되는 경우 오류가 발생하게 된다. 이를 보완한 것이 모니터이다.
* 모니터는 세마포어와 달리 wait(), signal() 설정을 해주지 않고, synchronized 키워드를 사용하면 알아서 상호배제하여 함수 작업을 수행한다.
프로세스 또는 스레드를 동기화하는 방법 중 하나이다. 모니터는 하나의 데이터마다 결합함으로써 동시에 두 개 이상의 스레드에 의해 접근할 수 없도록 막는 잠금 기능을 제공함으로써 동기화를 수행한다.
모니터는 두 개의 queue를 가지고 있다.
모니터 원리
공유자원을 점유중인 프로세스(스레드)는 Lock을 가지고 있다. 공유자원을 점유 중인 프로세스가 있는 상황에서 다른 프로세스가 공유자원에 접근하려고 하면 외부 모니터 조건동기 큐에서 진입을 기다린다.
자바의 모든 객체는 모니터가 될 수 있다. 배타 동기는 synchronized 를 사용해서 지정할 수 있고, 조건 동기는 wait()함수와 notify() 함수, notifyAll() 함수를 사용한다. 배타 동기를 지정하는 함수들은 공통자원을 사용하고 있는 경우이다.
위의 흐름은 모니터는 하나의 프로세스(애플리케이션)내에 다른 스레드 간에 동기화할 때 사용된다.
* 자바의 모든 인스턴스는 모니터를 가지고 있으며, 모니터를 통해 스레드 동기화를 수행한다.(Object 내부에 존재)
* 모니터의 라이프 사이클은 synchronized 키워드에 의존하기 때문에 인스턴스가 가지는 wait(), notifty(), notifyAll() 메소드는 모두 synchronized 블록에서만 유의미하다.
* 모니터의 경우 세마포어처럼 여러 자원을 이용할 수 없지만, 특정 작업이 완료되기를 기다리는 스레드가 있을 수 있기 때문에 이런 경우에 작업이 완료되면 모든 대기 스레드를 동시에 깨울 때 notiftyAll() 을 사용한다.
예시
자바에서 스레드를 동기화하는 방법으로 모니터가 사용되는데 synchronized 메소드가 선언된 객체와 synchronized블럭에 의해 동기화되는 모든 객체에 고유한 모니터가 결합이 되어 동기화 작업을 수행하게 된다.
세마포어에 비해 모니터는 공유자원에 접근할 수 있는 키의 획득과 해제를 모두 처리해서 간단하다. 세마포어는 직접 키해제와 공유자원 접근처리를 해주어야 한다.
참고 :
https://about-myeong.tistory.com/34
[운영체제] 뮤텍스(Mutex) 세마포어(Semaphore) 모니터(Monitor)
Mutex / Semaphore / Monitor / OS / 아래는 여러 글들을 바탕으로 내가 이해한 뮤텍스, 세마포어, 모니터 간의 차이점이다. 공통점은 세가지 모두 운영체제의 동기화 기법이라는 것이다. 우선 뮤텍스, 모
about-myeong.tistory.com
[OS] 상호배제 방법 : 뮤텍스, 세마포어, 모니터
상호 배제(mutual exclusion) 멀티 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, 임계 구역으로 불리는 코드 영역에 의해 구현된다. = 하나의 프로세스가
dar0m.tistory.com
https://steady-coding.tistory.com/557
[Java] 뮤텍스, 세마포어, 모니터
java-study에서 스터디를 진행하고 있습니다. 뮤텍스 (Mutual Exclusion) 멅리 프로그래밍 환경에서 자원에 대한 접근에 제한을 강제하기 위한 동기화 기법이다. 특징은 다음과 같다. Boolean 타입의 Lock
steady-coding.tistory.com
https://dev-splin.github.io/cs(computer%20science)/operating%20system/OS-Mutex,Semaphore,Monitor/
Operating System : 뮤텍스(Mutex) / 세마포어(Semaphore) / 모니터(Monitor)
뮤텍스(Mutex) / 세마포어(Semaphore) / 모니터(Monitor) 뮤텍스(Mutex) ,세마포어(Semaphore), 모니터(Monitor) 전부 운영체제의 상호배제(Mutual Exclusion) 동기화 기법입니다. 뮤텍스(Mutex) 뮤텍스(Mutex)는 상호배제
dev-splin.github.io
https://preamtree.tistory.com/26
[IT 기술면접 준비자료] 상호배제(Mutual Exclusion)와 상호배제 알고리즘
상호배제(Mutual Exclusion)란, 특정 프로세스가 공유 자원을 사용 중일 때 다른 프로세스가 이 자원에 접근하지 못하도록 막는 것을 의미한다. 그러니까, 공유를 하면 안되는 자원(Resource)의 동시 사
preamtree.tistory.com
운영체제 - 공유자원과 임계구역
공유자원과 임계구역
yansigit.github.io
https://jhnyang.tistory.com/101
[운영체제]세마포어(semaphore) 완전 쉬운 이해! wait(), signal(), 이진, 계수형
운영체제 완전 정복 목차~! semaphore의 유래~! 세마포어란? Semaphore는 깃발이라는 뜻입니다. 옛날에는 기찻길에서 깃발 표식으로 파란색이 걸려있으면 지나가도 되고 빨간색이 걸려있으면 섰다가
jhnyang.tistory.com
세마포어, 뮤텍스, 모니터
정수값을 갖는 변수이며 자원의 개수를 의미한다동기화 기법 중 추상적인 방법이며 여러 프로세스들에 의해 공유되는 변수로 정의된다.이 변수는 오직 wait와 signal이라는 atomic한 연산에 의해
velog.io
[etc] intellij javascript debug (0) | 2023.08.31 |
---|---|
[운영체제] 병행(Concurrency)과 병렬(Parallelism)의 정리 (0) | 2023.04.27 |
[운영체제] 교착상태 (0) | 2023.04.17 |
[운영체제] 선점 스케줄링 / 비선점 스케줄링 (0) | 2023.04.04 |
[git] intellij 프로젝트 git 올리기 (0) | 2023.02.06 |