스핀락

포스트: 24|아이템:스핀락(24)
Tags

Posts

24 posts

[리눅스커널] 동기화: 큐드 스핀락(queued spinlock) 분석 - 1

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

[리눅스커널] 동기화: 스핀락과 뮤텍스 기법 차이점 알아보기

Guillermo Austin Kim|2019년 9월 14일

이번에는 스핀락과 뮤텍스의 자료구조와 함께 두 기법의 차이점을 살펴보겠습니다. 스핀락과 뮤텍스의 구현 방식의 차이점은 다음과 같습니다. 스핀락은 코드가 간결합니다. 다른 프로세스가 스핀락을 누군가 획득하고 있으면 밖에서 계속 기다리는 동작입니다. 뮤텍스는 스핀락에 비해 코드 복잡도가 높습니다. 다른 프로세스가 뮤텍스를 획득하면 휴면에 들어가고 깨어나는 추가 동작을 하기 때문입니다. 스핀락은 아키텍처에 의존적인 코드로 구현됐습니다. 대신 뮤텍스는 아키텍처에 의존적이지 않은 리눅스 커널 함수로 구현됐습니다. 이번에도 화장실에서 B 프로세스가 기다리는 상황을 그리면서 두 기법의 차이점을 알아보겠습니다. 자물쇠(락)가 잠겼는지 알아보는 방법 기법 특징스핀락: 스핀락 구조체 중 owner와 next 필드가

[리눅스커널] 스핀락(spinlock) 플러그인 함수: spin_lock_irqsave()/spin_unlock_irqrestore

Guillermo Austin Kim|2019년 9월 12일

리눅스 커널에서 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) 처리 흐름도 알아보기

Guillermo Austin Kim|2019년 9월 12일

스핀락을 분석할 때 스핀락을 획득한 후 임계 영역을 실행할 때 바뀌는 자료구조를 함께 파악하는 것이 중요합니다. 이번에 스핀락을 관리하는 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 구조체는 서로 다른 아키텍처에서 스핀