[리눅스커널] 동기화: 큐드 스핀락(queued spinlock) 분석 - 1
By Guillermo Austin Kim | 2021년 9월 22일 |
큐드 스핀락은 왜 배워야 할까 Aarch64 아키텍처 기반 리눅스 커널에서 스핀락은 큐드 스핀락 방식이 적용됩니다.그 이유는 다음 링크를 보면 알 수 있습니다. 링크:git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=c11090474d70590170cf5fa6afe85864ab494b37 Will Deacon이란 Arm 사의 개발자가 'arm64: locking: Replace ticket lock implementation with qspinlock'이란 커밋 타이틀과 함께 큐드 스핀락 코드를 Arm64 코드에 적용했는데요. 그런데 다음과 같은 코드를 보면 흥미로운 사실을 알 수 있습니다. diff --git a/ar
[리눅스커널] 동기화: 스핀락과 뮤텍스 기법 차이점 알아보기
By Guillermo Austin Kim | 2019년 9월 14일 |
이번에는 스핀락과 뮤텍스의 자료구조와 함께 두 기법의 차이점을 살펴보겠습니다. 스핀락과 뮤텍스의 구현 방식의 차이점은 다음과 같습니다. 스핀락은 코드가 간결합니다. 다른 프로세스가 스핀락을 누군가 획득하고 있으면 밖에서 계속 기다리는 동작입니다. 뮤텍스는 스핀락에 비해 코드 복잡도가 높습니다. 다른 프로세스가 뮤텍스를 획득하면 휴면에 들어가고 깨어나는 추가 동작을 하기 때문입니다. 스핀락은 아키텍처에 의존적인 코드로 구현됐습니다. 대신 뮤텍스는 아키텍처에 의존적이지 않은 리눅스 커널 함수로 구현됐습니다. 이번에도 화장실에서 B 프로세스가 기다리는 상황을 그리면서 두 기법의 차이점을 알아보겠습니다. 자물쇠(락)가 잠겼는지 알아보는 방법 기법 특징스핀락: 스핀락 구조체 중 owner와 next 필드가
[라즈베리파이] 동기화 - 스핀락(spinlock): 스핀락 획득 첫 번째 시도
By Guillermo Austin Kim | 2018년 12월 25일 |
스핀락을 소개했을 때 그림을 다시 소개합니다. 위 그림이 실행할 때 실제 어셈블리 코드를 어떻게 동작하는지 알아보려는 겁니다.다음 소절에 분석하려는 스핀락 인스턴스 owner는 0x1이고 next는 0x2입니다. 이미 스핀락을 획득한 다른 프로세스가 임계 영역을 실행 중이기 때문입니다. 이번에는 누군가 스핀락을 획득한 경우 스핀락이 어떻게 동작하는지 알아보겠습니다. r0는 0xb93b4a78이고 이 메모리 공간에 0x00020001 값이 있습니다. r3은 0x00020001로 변경됩니다. r3에 ticket owner와 next를 모두 저장한 겁니다. next가 owner보다 1만큼 크니 누군가 스핀락을 획득한 상태입니다. 분석하려는 _raw_spin_lock() 함수를 다시 소개합니다.1 807
[리눅스커널] 동기화: 스핀락(spinlock)을 쓰는 예제 코드 살펴보기
By Guillermo Austin Kim | 2019년 9월 11일 |
스핀락을 표현하는 구조체를 확인했으니 스핀락을 어떤 방식으로 획득하고 해제하는지 살펴보겠습니다. 예제 코드를 보기 전에 spin_lock() 함수와 spin_unlock() 함수의 선언부를 소개합니다. 이번에는 스핀락을 획득할 때 쓰는 spin_lock()와 함수의 선언부를 보겠습니다.static __always_inline void spin_lock(spinlock_t *lock); 입력 인자는 포인터 타입 lock 변수이며 spinlock_t 구조체입니다. 함수 선언부가 void이니 반환 값은 없습니다. __always_inline 매크로로 선언했으니 커널 함수 내에서 자주 호출되는 함수임을 알 수 있습니다. 다음은 스핀락을 해제할 때 쓰는 spin_unlock()와 함수의 선언부를 봅시다