Guillermo Austin Kim

Sources

Posts

998 posts

[라즈베리파이] 커널 타이머 -동적 타이머는 누가 언제 호출하나? (2)

Guillermo Austin Kim|2018년 8월 27일

커널 타이머는 타이머 인터럽트가 발생 후 동작을 시작합니다. 다음 그림은 커널 시스템 타이머 전체 흐름도 중 1단계 부분입니다. [그림] 커널 타이머 전체 흐름도 1단계 타이머 인터럽트가 발생하면 인터럽트 핸들러 함수인 arch_timer_handler_phys() 가 실행하고 HZ (100)만큼 jiffies를 증감시키는 tich_sched_timer() 함수를 호출합니다. 이후 update_process_times() 함수를 호출하고 나서 run_local_timers() 함수가 run_local_timers() 함수를 호출합니다. 먼저 update_process_times() 함수를 봅시다.1 void update_process_times(int user_tick)2 {3struct ta

[라즈베리파이] 워크큐(Workqueue) - 워크(struct work_struct) 란

Guillermo Austin Kim|2018년 8월 24일

리눅스 커널에서 work라고 부르나 워크(struct work_struct)로 명시 하겠습니다. 워크란 무엇이고 어떤 동작을 할까요? 워크는 워크큐 실행 단위이며 워커 쓰레드에서 실행합니다. 커널 후반부 처리 기법으로 워크큐를 많이 쓴다고 했는데 워크가 바로 후반부 처리를 합니다. 워크가 어떻게 동작하는지 이번 장에서 코드를 분석하면서 상세히 알아볼 예정입니다. struct work_struct 구조체워크를 표현하는 자료구조는 무엇일까요? 정답은 struct work_struct 이며 다음 코드와 같습니다.[https://elixir.bootlin.com/linux/v4.14.43/source/include/linux/workqueue.h]1 struct work_struct {2 atomic_long

[라즈베리파이] 워크큐(Workqueue) 함수 및 로그 Overview

Guillermo Austin Kim|2018년 8월 22일

이전에 소개한 용어와 함께 간단히 워크가 어떤 흐름으로 실행하는지 간단히 코드와 ftrace 로그를 살펴봅시다.[https://elixir.bootlin.com/linux/v4.14.43/source/drivers/tty/vt/vt.c]static DECLARE_WORK(console_work, console_callback); 워크를 실행하려면 우선 워크를 초기화해야 하는데 2가지 방법으로 나눌 수 있습니다. 워크를 전역 변수로 지정하는 방법과 커널 코드가 실행할 때 INIT_WORK() 매크로를 써서 워크를 초기화하는 방법입니다. 위 코드에서는 console_work 전역 변수로 워크를 선언했습니다. 워크를 표현하는 구조체는 struct work_struct인데 이 변수가 console_work이고

[라즈베리파이] 워크큐(Workqueue)는 왜 잘 알아야 할까?

Guillermo Austin Kim|2018년 8월 22일

이번에 워크큐는 왜 잘 알아야 하는지 생각해 봅시다.워크큐는 영어 문법으로 보면 BE 동사와 같다고 볼 수 있습니다. 리눅스 커널을 탑재한 어느 시스템에서도 워크, 워커 쓰레드를 볼 수 있습니다. 리눅스 핵심 함수들에서 워크큐를 쓰고 있기 때문입니다. 다른 기법과 마찬가지로 워크큐 함수를 모르면 드라이버 코드를 읽을 수 없습니다. 워크를 써서 후반부 처리를 하는 코드를 작성하기는 쉽습니다. 하지만 워크를 쓰다가 생기는 문제는 개발자가 직접 해결해야 합니다. 워크큐 커널 함수 입장에서는 누가 워크를 큐잉했는지 모릅니다. 그래서 커널 핵심함수나 드라이버에서 워크를 큐잉해도 워크큐 커널 함수는 동등하게 처리합니다. 워크를 쓰다 생기는 문제를 해결하려면 어떤 단계를 밟아야 할까요? 우선 우선 커널이 워크큐를 어떻

[라즈베리파이] 워크큐(Workqueue) 용어 알아보기

Guillermo Austin Kim|2018년 8월 20일

이번에는 워크큐에서 쓰이는 여러 용어를 소개합니다.많은 개발자들이 워크큐를 낯설어하는 이유는 자료구조와 그 개념을 익히기 어렵기 때문입니다. 워크와 워커쓰레드 그리고 풀워크가 자료구조가 어떤 형태로 연결되서 처리하는지 큰 그림을 그리기 어렵습니다. 각각 의미와 자료 구조를 살펴보겠습니다. 1. 워커 쓰레드우선 워커 쓰레드부터 알아보겠습니다. 워커 쓰레드는 워크를 실행하는 프로세스입니다. 리눅스 시스템에서 항상 백그라운드로 실행하는 친숙한 프로세스입니다. 프로세스 이름은 "kworker/"로 시작하며 워크큐 종류에 따라 "kworker/" 이후 번호가 붙습니다. 다음은 라즈베리파이에서 확인한 워커 쓰레드입니다.root@raspberrypi:/# ps -ely | grep kworkerS UID P