커널 동기화 기법은 리눅스 커널에서 가장 배우기 어려운 내용 중 하나입니다. 커널 동기화 기법을 사실상 이론으로 이해하기 때문입니다. 아무리 커널 동기화나 레이스를 이론으로 이해해도 실전 개발에서 배운 내용을 적용하기 어렵습니다.
예를 들어 레이스로 커널 크래시가 발생했다고 가정합시다. 이 문제를 해결하기 위해서는 어떻게 해야 할까요? 우선 어느 코드 구간이 임계영역인지 분석해야 합니다. 이후 어떤 커널 동기화 방법(스핀락, 뮤텍스)를 써야 할지 판단해야 합니다.
이런 레이스로 인한 커널 동기화 문제를 해결하려면 리눅스 시스템에서 레이스가 어떤 방식으로 발생하는지 직접 체험해야 합니다. 그래야 리눅스 시스템에서 커널 동기화 기법이 왜 필요하며 어떤 커널 동기화 기법(스핀락, 뮤텍스, percpu)을 적용할지 결정할 수 있습니다.
어떻게 실제 리눅스 시스템에서 레이스를 겪을 수 있을까요? 라즈베리파이에서 레이스가 발생하는 상황을 ftrace로 확인할 수 있습니다.
참고로, 커널 고수 개발자나 SoC(System On-Chip) 시스템 개발을 할 때 ftrace를 활용해서 레이스 컨디션으로 발생한 문제를 분석합니다.
먼저 어떤 함수 실행 도중 다른 프로세스가 같은 코드를 실행해서 레이스 컨디션이 발생하는 다음 3가지 상황을 살펴보겠습니다.
1. 유저 공간에서 생성된 프로세스
2. 커널 공간에서 구동하는 프로세스(커널 쓰레드)
3. 인터럽트가 발생해서 같은 함수 두 번 호출
#Reference
#Reference 시스템 콜
Reference(프로세스)
Reference(워크큐)
워크큐(Workqueue) Overview
최근 덧글