Posts
7 posts[리눅스커널] 워크큐: 워커 스레드 핸들 worker_thread() 함수 분석하기 (2/2)
2단계: “전처리” 단계 워커 스레드의 “전처리” 단계 코드를 분석할 차례입니다. 다음 24번째 줄 코드를 보겠습니다. 24 recheck:25/* no more worker necessary? */26if (!need_more_worker(pool))27goto sleep; need_more_worker() 함수는 다음 동작을 수행합니다.struct worker_pool 구조체 worklist 필드에 접근해 이미 큐잉한 워크가 있는지 체크struct worker_pool 구조체 nr_running 필드에 저장된 실행 중인 워커 스레드 갯수를 점검 워크를 워크큐에 큐잉한 적이 없다면 워커 스레드를 실행할 필요가 없습니다. 따라서 goto sleep; 구문을 실행해 다시 휴면에 진입합니다.
[리눅스커널] 워크큐: 워크 실행의 출발점인 worker_thread() 함수 분석
워커 스레드가 깨어나면 스레드 핸들러인 worker_thread() 함수가 실행됩니다.worker_thread() 함수는 워커 스레드를 종료하거나 생성하는 기능을 수행하지만 핵심 동작은 워크를 실행하는 것입니다. 이번 소절에서는 worker_thread() 함수에서 워크를 실행하는 동작에 초점을 맞춰 분석하겠습니다. worker_thread() 함수 세부 동작은 다음 워커 스레드 절에서 상세히 다룹니다. 다음은 worker_thread() 함수에서 워크 실행에 관련된 코드 조각입니다.[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/kernel/workqueue.c]01 static int worker_thread(void *__worker)02 {03
[리눅스커널] 워크큐: 워커 쓰레드 핸들 worker_thread() 함수 분석
워크는 워커 쓰레드가 실행합니다. 워커 쓰레드를 관리하는 자료구조는 struct worker 구조체이며 이를 워커라고 부릅니다. 이전 절까지는 자료구조 중심으로 워크를 분석했는데 이번에는 워커 쓰레드가 쓰레드 관점으로 어떻게 실행하는지 알아봅니다. 다음은 워커 자료구조인 struct worker 구조체 선언부입니다.[https://elixir.bootlin.com/linux/v4.14.43/source/kernel/workqueue_internal.h#L24]1 struct worker {2union {3struct list_headentry; 4struct hlist_nodehentry; 5};6struct work_struct*current_work;7work_func_tcu
[라즈베리파이] 워크큐(Workqueue) - ftrace 동작 확인
이번에는 라즈베리파이에서 워크가 실제 어떻게 동작하는지 ftrace로 확인하겠습니다. 이를 위해 다음과 같이 ftrace 로그를 설정할 필요가 있습니다.#!/bin/sh echo 0 > /sys/kernel/debug/tracing/tracing_onsleep 1echo "tracing_off" echo 0 > /sys/kernel/debug/tracing/events/enablesleep 1echo "events disabled" echo secondary_start_kernel > /sys/kernel/debug/tracing/set_ftrace_filtersleep 1echo "set_ftrace_filter init" echo function > /sys/kern


