시스템 호출은 호출 프로세스 내에서 실행되고, 인터럽트는 모든 프로세스 내에서 실행될 수 있지만(인터럽트가 발생하면 현재 실행 중인 프로세스 내에서 인터럽트 핸들러가 실행됨) kthread는 어디에서 실행됩니까? 일부 함수 호출이 현재 커널 모드에서 실행되고 있다고 가정해 보겠습니다 kthreads_create
. 이는 새 커널 스레드를 생성해야 하지만 실행 컨텍스트는 무엇입니까? 제 질문이 가상이라고 생각하셨다면 죄송합니다. 저는 확실히 Linux 커널을 처음 접하는 사람입니다.
답변1
커널 스레드는 자체 프로세스 컨텍스트를 갖습니다. 커널 스레드는 다음과 같이 나열됩니다 ps
.
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May29 ? 00:00:44 /sbin/init
root 2 0 0 May29 ? 00:00:00 [kthreadd]
root 3 2 0 May29 ? 00:00:05 [ksoftirqd/0]
root 5 2 0 May29 ? 00:00:00 [kworker/0:0H]
root 7 2 0 May29 ? 00:00:01 [migration/0]
root 8 2 0 May29 ? 00:02:57 [rcu_preempt]
root 9 2 0 May29 ? 00:00:00 [rcu_bh]
root 10 2 0 May29 ? 00:00:00 [rcu_sched]
root 11 2 0 May29 ? 00:00:00 [watchdog/0]
root 12 2 0 May29 ? 00:00:00 [watchdog/1]
...
[대괄호] 안의 모든 프로세스 이름은 커널 스레드를 나타냅니다.
당신은 또한 볼 수 있습니다https://lwn.net/Articles/65178/. kthread_create
데이터 구조를 생성하면 됩니다. 그런 다음 이 데이터 구조는 wake_up_process
프로세스를 실행하는 프로세스로 전달됩니다.
것 같다커널 문서사용된 용어프로세스,철사그리고일오히려 느슨하고 어느 정도 상호 교환이 가능합니다.
답변2
커널 스레드는 일반 프로세스와 유사하지만 두 가지 차이점이 있습니다. (1) 커널 스레드는 커널 모드에서 실행되며 (2) 자체 주소 공간이 없습니다. 이름에서 알 수 있듯이 커널 스레드는 사용자 공간으로 전환되지 않지만 커널 모드에서 계속 실행됩니다. 각 커널 스레드에는 자체 스택이 있지만 주소 공간은 나머지 커널과 공유됩니다. 이런 점에서 이들은 사용자 공간 스레드와 비슷하지만, 물론 차이점이 있지만 사용자 공간 스레드는 자신이 시작한 사용자 수준 프로세스의 주소 공간에 존재합니다.