라즈베리파이

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

Posts

191 posts

[라즈베리파이] 프로세스 - 스케줄링(Preemption): 유저 공간 실행 중 인터럽트 발생

Guillermo Austin Kim|2018년 9월 16일

이번에는 인터럽트가 발생했을때 스케줄링(Preemption)하는 동작을 살펴봅니다. 우리는 그 동안 schedule() 함수를 호출했을때만 스케줄링이 실행하는지 알고 있습니다. 그것은 맞는 말입니다.그런데, 인터럽트가 발생했을때 스케줄링이 실행된다는 사실은 잘 모릅니다. 이 사실을 알면 많은 레이스 컨디션 발생 원인을 알 수 있습니다. 이제부터 __irq_usr이란 인터럽트 벡터부터 __schedule() 함수가 실행하는 코드 흐름을 알아보겠습니다. 유저 공간에서 프로세스 실행 도중 인터럽트가 발생하면 인터럽트 벡터로 __irq_usr이란 레이블을 실행합니다.먼저 __irq_usr 코드를 보겠습니다. 인터럽트 처리가 아키텍처에 의존적이니 어셈블리 코드로 구현됐습니다.[https://elixir.boo

[라즈베리파이] 프로세스 - 주기적으로 스케줄링 설정 요청(타이머 인터럽트)

Guillermo Austin Kim|2018년 9월 15일

리눅스 커널 개발자들은 언제 레이스 컨디션이 발생할까 걱정을 많이 합니다.그래서 임계 영역을 어느 코드 구간으로 설정하지 고민합니다. 레이스 컨디션은 언제 어디서나 발생할 수 있지만, 이 걱정을 하기 전에 리눅스 커널에서 스케줄링은 언제 어떻게 수행하는지 점검할 필요가 있습니다. 이번에는 스케줄링을 언제 요청하는지 알아봅시다.1 > 타이머 인터럽트 발생하여 실행 중인 프로세스가 동작을 멈춤1 > 인터럽트 벡터(el1_irq, el0_irq)가 실행한 후 타이머 인터럽트 핸들러가 실행1 > 타이머 인터럽트 핸들러가 실행한 후 schedule_tick() 함수를 실행 local_irq_disable() 함수를 호출하지 않은 이상 인터럽트는 언제든 발생해서 실행 중인 코드를 멈출 수 있습니다

[라즈베리파이] Process - 대기큐(Wait queue)- (1)

Guillermo Austin Kim|2018년 9월 14일

대기 큐(wait queue) 소개대기 큐는 커널에서 여러 용도로 사용합니다. 특히 인터럽트 핸들링과 프로세스 동기화, 타이밍으로 씁니다. 프로세스는 디스크 연산이 끝나기를 기다리거나, 시스템 리소스가 해제되기를 기다리며 시간이 얼마간 흐르길 기다려야 할 때가 있습니다 대기 큐는 여러 이벤트에 대한 조건부로 대기를 구현하고 표현합니다. 특정 이벤트를 기다리는 프로세스는 적절한 대기 큐에 자기 자신을 넣고 CPU 제어를 포기합니다. 그러므로 대기 큐는 잠자고 있는 프로세스들이 모여있는 장소라고 볼 수 있습니다. 이 프로세스들은 특정 조건이 true가 되면 커널이 깨워줍니다. 대기 큐는 이중 링크드 리스트로 구현되어 있으며, 이 리스트의 각 개체에는 프로세스 디스크립터를 가리키는 포인터가 들어있습니다. 대

[라즈베리파이] Process - 프로세스 상태

Guillermo Austin Kim|2018년 9월 14일

이름으로 알 수 있듯이, state 필드는 프로세스가 어떤 동작 중인지 알려줍니다. 이 필드는 플래그의 배열이고 각 플래그는 프로세스 상태를 표현합니다.. 현재 리눅스 버전에서는 이 상태들이 상호 배타적이고, state의 플래그 하나만 설정하므로 나머지 플래그들은 Clear합니다. 프로세스 상태는 아래와 같습니다. TASK_RUNNING#define TASK_RUNNING 0x0000 프로세스가 CPU에서 실행중이거나 실행되려고 기다리는 중입니다. 실제 CPU에서 실행 중인 프로세스는 struct runqueues.curr란 멤버에 등록되어 있습니다. TASK_INTERRUPTIBLE #define TASK_INTERRUPTIBLE 0x0001 프로세스는 특정 조건이 true가 될 때까지 잠들