리눅스

포스트: 554|조회수: 0|TERM
Items

Posts

554 posts

[라즈베리파이] 워크큐(Workqueue) - worker_thread() 함수 분석(3)

Guillermo Austin Kim|2018년 9월 16일

Contents of tableworker_thread() 함수 분석(1)worker_thread() 함수 분석(2)worker_thread() 함수 분석(3) 이번에는 worker_thread() 함수에서 가장 중요한 37번 줄 코드를 분석할 차례입니다. 위 그림에서 워커 쓰레드의 “실행” 단계입니다. 코드를 봅시다.37do {38struct work_struct *work =39list_first_entry(&pool->worklist,40 struct work_struct, entry);4142pool->watchdog_ts = jiffies;4344if (likely(!(*work_data_bits(work) & WORK_STRUCT_

[라즈베리파이] 프로세스 - 스케줄링(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가 되면 커널이 깨워줍니다. 대기 큐는 이중 링크드 리스트로 구현되어 있으며, 이 리스트의 각 개체에는 프로세스 디스크립터를 가리키는 포인터가 들어있습니다. 대