Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[리눅스커널] 워크큐: 워커 자료구조인 struct worker 구조체 알아보기 8. Workqueue

워커를 관리하고 저장하는 자료구조는 struct worker 구조체입니다. 이번 시간에는 struct worker 구조체 세부 필드를 분석하겠습니다. 

struct worker 구조체 분석하기

다음은 struct worker 구조체 선언부입니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/workqueue_internal.h]
1 struct worker {
2 union {
3 struct list_head entry; 
4 struct hlist_node hentry; 
5 };
6 struct work_struct *current_work;
7 work_func_t current_func;
8 struct pool_workqueue *current_pwq; 
9 bool desc_valid;
10 struct list_head scheduled;
11
12 struct task_struct *task;
13 struct worker_pool *pool;
14
15 struct list_head node;
16 unsigned long last_active;
17 unsigned int flags;
18 int id;
19
20 char desc[WORKER_DESC_LEN];
21
22 struct workqueue_struct *rescue_wq;
23};

각 구조체 세부 필드를 살펴봅시다.

struct work_struct  *current_work;
struct work_struct 구조체로 현재 실행하려는 워크를 저장하는 필드입니다.

work_func_t current_func;
실행하려는 워크 핸들러 주소를 저장하는 필드입니다. 

    워크 구조체와 워크 핸들러는 커널 어느 코드에서 struct worker 구조체 필드에 
   저장할까요?

워크 구조체와 워크 핸들러는 process_one_work() 함수에서 위 current_work와 current_func 필드에 저장합니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/kernel/workqueue.c]
static void process_one_work(struct worker *worker, struct work_struct *work)
{
...
worker->current_work = work;
worker->current_func = work->func;
worker->current_pwq = pwq;

이어서 다른 필드를 분석하겠습니다.

struct task_struct *task;
워커 스레드의 태스크 디스크립터 주소입니다.

struct worker_pool *pool;
워커를 관리하는 워커 풀 주소를 저장하는 필드입니다.

struct list_head node;
워커풀에 등록된 링크드 리스트입니다.

워커와 워커 스레드는 어떤 관계일까

워커 스레드는 커널 스레드의 한 종류로 워크를 실행하는 프로세스입니다. 워커 스레드의 스레드 핸들 함수는 worker_thread() 입니다.


커널 스레드가 무슨 일을 하는지 알려면 해당 커널 스레드 핸들 함수를 분석해야 합니다. 워커 스레드도 마찬가지입니다. 워커 스레드의 스레드 핸들인 worker_thread() 함수를 열어보면 워커 스레드의 세부 동작 방식을 확인할 수 있습니다.


워커는 워커 스레드를 표현하는 자료구조이며 struct worker입니다. 워커 스레드와 워커는 비슷한 개념으로 볼 필요가 있습니다.

워커 스레드를 생성하기 위해서 우선 워커를 생성해야 합니다. 워커는 워커 스레드를 담근 그릇(container)와 비슷한 역할을 수행합니다. 만약 “워커를 해제했다” 라고 어떤 개발자가 말하면 “해당 워커 스레드를 해제했구나”와 같은 뜻입니다.

워커 스레드 구조체인 struct worker 플래그를 살펴봤으니 워커 스레드는 누가 언제 생성하는지 살펴보겠습니다.


핑백

덧글

댓글 입력 영역