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


15

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



@Gilles 저도 이것도 보았지만, 페이지에서 세마포어에 대한 유일한 언급은 워런 (Warren)은 "스핀 락과 세마포어의 차이점을 알고 싶다면 다른 질문입니다"라고 말합니다.
Michael Mrozek

@ 마이클 : 좋아, 나는 거기에 대한 대답이 요점을 해결했다고 생각하지만, 세마포어가 다른 종류의 자물쇠 중 하나라고 명시 적으로 언급 한 사람은 아무도 없다.
Gilles 'SO- 악의를 멈춰라'

Linus Torvalds의 설명 : yarchive.net/comp/linux/semaphores.html
myaut

stackoverflow.com/questions/195853/spinlock-versus-semaphore의 중복 필자가 요청한 스레드에 많은 좋은 설명이 있습니다.
iankits

답변:


13

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

스핀 잠금 은 통화 중 대기를 수행합니다. 즉, 루프를 계속 실행합니다.

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)

좋은 설명, 나는 단지 한 가지 점을 강조하고 싶습니다. 세마포어 대 뮤텍스는 인터페이스의 문제이다 : 뮤텍스가 유지되는지 아닌지, 세마포어가 최대 N 개의 스레드에 의해 유지된다; 뮤텍스는 N = 1 인 세마포어의 특별한 경우입니다. Spinlock과 다른 종류의 잠금은 구현의 문제입니다. spinlock은 잠금을 계속 시도하지만 다른 종류는 알림을 기다립니다. Linux 커널 컨텍스트에서 스핀 구현이있는 유일한 잠금에는 뮤텍스 인터페이스가 있습니다.
Gilles 'SO- 악의를 멈춰라'

Linux 커널 컨텍스트에서 스핀 구현이있는 유일한 잠금에는 뮤텍스 인터페이스가 있습니다. 나는이 선을 이해하지 못한다. 확장 해 주시겠습니까?
Sen

@ 센 : 그는 리눅스에서 스핀 락이 바이너리로 동작한다는 것을 의미했다. 세마포어처럼 동작하는 회전 잠금 장치를 가질 수 있습니다.
Maciej Piechotka

"하지만 잠금 스레드가 다른 리소스에 의해 선점되어 동일한 리소스에 액세스하려고하면 두 번째 리소스는 CPU 쿼터가 부족할 때까지 리소스를 확보하려고 시도합니다.": 그러나 여전히 Mutex에 문제가 남아 있습니다. 우선 순위가 더 높은 작업이 리소스에 액세스해야하는 경우 ... 대기 중입니까? 우선 순위가 다른 작업간에 리소스를 공유하지 않는 것이 좋습니다.
Hibou57

@ Hibou57 : 그렇습니다. 상태가 일관성이 없으며 리소스를 사용하면 '재미있는'효과가 있습니다 (낮은 우선 순위의 스레드가 링크 된 목록에 무언가를 추가하거나 제거하는 중간에 있음). 이 문장의 요점은 스레드가 차단되면 예약되지 않으므로 스핀 록을 기다리는 스레드가 자원을 소비하지 않는다는 것입니다. 실시간 시스템 (특히 하드)에 대한 잠금은 다른 주제이며 이에 대한 충분한 지식이 없지만 이러한 시스템은 때때로 우선 기부 또는 기타 기술을 구현합니다.
Maciej Piechotka

2

스핀 록은 휴면이 허용되지 않는 인터럽트 컨텍스트에서 사용됩니다. 자원이 확보 될 때까지 다른 작업을 수행하지 않고 철저한 루프로 폴링합니다. 대부분 ISR에서 사용되며 더욱 안전하고 효율적입니다.

수면이 괜찮은 공정 상황에서 세마포어를 사용할 수 있습니다.


1

다음은 정답입니다. 스핀 잠금과 이진 세마포어 (한 가지만 사용할 수있는 리소스를 관리)는 거의 동일합니다. 이진 세마포어가 일종의 단일 리소스 (예 : CPU 시간, 디스플레이 출력)를 관리하는 동안 스핀 잠금은 실행되는 코드를 관리한다는 점이 다릅니다.

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

요컨대, 스핀 락 (spin-lock)은 리소스를 사용할 수 있는지 세마포어를 계속 묻습니다. (어린이가 화장실을 사용해야하고 다른 사람이 끝날 때까지 기다려야한다고 상상해보십시오.)

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.