mutex lock vs spinlock ( 재현 상황 )
By Guillermo Austin Kim | 2018년 1월 2일 |
특정 함수나 콜스택 동작에서 lock을 두 번 획득하려고 했을 때 mutex lock과 spinlock 재현 상황은 아주 달라요. busy-waiting이라는 말을 들어보셨나요? spinlock은 lock을 획득하기 전까지 사채업자 같이 계속 특정 루프를 돌면서 계속 기다려요.ticket spinlock의 멤버 중에 owner와 next값이 있잖아요. owner가 next와 같으면 spinlock을 획득할 수 있는 조건이거든요.그 조건을 만족할 때 까지 계속 기다리죠. 계속 기다린다는 건 뭘 뜻할까요? 혹시나 spinlock_irq 함수를 호출하면요?preemption이 동작하지 않고 IRQ도 trigger되지 않게 되거든요. 대부분의 경우 spinlock 동작에 문제가 생기면 Watchdog Rese
[라즈베리파이] 동기화 - 스핀락(spinlock): spin_unlock_irq() 소개
By Guillermo Austin Kim | 2019년 1월 2일 |
이번에는 spin_lock_irq() 함수와 같이 쓰는 spin_unlock_irq() 함수를 점검합시다. spin_unlock_irq() 함수는 spin_unlock() 함수에서 스핀락 기능을 그대로 물려 받았습니다. 대신 스핀락을 해제 한 후 인터럽트를 다시 활성화하고 Preemption을 실행하는 동작만이 추가된 것입니다. spin_unlock_irq() 함수 동작을 3단계로 나눠서 점검합시다 1단계: 스핀락 해제스핀락을 획득하면 스핀락 인스턴스의 next를 +1만큼 증감합니다. 이와 마찬가지로 owner도 +1만큼 증감시키는 동작을 수행합니다. spin_unlock() 함수와 같은 동작입니다. 2단계: 인터럽트 활성화spin_lock_irq() 함수를 실행할 때 인터럽트를 비활성화했습니다. 이
[라즈베리파이] 동기화 - 스핀락(spinlock): 스핀락 획득 두 번째 시도
By Guillermo Austin Kim | 2018년 12월 26일 |
스핀락 획득 두 번째 시도이전 시간에 스핀락을 누군가 획득했는데 다른 프로세스가 다시 스핀락을 획득할 때 동작을 알아봤습니다. 이번에는 다른 프로세스가 같은 스핀락 획득을 시도하는 상황을 그리면서 분석하겠습니다. 다시 분석할 _raw_spin_lock() 함수 코드를 같이 봅시다.1 80704b60 <_raw_spin_lock>:2 80704b60:e1a0c00d movip, sp3 80704b64:e92dd800 push{fp, ip, lr, pc}4 80704b68:e24cb004 subfp, ip, #45 80704b6c:e52de004 push{lr}; (str lr, [sp, #-4]!)6 80704b70:ebe82672 bl8010e540 &
[리눅스커널] 스핀락(spinlock) 플러그인 함수: spin_lock_irqsave()/spin_unlock_irqrestore
By 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() 함수를 호출한 후 인터럽트를 비활성화하다 보니 현재 인터럽트를 상태(활성화/