Linux 커널 스레드는 실제로 커널 프로세스입니까?


19

Linux에서 Java VM의 각 사용자 스레드에 대한 커널 스레드를 작성하는 곳을 여러 곳에서 읽었습니다. ( "커널 스레드"라는 용어는 두 가지 방식으로 사용됩니다.

  1. 핵심 OS 작업을 수행하기 위해 작성된 스레드
  2. OS가 인식하고 사용자 작업을 수행하도록 예약 된 스레드

나는 후자의 유형에 대해 이야기하고 있습니다.)

Linux 프로세스는 부모와 자식 사이의 공유 메모리 공간을 지원하기 때문에 커널 스레드와 커널 프로세스가 동일합니까? 아니면 다른 엔티티입니까?

답변:


23

리눅스에서 쓰레드와 프로세스는 전혀 차이가 없다. 당신이 보면 클론 (2) 당신은 공유 결정, 어떤 것은 스레드간에 공유되지 않도록 플래그 세트를 볼 수 있습니다.

클래식 프로세스는 아무것도 공유하지 않는 스레드 일뿐입니다. Linux에서 원하는 구성 요소를 공유 할 수 있습니다.

훨씬 더 실질적인 차이가있는 다른 OS 구현에서는 그렇지 않습니다.


22

이 문서는 매우 혼란 스러울 수 있으므로 " 실제 "Linux 모델은 다음과 같습니다.

  • 리눅스 커널 안에서 실행 (& 스케줄) 될 수있는 것을 "프로세스"라고합니다.
  • 각 프로세스에는 시스템 고유 프로세스 ID (PID)와 스레드 그룹 ID (TGID)가 있습니다.
  • "정상"프로세스는 PID = TGID를 가지며 다른 프로세스는이 TGID 값을 공유하지 않습니다.
  • "스레딩 된"프로세스는 TGID 값이 다른 프로세스와 공유되는 프로세스입니다.
  • 동일한 TGID를 공유하는 여러 프로세스는 적어도 동일한 메모리 공간과 신호 처리기를 공유합니다 (때로는 더 많음)
  • "스레드"프로세스에 PID = TGID가 있으면 "메인 스레드"라고 할 수 있습니다.
  • getpid()프로세스에서 호출 하면 TGID (= "메인 스레드"PID)가 반환됩니다.
  • gettid()모든 프로세스에서 호출 하면 PID (!)가 반환됩니다.
  • clone(2)시스템 호출로 모든 종류의 프로세스를 만들 수 있습니다 .
  • TGID 와 ls /proc같이 나열 할 수있는 폴더의 숫자 이름/proc/NUMBER
  • PID 와 /proc/TGID/task같이 폴더의 숫자 이름/proc/TGID/task/NUMBER
  • 로 기존의 모든 PID를 볼 ls /proc수는 없지만 여전히 할 수 있습니다 cd /proc/any_PID.

결론 : 커널 관점에서 볼 때 각각 고유 한 PID를 갖는 프로세스 만 존재하며 소위 스레드는 다른 종류의 프로세스입니다.

참고 : Linux에서 "스레드"개념을 구현하면 어휘 혼동이 생겼으며, getpid() 거짓말을 하면 생각하지 않는 경우 동작이 POSIX 호환성을 따릅니다 (스레드는 공통 PID를 공유해야 함) .


1
제안 : "task"라는 단어를 사용하면 프로세스 / 스레드 혼란에 빠지지 않고 실행 가능한 것을 참조하는 데 도움이 될 수 있습니다.
토토

17

스레드는 Linux에서 프로세스입니다. clone시스템 호출 로 생성되며, 프로세스 kill와 마찬가지로 시스템 호출을 통해 신호를 보낼 수있는 프로세스 ID를 반환합니다 . 스레드 프로세스는 ps출력 에서 볼 수 있습니다 . clone호출 스레드 프로세스를 공유하는 방법을 부모 프로세스의 환경의 많은 결정 플래그를 전달됩니다.


1
그는 pthreads(7)현재 NPTL (Native POSIX Threads Library) 구현에서 "프로세스의 모든 스레드는 동일한 스레드 그룹에 배치되고 스레드 그룹의 모든 구성원은 동일한 PID를 공유합니다"라고 말합니다. 사용되지 않는 LinuxThreads 구현에서 각 "스레드"에는 자체 PID가 있습니다.
Totor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.