스핀락과 세마포어의 차이점은 무엇입니까?

스핀락과 세마포어의 차이점은 무엇입니까?

스핀락과 세마포어의 기본적인 작동상의 차이점은 무엇입니까?

답변1

둘 다 제한된 리소스를 관리합니다. 먼저 바이너리 세마포어(뮤텍스 잠금)와 스핀 잠금의 차이점을 설명하겠습니다.

스핀 잠금바쁜 대기가 수행됩니다. 즉, 루프를 계속 실행합니다.

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)

답변2

스핀 잠금은 휴면을 허용하지 않는 인터럽트 컨텍스트에서 사용됩니다. 이들은 긴밀한 순환을 통해 폴링하고 리소스를 획득하기 전에는 다른 작업을 수행하지 않습니다. 주로 ISR에 사용되며 더욱 안전하고 효율적입니다.

세마포어는 절전 모드가 허용되는 프로세스 컨텍스트에서 사용할 수 있습니다.

답변3

내 빠른 답변은 다음과 같습니다. 스핀 잠금 및바이너리한 가지에만 사용할 수 있는 리소스를 관리하는 세마포어는 거의 동일합니다. 둘 사이의 차이점은 스핀록이 실행할 코드를 관리하는 반면 바이너리 세마포어는 단일 리소스(예: CPU 시간, 디스플레이 출력)를 관리한다는 점입니다.

그러나 일반 세마포어는 리소스에 액세스하는 여러 스레드를 관리할 수 있으며, 이는 여러 개로 분할될 수 있지만 제한 사항(예: 메모리, 네트워크 대역폭)이 적용됩니다.

간단히 말해서, 스핀락은 리소스가 사용 가능한지 세마포어에 지속적으로 물어볼 수 있습니다. (화장실을 사용해야 하고 다른 사람들이 다 끝날 때까지 기다리는 아이를 상상해 보십시오.)

출처: 시스템 프로그래밍 소개, 운영 체제 및 Wikipedia

관련 정보