[라즈베리파이] 동기화 - 스핀락(spinlock) Deadlock으로 생기는 문제
By Guillermo Austin Kim | 2019년 1월 6일 |
스핀락 코드를 잠깐 살펴봤는데 뮤텍스와 다르게 상당히 코드 복잡도가 낮습니다. tickets.next과 tickets.owner 두 값으로 스핀락을 획득하는 순서를 콘트롤하죠. spin_lock 함수가 처음 실행되는 시점에 tickets.owner 값을 로컬 변수에 저장하고 전역 tickets.next 값이 업데이트 될 때까지 Busy-wait합니다. 여기서 중요한 포인트는 tickets.owner 값을 로컬 변수 즉 스택 메모리 공간에 저장해서 제어한다는 점입니다. 모든 프로세스들은 각각 스택 공간에서 돌기 때문에 ticket 스핀락을 획득한 순서를 정확하게 파악할 수 있습니다. 낮은 복잡도에 정확하기 까지 합니다. 이렇게 스핀락 함수는 빠른 시간 내에 실행돼야 하는 인터럽트 서비스 루틴에서 공유 데이
인터럽트(2) - 인터럽트 핸들러는 누가 언제 호출하나?
By Guillermo Austin Kim | 2018년 1월 29일 |
인터럽트 핸들러는 누가 언제 호출할까요? 인터럽트가 떴을 때 인터럽트 벡터가 실행되어 인터럽트 핸들러를 호출합니다.인터럽트 핸들러를 호출할 때 프로세스는 정해져 있지 않습니다. 어떤 프로세스가 돌던 인터럽트가 뜰 수 있기 때문입니다. 그럼 인터럽트 핸들러는 누가 호출한다고 대답해야 할까요? 정답은 없지만 인터럽트 벡터라고 말할 수 있습니다. 참고로 인터럽트 벡터는 ARM이 실행시킵니다. 인터럽트가 뜨면 인터럽트 벡터인 __irq_svc 심볼로 시작해서 handle_irq_event_percpu 함수까지 처리됩니다.이후 handle_irq_event_percpu 함수 내 action->handler 함수 포인터가 실행될 때 인터럽트 핸들러를 호출하죠 이 때 파라미터가 해당 인터럽트의 디스크립터와 pri
[라즈베리파이] 워크큐(Workqueue)는 왜 잘 알아야 할까?
By Guillermo Austin Kim | 2018년 8월 22일 |
이번에 워크큐는 왜 잘 알아야 하는지 생각해 봅시다.워크큐는 영어 문법으로 보면 BE 동사와 같다고 볼 수 있습니다. 리눅스 커널을 탑재한 어느 시스템에서도 워크, 워커 쓰레드를 볼 수 있습니다. 리눅스 핵심 함수들에서 워크큐를 쓰고 있기 때문입니다. 다른 기법과 마찬가지로 워크큐 함수를 모르면 드라이버 코드를 읽을 수 없습니다. 워크를 써서 후반부 처리를 하는 코드를 작성하기는 쉽습니다. 하지만 워크를 쓰다가 생기는 문제는 개발자가 직접 해결해야 합니다. 워크큐 커널 함수 입장에서는 누가 워크를 큐잉했는지 모릅니다. 그래서 커널 핵심함수나 드라이버에서 워크를 큐잉해도 워크큐 커널 함수는 동등하게 처리합니다. 워크를 쓰다 생기는 문제를 해결하려면 어떤 단계를 밟아야 할까요? 우선 우선 커널이 워크큐를 어떻
[bash: bc, if]실수(부동소수점) 수자의 크기 비교
By 반달가면 | 2021년 4월 19일 |
리눅스 bash 스크립트의 if 조건문에서 정수(integer)의 크기 비교는 기본적으로 제공된다. x=2 y=-1 if (( $x > $y )) then echo "x의 값이 y의 값보다 큽니다." fi if [[ $x -gt $y ]] then echo "x의 값이 y의 값보다 큽니다." fi 만약 비교하고자 하는 수자가 실수(부동소수점)인 경우에는 위의 예시와 같은 비교를 할 수 없다. 이럴때는 bc와 조합을 하면 되겠다. 우선 bc와 관련한 아래의 예시를 보자. x=2.34 y=0.45 # x의 값이 y의 값보다 크면 1을 출력, 그렇지 않으면 0을 출력 echo "$x > $y" | bc # x의 값이 y의 값과 같으면 1을 출