스핀락
Posts
24 posts[리눅스커널] 동기화: 스핀락(spinlock)을 쓰는 예제 코드 살펴보기
스핀락을 표현하는 구조체를 확인했으니 스핀락을 어떤 방식으로 획득하고 해제하는지 살펴보겠습니다. 예제 코드를 보기 전에 spin_lock() 함수와 spin_unlock() 함수의 선언부를 소개합니다. 이번에는 스핀락을 획득할 때 쓰는 spin_lock()와 함수의 선언부를 보겠습니다.static __always_inline void spin_lock(spinlock_t *lock); 입력 인자는 포인터 타입 lock 변수이며 spinlock_t 구조체입니다. 함수 선언부가 void이니 반환 값은 없습니다. __always_inline 매크로로 선언했으니 커널 함수 내에서 자주 호출되는 함수임을 알 수 있습니다. 다음은 스핀락을 해제할 때 쓰는 spin_unlock()와 함수의 선언부를 봅시다
[리눅스커널] 동기화: 스핀락 자료구조 알아보기
스핀락 구조체나 자료구조는 다음과 같은 관점으로 분석하면 이해가 빠릅니다. 스핀락을 획득하거나 해제할 때 어떤 필드가 바뀔까? 스핀락을 획득했다고 어떻게 판단할까? 이 점을 염두하고 스핀락을 표현하는 자료구조를 분석하겠습니다. 다음은 스핀락을 표현하는 자료구조인 spinlock_t 구조체 선언부입니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/spinlock_types.h]1 typedef struct spinlock {2 union {3 struct raw_spinlock rlock;4 };5 } spinlock_t; spinlock_t은 struct spinlock 자료형이며 struct raw_spinlock
[리눅스커널] 스핀락 플러그인 함수: spin_lock_irq()/spin_unlock_irq()
리눅스 커널 코드를 조금만 분석하면 spin_lock() 함수뿐만 아니라 spin_lock_irq() 함수를 써서 임계 영역을 보호하는 코드를 많이 볼 수 있습니다. 이렇게 커널은 스핀락 기능을 확장한 플러그인 형태 스핀락 함수들을 제공합니다. 이번 소절에서는 spin_lock() 함수 기능을 확장한 스핀락 플러그인 함수를 소개합니다. spin_lock_irq()/spin_unlock_irq() 먼저 spin_lock_irq()/spin_unlock_irq() 함수를 리눅스 커널에서 지원하는 이유를 알아보고 세부 코드를 분석하겠습니다. spin_lock_irq()/spin_unlock_irq() 함수가 생겨난 이유는 무엇일까? spin_lock_irq()/spin_unlock_irq() 함수 코드
[라즈베리파이] 동기화 - 스핀락(spinlock) Deadlock으로 생기는 문제
스핀락 코드를 잠깐 살펴봤는데 뮤텍스와 다르게 상당히 코드 복잡도가 낮습니다. tickets.next과 tickets.owner 두 값으로 스핀락을 획득하는 순서를 콘트롤하죠. spin_lock 함수가 처음 실행되는 시점에 tickets.owner 값을 로컬 변수에 저장하고 전역 tickets.next 값이 업데이트 될 때까지 Busy-wait합니다. 여기서 중요한 포인트는 tickets.owner 값을 로컬 변수 즉 스택 메모리 공간에 저장해서 제어한다는 점입니다. 모든 프로세스들은 각각 스택 공간에서 돌기 때문에 ticket 스핀락을 획득한 순서를 정확하게 파악할 수 있습니다. 낮은 복잡도에 정확하기 까지 합니다. 이렇게 스핀락 함수는 빠른 시간 내에 실행돼야 하는 인터럽트 서비스 루틴에서 공유 데이
![[Spoiler] 점프 신작 '공주님 고문 시간입니다' 원작자에 '우공못' 작가 그림. '시간정지용사' 또다른 플레이어? '다음에 오는 만화 대상' 운영 잡지 폐간](https://img.zoomtrend.com/2026/06/07/1780881297-ECA090ED948426-28EC95A0EB8B88EBA980EC8B9CEAB7B8EB8490.jpeg)

