2021. 3. 8. 22:37ㆍ운영체제
세마포어와 뮤텍스 둘 다 상호배제를 해결하기 위한 방법
= 병행처리를 위한 프로세스 동기화 기법
= 여러 프로세스나 쓰레드가 공유 자원에 접근하는 것을 제어하기 위한 방법
세마포어 (Semaphore)
세마포어는 정수값을 갖는 변수이다.
이 정수값이 접근할 수 있는 최대 허용치를 의미하며, 이 값 만큼 동시에 사용자가 접근할 수 있다.
semWait 연산
세마포어 값을 감소시킨다.
값이 음수가 되면 semWait를 호출한 프로세스는 블록된다.
semSignal 연산
세마포어 값을 증가시킨다.
값이 양수가 아니면 (0 또는 음수이면) semWait 연산에 의해 블록된 프로세스들을 깨운다.
struct semaphore {
int count;
queueType queue;
};
void semWait (semaphore s) {
s.count--;
if (s.count < 0) {
/* 이 구역으로 들어왔다는 것은 현재 프로세스(혹은 쓰레드)가 공유 자원에 접근할 수 없다는 것을 의미*/
/* 요청한 프로세스를 s.queue에 연결 */
/* 요청한 프로세스를 블록 상태로 전이 시킴*/
}
}
void semSignal (semaphore s) {
s.count++;
if (s.count <= 0) {
/* count가 0보다 작거나 같다는 것은 대기하고 있는 프로세스(또는 스레드)가 존재한다는 것을 의미*/
/* s.queue에 연결되어 있는 프로세스를 큐에서 제거 */
/* 프로세스의 상태를 실행 가능으로 전이시키고 ready list에 연결 */
}
}
강성 세마포어
큐에 연결된 프로세스들을 깨울 때 선입선출(FIFO)정책을 사용
약성 세마포어
큐에 연결된 프로세스들을 깨울 대 순서를 특별히 명시하지 않음
이진 세마포어 (Binary Semaphore)
상호배제, 프로세스 동기화
세마포어 변수 : 0 또는 1
계수형 세마포어 (Count Semaphore)
동시에 진행 가능한 프로세스의 개수 정의 가능
세마포어 변수 : 0, 1, 2, ...
뮤텍스 (Mutex)
뮤텍스는 0 또는 1의 초기값을 갖는다.
임계구역에 들어갈 때 락(Lock)을 걸어 다른 프로세스 (혹은 쓰레드)가 접근하지 못하도록 잠그고
임계영역에서 나올 때 해당 락을 해제(Unlock)한다.
0일 때 임계구역 내 프로세스 존재 / 1일 때 임계구역 비어있음
뮤텍스가 1일 경우 1이 될 때 까지 기다린다.
= 임계구역이 빌 때 까지 기다린다.
= 임계구역 내의 프로세스가 나올 때 까지 기다린다.
mutex = 1;
void lock () {
while (mutex != 1) {
/* mutex 값이 1이 될 때까지 기다립니다.*/
}
/* 이 구역에 도착했다는 것은 mutex 값이 1이라는 것입니다.
따라서 이제 뮤텍스 값을 0으로 만들어 다른 프로세스(혹은 쓰레드)가 접근하지 못하도록 막아야 합니다.
*/
mutex = 0;
}
void unlock() {
/* 임계 구역에서 나온 프로세스는 다른 프로세스가 접근할 수 있도록 락을 해제합니다.*/
mutex = 1;
}
세마포어와 뮤텍스의 차이
세마포어는 공유자원에 세마포어 변수만큼의 프로세스(또는 쓰레드)가 접근할 수 있다.
반면에 뮤텍스는 오직 1개의 프로세스(또는 쓰레드)만 접근할 수 있다.
세마포어는 락(Lock)을 설정한 프로세스가 아닌 다른 프로세스가 락을 해제(Unlock)할 수 없다.
뮤텍스는 락을 설정한 프로세스 자신만이 그 락을 해제할 수 있다.
(이진 세마포어와 뮤텍스는 비슷하지만 락을 해제하는 주체가 다르다)
'운영체제' 카테고리의 다른 글
IPC의 종류와 특징 (0) | 2021.03.09 |
---|---|
멀티 프로세스와 멀티 쓰레드의 차이 (0) | 2021.03.08 |
쓰레드 (Thread) (0) | 2021.03.08 |
운영체제 유형별 특징 (0) | 2021.03.08 |