스핀 락과 세마포어의 기본적인 차이점은 무엇입니까?
답변
둘 다 제한된 리소스를 관리합니다. 먼저 이진 세마포어 (뮤텍스)와 스핀 잠금의 차이점을 설명하겠습니다.
스핀 잠금 은 통화 중 대기를 수행합니다. 즉, 루프를 계속 실행합니다.
while (try_acquire_resource ());
...
release();
매우 가벼운 잠금 / 잠금 해제를 수행하지만 동일한 스레드에 액세스하려고 시도하는 다른 스레드가 잠금 스레드를 선점하면 두 번째 스레드는 CPU 쿼터가 부족할 때까지 리소스를 확보하려고 시도합니다.
반면에 뮤텍스 는 다음과 같이 동작합니다.
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
따라서 스레드가 차단 된 리소스를 얻으려고 시도하면 사용 가능할 때까지 일시 중지됩니다. 잠금 / 잠금 해제는 훨씬 무겁지만 대기는 ‘자유’와 ‘공평’입니다.
세마포어 는 여러 번 (초기화로 알려진) 여러 번 사용할 수있는 잠금입니다. 예를 들어 3 개의 스레드가 동시에 리소스를 보유 할 수 있지만 더 이상은 허용되지 않습니다. 예를 들어 생산자 / 소비자 문제 또는 일반적으로 대기열에서 사용됩니다.
P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)
답변
스핀 록은 휴면이 허용되지 않는 인터럽트 컨텍스트에서 사용됩니다. 자원이 확보 될 때까지 다른 작업을 수행하지 않고 철저한 루프로 폴링합니다. 대부분 ISR에서 사용되며 더욱 안전하고 효율적입니다.
수면이 괜찮은 공정 상황에서 세마포어를 사용할 수 있습니다.
답변
다음은 정답입니다. 스핀 잠금과 이진 세마포어 (한 가지만 사용할 수있는 리소스를 관리)는 거의 동일합니다. 이진 세마포어가 일종의 단일 리소스 (예 : CPU 시간, 디스플레이 출력)를 관리하는 동안 스핀 잠금은 실행되는 코드를 관리한다는 점이 다릅니다.
그러나 정기적 인 세마포어는 여러 스레드로 분할 될 수 있지만 제한된 메모리 (예 : 메모리, 네트워크 대역폭)에 액세스하는 여러 스레드를 관리 할 수 있습니다.
요컨대, 스핀 락 (spin-lock)은 리소스를 사용할 수 있는지 세마포어를 계속 묻습니다. (어린이가 화장실을 사용해야하고 다른 사람이 끝날 때까지 기다려야한다고 상상해보십시오.)
출처 : 시스템 프로그래밍, 운영 체제 및 위키 백과 소개