매주 진행하는 면접스터디에서 아래의 질문들에 대한 정리를 모은 글입니다.
Interview_Question_for_Beginner/OS
운영체제 8장 - 세마포(semaphore)
A와 B를 서로 동일하게 만드는 작업을 의미한다. 프로세스 동기화란 여러 프로세스가 공유하는 자원의 일관성을 유지하는 것이다. 그를 위해 공유하는 자원에 하나의 프로세스만이 이용하도록 제어한다.
동일한 자원에 동시에 접근하는 작업(ex. 공유하는 변수 사용, 동일 파일 접근 및 수정 등)을 실행하는 코드 영역을 Critical Section이라고 부른다.
이전에 살펴보았던 멀티 스레딩의 문제점 중 하나이다.
프로세스들이 Critical Section을 함께 사용할 수 있는 프로토콜을 설계한다.
하드웨어 기반의 해결책이다. 동시에 공유 자원에 접근하는 것을 막기 위해 Critical Section에 진입하는 프로세스는 Lock을 획득하고 Critical Section을 빠져나올 때, Lock을 방출한다.
Spin Lock이라고 부르는 세마포 초기 버전에서 임계 구역에 진입하는 프로세스는 진입 코드를 계속해서 반복 실행하며 CPU를 낭비한다. 이를 Busy Waiting이라고 부른다.
해결하기 위한 방법으로, 세마포에서 Critical Section에 진입 실패한 프로세스에 대해 Block시킨 뒤, 자리가 나면 다시 깨우는 방식을 사용한다.
다중처리기(Multi-Processor) 환경에서는 시간적인 효율성 측면에서 적용할 수 없다.
한 프로세스 내부에서 여러 스레드의 임계구역 제어를 위해 사용하는 객체이다.
세마포어와 뮤텍스(== 이진 세마포) 모두 동기화를 위한 도구이지만 차이가 있다.
임계구역 문제를 해결하기 위한 상호배제(Mutual Exclusion)을 위한 도구이다.
뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술이다. Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계영역에서 나갈 때 해제할 수 있다.
세마포는 Signaling 메커니즘이라는 점에서 뮤텍스와 다르다. 세마포어는 락을 걸지 않은 쓰레드도 Signal을 보내 락을 해제할 수 있다.
세마포의 카운트를 1로 설정하면 뮤텍스처럼 활용할 수 있다.
void acquire() {
value --;
if (value < 0) {
add this process/thread to list;
block;
}
}
void release() {
value ++;
if (value <= 0) {
remove a process P from list;
wakeup P;
}
}
가용한 개수를 가진 자원에 대한 접근 제어용으로 사용되며, 세마포는 그 가용한 자원의 개수로 초기화된다. 자원을 사용하면 세마포가 감소, 방출하면 세마포가 증가한다.
뮤텍스라고도 부르며, 상호배제(Mutual Exclusion)의 줄임말이다. 이름 그대로 0과 1 사이의 값만 가능하다.
세마포가 Ready Queue를 가지고 있고, 둘 이상의 프로세스가 Critical Section 진입을 무한정 기다리고 있고, Critical Section에서 실행되는 프로세스는 진입 대기중인 프로세스가 실행되어야만 빠져나올 수 있는 상황을 의미한다.
서로 멱살을 잡고 있는 상태이다. 한명이 놓아야 하는데, 서로 잡고 있어서 대화가 안되고 무한정으로 기다리는 상태이다.
고급 언어의 설계 구조물로서, 개발자의 코드를 상호배제 하게끔 만든 추상화된 데이터 형태이다. 공유자원에 접근하기 위한 키 획득과 자원 사용 후 해제를 모두 처리한다.
프로세스 내에 다른 스레드간의 동기화를 위한 해결방법이다. 하나의 스레드만이 공유 자원에 접속할 수 있게 한다.