Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

793
557
422266


[라즈베리파이] 동기화 - 스핀락(spinlock): 첫 번째 스핀락 해제 시 동작(1) 9. 커널 동기화(spinlock/mutex)

스핀락을 해제할 때는 spin_unlock() 함수를 호출하는데 스핀락 인스턴스의 owner를 +1만큼 증감한다고 알고 있습니다.
static inline void arch_spin_unlock(arch_spinlock_t *lock)
{
smp_mb();
lock->tickets.owner++;
dsb_sev();
}
spin_unlock() 함수를 호출하면 여러 인라인 형태 함수로 연결되는데 실제 동작은 arch_spin_unlock() 함수가 수행합니다.

 

[1] 번 프로세스가 스핀락을 해제할 때 스핀락 인스턴스인 owner를 +1증감합니다. [2] 프로세스는 Busy-waiting 동작으로 스핀락 인스턴스의 owner가 0x2가 될 때까지 무한루프를 돌고 있는 상태였습니다. 

그런데 [2]번 프로세스는 이 조건을 만족하니 스핀락을 획득하고 무한루프를 빠져나옵니다. 이후 임계 영역 코드를 실행하는 겁니다.

이때 [3]번 프로세스도 마찬가지로 Busy-Wating 상태입니다. 스핀락 인스턴스 owner가 0x3이 될 때까지 무한루프를 실행 중인 겁니다. 그런데 지금 스핀락 인스턴스 값은 next가 0x4, owner가 0x2입니다.

따라서 [3]번 프로세스는 여전히 스핀락을 획득하지 못하고 스핀락 인스턴스 owner 값이 0x3이 될 때까지 기다리는 겁니다.



#Reference 시스템 콜


Reference(워크큐)
워크큐(Workqueue) Overview


덧글

댓글 입력 영역