[리눅스커널] 동기화: 큐드 스핀락(queued spinlock) 분석 - 1
Post
원문 보기 →[리눅스커널] 동기화: 큐드 스핀락(queued spinlock) 분석 - 1
큐드 스핀락은 왜 배워야 할까 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
Related Posts
3 posts[리눅스커널] 동기화: 스핀락과 뮤텍스 기법 차이점 알아보기
이번에는 스핀락과 뮤텍스의 자료구조와 함께 두 기법의 차이점을 살펴보겠습니다. 스핀락과 뮤텍스의 구현 방식의 차이점은 다음과 같습니다. 스핀락은 코드가 간결합니다. 다른 프로세스가 스핀락을 누군가 획득하고 있으면 밖에서 계속 기다리는 동작입니다. 뮤텍스는 스핀락에 비해 코드 복잡도가 높습니다. 다른 프로세스가 뮤텍스를 획득하면 휴면에 들어가고 깨어나는 추가 동작을 하기 때문입니다. 스핀락은 아키텍처에 의존적인 코드로 구현됐습니다. 대신 뮤텍스는 아키텍처에 의존적이지 않은 리눅스 커널 함수로 구현됐습니다. 이번에도 화장실에서 B 프로세스가 기다리는 상황을 그리면서 두 기법의 차이점을 알아보겠습니다. 자물쇠(락)가 잠겼는지 알아보는 방법 기법 특징스핀락: 스핀락 구조체 중 owner와 next 필드가
[리눅스커널] 스핀락(spinlock) 플러그인 함수: spin_lock_irqsave()/spin_unlock_irqrestore
리눅스 커널에서 spin_lock_irq() 함수 뿐만 아니라 spin_lock_irqsave() 함수로 임계 영역을 보호하는 기능을 지원합니다. 이번 소절에서는 spin_lock() 함수 기능을 확장한 스핀락 플러그인 함수를 소개합니다. spin_lock_irqsave() spin_unlock_irqrestore() 먼저 spin_lock_irqsave()/spin_unlock_restore() 함수를 리눅스 커널에서 지원하는 이유를 알아보고 세부 코드를 분석하겠습니다. spin_lock_irq() 함수를 써서 임계 영역 코드 구간을 보호하다 보니 다음과 같이 불편한 점이 생겼습니다. spin_lock_irq() 함수를 호출한 후 인터럽트를 비활성화하다 보니 현재 인터럽트를 상태(활성화/
[리눅스커널] 동기화: 스핀락(spinlock) 처리 흐름도 알아보기
스핀락을 분석할 때 스핀락을 획득한 후 임계 영역을 실행할 때 바뀌는 자료구조를 함께 파악하는 것이 중요합니다. 이번에 스핀락을 관리하는 spinlock_t 구조체를 다시 보면서 스핀락 자료 구조를 설명을 드리겠습니다.(spinlock_t *) (spinlock_t*)0xb7e0eb00 (struct raw_spinlock) rlock = ( (arch_spinlock_t) raw_lock = ( (u32) slock = 0x134C134C, (struct __raw_tickets) tickets = ( (u16) owner = 0x134C, (u16) next = 0x134C)))) 위와 같이 spinlock_t 구조체는 서로 다른 아키텍처에서 스핀



