커널이 인터럽트를 처리하는 방법을 배우고 있습니다.
읽다시 차오의 메모events/n
, 스레드가 작업 대기열을 처리하는 것으로 나타났습니다 .
동시에 인터넷의 일부 문서(예:이 게시물), 그렇게 말해요
"kworker"는 특히 인터럽트, 타이머, I/O 등이 있는 경우 커널의 실제 처리 대부분을 수행하는 커널 작업자 스레드에 대한 자리 표시자 프로세스입니다.
그것들은 나와 비슷해 조금 혼란스럽습니다. events/n
스레드와 kworker
스레드는 동일한가요? 그렇다면 이름이 events/n
변경되었나요? 그렇지 않다면 kworker
와 의 차이점은 무엇입니까?events/n
kworker
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);
...
}
그래서 내가 얻을 수 있는 건 그게 전부다. 혹시 더 정확한 의견이나 수정된 의견이 있으신 분은 듣고 싶습니다.
작업 대기열에 대한 정확한 정보는 다음 위치에 있습니다.이 커널 문서