나는 Linux가 Java VM의 모든 사용자 스레드에 대해 커널 스레드를 생성한다는 것을 여러 곳에서 읽었습니다. (저는 "커널 스레드"라는 용어가 두 가지 다른 방식으로 사용되는 것을 보았습니다.
- 핵심 운영 체제 작업을 수행하기 위해 생성된 스레드
- 운영 체제는 사용자 작업을 수행하기 위해 스레드를 식별하고 예약합니다.
나는 후자의 유형에 대해 이야기하고 있습니다. )
Linux 프로세스는 상위 프로세스와 하위 프로세스 간의 공유 메모리 공간을 지원하므로 커널 스레드는 커널 프로세스와 동일합니까, 아니면 실제로 다른 엔터티입니까?
답변1
문서는 매우 혼란스러울 수 있으므로 여기에서 설명합니다."진짜"리눅스 모델:
- Linux 커널에서는 실행(및 예약)할 수 있는 것을 "프로세스"라고 합니다.
- 각 프로세스에는 시스템 고유 프로세스 ID(PID)와 스레드 그룹 ID(TGID)가 있습니다.
- "정상" 프로세스에는 PID=TGID가 있으며 다른 프로세스는 이 TGID 값을 공유하지 않습니다.
- "스레드" 프로세스는 TGID 값이 다른 프로세스와 공유되는 프로세스입니다.
- 동일한 TGID를 공유하는 여러 프로세스는 최소한 동일한 메모리 공간과 신호 처리기(때때로 그 이상)도 공유합니다.
- "스레드" 프로세스의 PID가 TGID이면 "메인 스레드"라고 부를 수 있습니다.
- 모든 프로세스에서 호출되면
getpid()
해당 TGID(= "메인 스레드" PID)가 반환됩니다. - 모든 프로세스에서 호출되면
gettid()
해당 PID(!)가 반환됩니다. - 모든 유형의 프로세스는 시스템 호출을 통해 생성될 수 있습니다
clone(2)
. - 프로세스 간에 공유되는 내용은 특정 플래그를 에 전달하여 결정됩니다
clone(2)
. - TGID와
ls /proc
마찬가지로 폴더 이름을 숫자로 나열할 수 있습니다 ./proc/NUMBER
- 폴더의 숫자 이름은
/proc/TGID/task
PID 와 동일하며/proc/TGID/task/NUMBER
, - 첨부된 기존 PID가 모두 표시되지 않더라도
ls /proc
이 작업을 수행할 수 있습니다cd /proc/any_PID
.
결론적으로: 커널의 관점에서 보면 각각 고유한 PID를 가진 프로세스만 존재하며 소위 스레드는 단지 다른 유형의 프로세스일 뿐입니다(적어도 하나 이상의 다른 프로세스와 동일한 메모리 공간 및 신호 처리기를 공유함). .
노트:Linux에서 "스레드" 개념을 구현하면 용어 혼란이 발생하며, getpid()
생각한 대로 작동하지 않는다면 이는 POSIX 호환성(스레드는 공통 PID를 공유해야 함)에 따라 작동하기 때문입니다.
답변2
Linux에서는 스레드와 프로세스 간에 전혀 차이가 없습니다. 당신이 보면클론(2)스레드 간에 공유되는 것과 공유되지 않는 것을 결정하는 일련의 플래그가 표시됩니다.
클래식 프로세스는 아무 것도 공유하지 않는 스레드일 뿐입니다. Linux에서 원하는 구성 요소를 공유할 수 있습니다.
이는 더 큰 차이가 있는 다른 운영 체제 구현의 경우에는 해당되지 않습니다.
답변3
스레드는 Linux에서의 프로세스입니다. 프로세스와 마찬가지로 시스템 호출을 통해 신호를 보낼 수 있는 clone
프로세스 ID를 반환하는 시스템 호출을 통해 생성 됩니다 . kill
스레드 프로세스가 ps
출력에 표시됩니다. 호출 clone
에는 스레드 프로세스와 공유되는 상위 프로세스 환경의 양을 결정하는 일부 플래그가 전달됩니다.
답변4
이전 답변은 스레드가 Linux 커널 내부의 프로세스이며 어쨌든 원하는 프로세스 상태의 하위 집합을 clone()할 수 있다는 점을 매우 잘 지적합니다.
하지만 이 점을 염두에 두는 것이 도움이 된다고 생각합니다. 얼마나 많은 컨텍스트를 공유할 수 있거나 고유하게 저장해야 하는지, 컨텍스트 전환에 걸리는 주기는 작업이 얼마나 다른지뿐만 아니라 얼마나 많은 다른 것들이 있을 수 있는지에 따라 달라질 수 있습니다. 시스템 측면에서는 TLB와 같은 하드웨어도 포함됩니다. 그러므로 무엇을 복제하고, 무엇을 공유하는지가 중요합니다.
애플리케이션 수준에서는새로운 스레드(전통적인 의미에서 메모리 이미지, 현재 디렉터리, 열린 파일 핸들 등을 공유하는 것)는 처음에 이러한 스레드만 공유하는 새로운 프로세스보다 항상 저렴합니다. Copy-On-Write로 프로세스가 분기되더라도 일단 쓰면 복사를 해야 합니다. 그렇기 때문에 애플리케이션을 설계할 때 10,000개의 프로세스보다 10,000개의 스레드를 만드는 것이 더 합리적입니다. 보안상의 이유로 새 프로세스를 실행하는 이유는 다른 실행 파일이나 방화벽을 실행하기 위해서입니다.