라즈베리파이

포스트: 191|조회수: 0|ARTIFACT
Items

Posts

191 posts

[리눅스커널] 프로세스 상태: 언제 TASK_RUNNING 변경할까?

Guillermo Austin Kim|2019년 1월 7일

이번 시간에 프로세스를 RUNNING 상태로 누가 언제 변경하는지 알아봅시다. wake_up_new_task()[set_filter 가능 함수]wake_up_new_task() 함수는 _do_fork() 함수에서 프로세스를 생성하는 과정에서 호출됩니다. 코드를 봅시다.[https://elixir.bootlin.com/linux/v4.14.70/source/kernel/sched/core.c]1 void wake_up_new_task(struct task_struct *p)2 {3 struct rq_flags rf;4 struct rq *rq;56 raw_spin_lock_irqsave(&p->pi_lock, rf.flags);7 p->state = TASK_RUNNING; 7번째 줄

[라즈베리파이] 동기화 - 스핀락(spinlock) Deadlock으로 생기는 문제

Guillermo Austin Kim|2019년 1월 6일

스핀락 코드를 잠깐 살펴봤는데 뮤텍스와 다르게 상당히 코드 복잡도가 낮습니다. tickets.next과 tickets.owner 두 값으로 스핀락을 획득하는 순서를 콘트롤하죠. spin_lock 함수가 처음 실행되는 시점에 tickets.owner 값을 로컬 변수에 저장하고 전역 tickets.next 값이 업데이트 될 때까지 Busy-wait합니다. 여기서 중요한 포인트는 tickets.owner 값을 로컬 변수 즉 스택 메모리 공간에 저장해서 제어한다는 점입니다. 모든 프로세스들은 각각 스택 공간에서 돌기 때문에 ticket 스핀락을 획득한 순서를 정확하게 파악할 수 있습니다. 낮은 복잡도에 정확하기 까지 합니다. 이렇게 스핀락 함수는 빠른 시간 내에 실행돼야 하는 인터럽트 서비스 루틴에서 공유 데이

[라즈베리파이] 가상 파일시스템 동작 분석(유저 프로세스 입장)

Guillermo Austin Kim|2019년 1월 3일

이번에 유저 어플리케이션 입장에서 가상 파일시스템 동작을 살펴보겠습니다. 먼저 유저 공간에서 실행하는 다음 코드를 같이 작성해 봅시다.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;

[라즈베리파이] 동기화 - 스핀락(spinlock): spin_unlock_irq() 소개

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() 함수를 실행할 때 인터럽트를 비활성화했습니다. 이