인터뷰(C++ 인터뷰)에서 이런 질문을 받았습니다. 답변에 자신이 없으며 더 알고 싶습니다.
- 스레드가 다른 스레드를 생성할 수 있습니까?
- 프로세스가 다른 프로세스를 생성할 수 있습니까?
- 스레드가 프로세스를 생성할 수 있나요?
- 프로세스가 스레드를 생성할 수 있나요?
답변1
예, 스레드는 다른 스레드를 생성할 수 있습니다. UNIX에서는 이 작업이 명령을 통해 (낮은 수준에서) 수행되고
clone()
C 코딩에서는 라이브러리를 통해 높은 수준에서 수행됩니다pthread
.예, 프로세스는 다른 프로세스를 시작할 수 있습니다. 이런 일은 항상 발생합니다. 가장 일반적인 유형의 프로세스 -> 프로세스는
fork()
.이건 잘 모르겠습니다. 이 시점에서 스레드에는 커널 수준 스레드와 사용자 수준 스레드라는 두 가지 주요 유형이 있다는 점을 언급하고 싶습니다. 커널 수준 스레드(일반적으로)는 주요 프로세스에 연결되어 있는 반면, 사용자 수준 스레드는 이러한 프로세스에 의해 생성됩니다(즉, 커널 수준 스레드에 의해).예외가 있습니다어쩌면 누군가가 스레드 -> 프로세스에 대해 더 나은 답변을 줄 수 있을 것입니다.
예. 3의 댓글을 참조하세요.
답변2
실행되는 모든 코드는 무엇이든 할 수 있습니다.
즉, 프로세스는 코드가 아닙니다. 스레드는 실제로 실행되는 것이며 프로세스는 이를 둘러싸는 환경입니다. 따라서 (1)과 (3)은 참이고 나머지는 거짓이다.
답변3
모두 예.
Windows에서는 프로세스가 실제로 "실행"되지 않는다는 점을 이해하는 것이 도움이 될 수 있습니다. 스레드가 실행됩니다. 모든 프로세스에는 최소한 하나의 스레드가 있습니다. 따라서 실제 질문은 다음과 같습니다.
- 코드를 실행하면 다른 스레드가 생성될 수 있나요? 예.
Windows에서는 CreateThread API 또는 그 사촌 중 하나를 사용하여 이 작업을 수행합니다. 긴 버전은 "스레드 컨텍스트에서 실행되는 코드가 다른 스레드를 생성할 수 있습니까?"입니다. 물론이죠. 하지만 그 이후로모두코드는 일부 스레드의 컨텍스트에서 실행되므로 추가 설명이 필요하지 않습니다. CreateThread는 새 스레드에 대한 최상위 함수(기본적으로 새 스레드의 "기본")가 되는 함수의 주소인 인수를 사용합니다.
- 코드를 실행하면 다른 프로세스가 생성될 수 있나요? 예.
이전과 유사하게 스레드의 컨텍스트에서 실행 중인 경우 스레드를 소유한 프로세스의 컨텍스트에서도 실행되는 것입니다. 그렇습니다. CreateProcess API가 있으며 이를 사용하여 다른 프로세스를 생성할 수 있습니다.
또한 추가 노력 없이 자동으로 새 프로세스에 스레드를 생성하게 됩니다. 왜냐하면 (프로세스가 실행되지 않기 때문에) 스레드가 없는 프로세스는 아무 것도 할 수 없기 때문입니다. 새 프로세스의 첫 번째 스레드는 프로그램의 "기본" 기능인 main() 또는 WinMain() 등을 실행하기 시작합니다.