kworker/n과 events/n의 차이점

kworker/n과 events/n의 차이점

커널이 인터럽트를 처리하는 방법을 배우고 있습니다.
읽다시 차오의 메모events/n, 스레드가 작업 대기열을 처리하는 것으로 나타났습니다 .
동시에 인터넷의 일부 문서(예:이 게시물), 그렇게 말해요

"kworker"는 특히 인터럽트, 타이머, I/O 등이 있는 경우 커널의 실제 처리 대부분을 수행하는 커널 작업자 스레드에 대한 자리 표시자 프로세스입니다.

그것들은 나와 비슷해 조금 혼란스럽습니다. events/n스레드와 kworker스레드는 동일한가요? 그렇다면 이름이 events/n변경되었나요? 그렇지 않다면 kworker와 의 차이점은 무엇입니까?events/nkworker

kworker로 (예, kworker/1:0)를 찾을 수 있지만 htop볼 수 없습니다 events/n.

답변1

이에 대한 답을 얻을 수 있을 것 같습니다. 요약하면 이름이 변경된 것 같지만 이에 대한 문서는 찾지 못했습니다.

세부 사항:

Shichao의 노트는 책을 기반으로 했습니다.Linux 커널 개발 작성자: Robert Love. 이 책은 커널 버전 2.6.34를 기반으로 합니다. 주석의 코드 조각이 파일의 코드와 일치합니다.커널/workqueue.c이 버전의 경우:

/*
 * The per-CPU workqueue (if single thread, we always use the first
 * possible cpu).
 */
struct cpu_workqueue_struct {

        spinlock_t lock;

        struct list_head worklist;
        wait_queue_head_t more_work;
        struct work_struct *current_work;

        struct workqueue_struct *wq;
        struct task_struct *thread;
} ____cacheline_aligned;

/*
 * The externally visible workqueue abstraction is an array of
 * per-CPU workqueues:
 */
struct workqueue_struct {
        struct cpu_workqueue_struct *cpu_wq;
        struct list_head list;
        const char *name;
        int singlethread;
        int freezeable;         /* Freeze threads during suspend */
        int rt;
#ifdef CONFIG_LOCKDEP
        struct lockdep_map lockdep_map;
#endif
};

Linux 버전은 다음을 사용하는 것으로 보입니다.작업 대기열 초기화작업 대기열을 생성하는 기능:

void __init init_workqueues(void)
{
        ...
        keventd_wq = create_workqueue("events");
}

Robert Love의 저서 "Creating a Queue"(154페이지)에서는 다음과 같이 말합니다.

간단한 함수를 통해 새 작업 대기열 및 관련 작업자 스레드를 생성할 수 있습니다. struct workqueue_struct *create_workqueue(const char *name) 매개변수 이름은 커널 스레드의 이름을 지정하는 데 사용됩니다.

따라서 위 코드는 작업자 스레드의 이름이 "event"인 이유를 설명하는 것 같습니다.

최신 코드(4.19 참조)에는 몇 가지 차이점이 있습니다. 첫 번째,작업 대기열 구조훨씬 더 넓고,CPU_workqueue_struct더 이상 존재하지 않습니다. 이제 풀이 있고 작업 대기열 작업자 스레드 생성은 다음과 같은 함수에 의해 수행됩니다.작업자 생성수영장에서. 함수 내에서 다음 코드 조각과 같이 "kworker/%s" kthread가 생성됩니다.

/**
 * create_worker - create a new workqueue worker
 * @pool: pool the new worker will belong to
 *
 * Create and start a new worker which is attached to @pool.
 *
 * CONTEXT:
 * Might sleep.  Does GFP_KERNEL allocations.
 *
 * Return:
 * Pointer to the newly created worker.
 */
static struct worker *create_worker(struct worker_pool *pool)
{
        ...
        worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
                                              "kworker/%s", id_buf);
        ...
}

그래서 내가 얻을 수 있는 건 그게 전부다. 혹시 더 정확한 의견이나 수정된 ​​의견이 있으신 분은 듣고 싶습니다.

작업 대기열에 대한 정확한 정보는 다음 위치에 있습니다.이 커널 문서

관련 정보