Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Spin lock

From noriwiki


개요

스핀락(spinlock)은 임계 구역(critical section)에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킨다. 스핀락이라는 이름은 락을 획득할 때까지 해당 스레드가 빙빙 돌고 있다(spinning)는 것을 의미한다. 스핀락은 바쁜 대기의 한 종류이다.

스핀락은 운영 체제의 스케줄링 지원을 받지 않기 때문에, 해당 스레드에 대한 문맥 교환이 일어나지 않는다. 따라서 스핀락은 임계 구역에 짧은 시간 안에 진입할 수 있는 경우에 문맥 교환을 제거할 수 있어 효율적이다. 하지만 만약 스핀락이 오랜 시간을 소요한다면 다른 스레드를 실행하지 못하고 대기하게 되며, 이 경우 비효율적인 결과를 가져온다.

구현

리눅스에서 스핀락은 integer value하나를 계속 watching하는 것으로 구현된다.

  • OP: lock의 획득에서 spinlock은 정수하나를 계속 watching하면서 만약 정수값이 0이면 critical section에 진입하고 아니면 loop을 돈다.
  • ACQUIRE: lock value을 1증가시키고, 그 전의 값이 0이였으면 critical section에 진입한다.
  • UNLOCK: lock value를 1감소시킨다.

장단점

장점

  • 구현이 단순하다.
  • 단순한 구현으로 인하여 매우 빠르게 작동한다.

단점

  • Unfair하다. 실행 순서를 보장하지 않기 때문에 wating time이 보장받지 못한다. 즉 starvation이 발생한다.
  • Multicore환경에서 Scalability가 심하가 저하된다.

리눅스에서

리눅스에서 spin_lock을 사용하면 IRQ (인터럽트)를 off한다. 즉 spin_lock context는 preemptible하지 않기 때문에, spin_lock context내부에서 kmalloc(size, GFP_KERNEL)이나 schedule()과 같은 sleepable context를 호출하는 것은 버그이다.

같이 보기

  1. Ticket lock