it-swarm-ko.com

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

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

15
Renjith G

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

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

while (try_acquire_resource ());
...
release();

매우 가벼운 잠금/잠금 해제를 수행하지만 동일한 리소스에 액세스하려는 다른 스레드가 잠금 스레드를 선점하는 경우 두 번째 스레드는 CPU 퀀텀이 부족할 때까지 리소스를 확보하려고합니다.

반면에 mutex 다음과 같이 동작합니다.

if (!try_lock()) {
    add_to_waiting_queue ();
    wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();   

따라서 스레드가 차단 된 리소스를 얻으려고 시도하면 사용할 수있을 때까지 일시 중단됩니다. 잠금/잠금 해제는 훨씬 더 무겁지만 대기는 '자유'와 '공정'입니다.

Semaphore 여러 번 (초기화에서 알려짐) 사용이 허용되는 잠금입니다. 예를 들어 3 개의 스레드가 동시에 리소스를 보유 할 수 있지만 더 이상 보유 할 수는 없습니다. 예를 들어 생산자/소비자 문제 또는 일반적으로 대기열에서 사용됩니다.

P(resources_sem)
resource = resources.pop()
...
resources.Push(resources)
V(resources_sem)
13
Maciej Piechotka

Spinlock은 휴면이 허용되지 않는 인터럽트 컨텍스트에서 사용됩니다. 그들은 자원을 획득 할 때까지 아무것도하지 않고 타이트한 루프에서 폴링합니다. 대부분 ISR에서 사용되며 더 안전하고 효율적입니다.

세마포어는 수면 상태가 괜찮은 프로세스 컨텍스트에서 사용할 수 있습니다.

2
Kapil

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

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

요컨대, 스핀 락은 리소스를 사용할 수 있는지 세마포어에 계속 묻습니다. (아이가 화장실을 사용해야하고 다른 사람이 끝내기를 기다리는 것을 상상해보십시오.)

출처 : 시스템 프로그래밍, 운영 체제 및 위키 백과 소개

1
valbaca