커널 공간 스레드나 프로세스가 사용자 공간 프로세스의 자식이 되는 것이 가능합니까?

커널 공간 스레드나 프로세스가 사용자 공간 프로세스의 자식이 되는 것이 가능합니까?

나는 Linux 커널에 관해서는 초보자이지만 읽고 있습니다.원섬유에 관한 이 기사커널 공간 스레드라고 언급됩니다(또는 커널에 남아 있는지 확실하지 않음).

기사는 계속됩니다 :

fibril은 커널 공간에서만 실행되는 실행 스레드입니다. ...피브릴에는 자체 스택이 있지만 그 외에는 상위 프로세스의 모든 리소스를 공유합니다. 작업 구조에 연결된 연결 목록에 저장됩니다.

자체 스택을 가지지만 나머지 메모리를 상위 프로세스와 공유하는 것은 스레드의 정의처럼 보입니다.

하지만 내가 알고 싶은 것은 커널의 프로세스나 스레드가 사용자 공간 프로세스의 자식이 될 수 있는가입니다. 아니면 모든 원섬유에 하나의 큰 상위 프로세스가 있다는 기사의 의미를 이해하지 못합니까? 나는 그렇게 생각하지 않습니다. 왜냐하면:

프로세스에는 활성 피브릴이 여러 개 있을 수 있지만 주어진 시간에 그 중 하나만 실제로 프로세서에서 실행될 수 있습니다.

일반적으로 fibril은 호출 사용자 공간 프로세스에서 작업을 수행해야 합니다.

답변1

커널 스레드는 실행 중인 스레드입니다.영구적인커널 모드에서.

ps -efl명령을 내립니다 . 이름이 대괄호 안에 있기 때문에 이러한 커널 스레드를 인식할 수 있습니다. 그리고 상위 프로세스 ID에 주의를 기울이면 대부분이 PID 2([kthreadd])의 하위이고 나머지는 PID 1(init[3])의 하위라는 것을 알 수 있습니다.

따라서 기본적으로 귀하의 질문에 대한 대답은 다음과 같습니다. 아니요!

그러나 이는 스레드가 시스템 호출을 실행하는 것을 막지는 못하며, 이로 인해 호출을 실행하는 동안 스레드가 일시적으로 커널 모드로 전환됩니다. 하지만 이것이 그들을 만들지는 않는다커널 스레드잠시 동안 커널 모드에서 실행되는 스레드일 뿐입니다.

따라서 커널 스레드의 사용자 프로세스 부모를 찾을 수 없는 동안 사용자 프로세스 스레드(때때로 커널 모드에서 실행됨)를 부모로 만들 수 있습니다.


편집: 아래 @Stephen Kitt의 흥미로운 의견:

초기화는 하지만~ 할 것이다사용자 공간으로의 이동은 본질적으로 처음부터 실제 커널 스레드에 불과합니다(커널 초기화). (VG는 아닙니다."일반적인 프로세스")을 먼저 생성해야 하지만(PID=1을 얻으려면) kthreadd보다 먼저 예약되면 kthread가 생성됩니다.

코드(init/main.c)만 보면 됩니다.

static noinline void __ref rest_init(void){
...
rcu_scheduler_starting();
...
pid = kernel_thread(kernel_init, NULL, CLONE_FS);
... 
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

답변2

커널 스레드는 다른 커널 스레드(또는 커널 스레드 이전의 커널 자체)에 의해서만 시작될 수 있습니다. 인용하다디자인을 설명하는 Al Viro의 이메일:

init_taskCPU에서 최종 유휴 스레드를 시작하는 초기 프로세스를 제외한 모든 프로세스 do_fork()는 커널 스레드, 사용자 모드 프로세스 및 유휴 스레드의 세 가지 범주로 나뉩니다. 관련된 하위 수준 작업은 거의 없습니다.

  • 커널 스레드는 새로운 커널 스레드를 생성할 수 있습니다. 가장 원시적인 방법은 입니다 kernel_thread().
  • 사용자 모드 프로세스는 새로운 사용자 모드 프로세스를 생성할 수 있습니다. 이는 sys_fork()// / 에 의해 sys_vfork()수행 됩니다 sys_clone().sys_clone2()
  • 커널 스레드는 사용자 모드 프로세스가 될 수 있습니다. 프리미티브는 kernel_execve().
  • 커널 스레드는 향후 유휴 스레드를 생성할 수 있습니다 fork_idle(). 밝혀지다아니요보조 CPU가 초기화되고 해당 상태가 프로세스에서 크게 덮어쓰기될 때까지 예약됩니다.

어떤 상황에서도 사용자 모드 프로세스는 커널 스레드나 생성된 스레드가 될 수 없습니다. 커널 스레드는 이러한 작업을 수행하지 않습니다 fork(2).

(강조합니다.) 이것은 오래되었지만 규칙은 여전히 ​​​​적용됩니다.

커널 스레드는 항상 kthreaddpid 2를 갖는 하위 스레드입니다(pid 1은 에 예약되어 있음 init). 이것의 목적은 커널 스레드가깨끗한 환경을 가지고 있다, 생성 방법에 관계없이. 이것도 도움이 된다cgroup 초기화.

사용자 공간 구성 요소에 의해 시작된 작업으로 인해 커널 스레드가 시작될 수 있습니다(예: 커널 모듈 로드 또는 파일 시스템 마운트). 그러나 커널 스레드는 커널에 의해 시작되고 커널에 대한 작업을 수행하며 별도의 사용자 공간 프로세스와 연관되지 않습니다.kthreadd 예를 들어신호 처리 목적으로 사용됩니다.

대괄호 안에 표시된 프로세스는 반드시 커널 스레드일 필요는 없습니다.명령줄 없이 프로세스.

관련 정보