커널
Posts
228 posts[라즈베리파이] 동기화 - 스핀락(spinlock) Deadlock으로 생기는 문제
스핀락 코드를 잠깐 살펴봤는데 뮤텍스와 다르게 상당히 코드 복잡도가 낮습니다. tickets.next과 tickets.owner 두 값으로 스핀락을 획득하는 순서를 콘트롤하죠. spin_lock 함수가 처음 실행되는 시점에 tickets.owner 값을 로컬 변수에 저장하고 전역 tickets.next 값이 업데이트 될 때까지 Busy-wait합니다. 여기서 중요한 포인트는 tickets.owner 값을 로컬 변수 즉 스택 메모리 공간에 저장해서 제어한다는 점입니다. 모든 프로세스들은 각각 스택 공간에서 돌기 때문에 ticket 스핀락을 획득한 순서를 정확하게 파악할 수 있습니다. 낮은 복잡도에 정확하기 까지 합니다. 이렇게 스핀락 함수는 빠른 시간 내에 실행돼야 하는 인터럽트 서비스 루틴에서 공유 데이
[라즈베리파이] 가상 파일시스템 동작 분석(유저 프로세스 입장)
이번에 유저 어플리케이션 입장에서 가상 파일시스템 동작을 살펴보겠습니다. 먼저 유저 공간에서 실행하는 다음 코드를 같이 작성해 봅시다.1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 89 #define FILENAME_NAME "/home/pi/sample_text.text"1011 int main() 12 { 13 int fd = 0;14 ssize_t read_buf_size;15 off_t new_file_pos;
[Linux][Kernel] preempt_disable()/preempt_enable() 주의 사항
preempt_disable() 함수를 쓸 때 주의해야 할 점이 있습니다.preempt_disable() 함수는 preempt_enable() 함수와 반드시 Pair로 써야 합니다. preempt_disable() 함수를 호출한 다음 스케줄링 동작을 수행하는 함수를 쓰면 리눅스 시스템은 오동작합니다. 예를 들어 다음과 같은 드라이버를 초기화하는 코드를 예를 들겠습니다.1 void configure_something_driver(void) 2 {3 preempt_disable();4 5 do_something();6 mdelay(100);7 do_something();8 9 preempt_enable();10 } 5~7 번 코드가 실행할 때 Preemption이 되면 안된다고 판단했습니다.그래서 3 번
[라즈베리파이] 동기화 - 스핀락(spinlock): spin_unlock_irq() 소개
이번에는 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() 함수를 실행할 때 인터럽트를 비활성화했습니다. 이

