뮤텍스

포스트: 7
Tags

Posts

7 posts

[라즈베리파이] 커널동기화 - 임계영역(Critical Section)이란

Guillermo Austin Kim|2018년 9월 7일

리눅스 커널이나 운영체제에서 임계영역(Critical Section)이나 커널 동기화를 설명할 때 화장실을 예를 많이 듭니다. 하나밖에 없는 화장실 문에 있는 자물쇠를 잠그고 용무를 보는 상황입니다. 위 상황을 리눅스 커널 동기화 과정과 빗대서 생각해 봅시다. 첫 번째, 자물쇠는 화장실 문에 있는 잠금장치입니다. 누구나 화장실에 들어갈 때 화장실 문을 잠급니다. 화장실에 들어갈 때 먼저 화장실 문에 있는 자물쇠가 잠겨 있나 확인하는 습관입니다. 화장실 잠금장치는 여러 가지 종류가 있듯 리눅스 커널에도 스핀락, 뮤텍스 기법에 따라 자물쇠 잠금 방법이 다릅니다. 두 번째, 화장실에서 용무는 딱 한 사람만 볼 수 있습니다. 화장실에서 두 사람이 동시에 들어갈 수 없습니다. 유일하게 한 사람이 일을 보는 순

mutex lock vs spinlock ( 재현 상황 )

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

[Kernel][crash]뮤텍스 데드락(Mutex Deadlock) 락업(lockup) - "simpleperf" 디버깅

Guillermo Austin Kim|2017년 12월 27일

특정 시점부터 갑자기 디바이스가 락업되는 현상이 리포트가 되었거든요. 엄청 락업된 디바이스가 쏟아 졌었는데요. 이번 시간에는 그 때 어떻게 디버깅을 해서 문제를 해결했는지 업데이트하고자 해요. 락업이 된 상태에서 디바이스를 받아 강제로 코어 덤프를 뜬 다음에 콜 트레이스를 봤는데요. 아래 콜 스택이 확인되었어요. 프로세스 이름은 "atd" 이에요. reboot 시스템콜을 trigger한 다음에 각 종 시스템 드라이버를 종료하는 과정에서 mutex lock을 계속 기다리는 현상이 확인되네요. -000|context_switch(inline) -000|__schedule() -001|schedule_preempt_disabled() -002|spin_lock(inline) -002|