
스레드만 예약된 경우 프로세스는 어떻게 상태를 가질 수 있습니까(Windows 및 Linux)?
- 프로세스를 생성한다고 가정하자인
- 철사T1이제 할당됨
- T1이제 실행 가능한 상태입니다.
- 스케줄러 선택T1그리고 작동하도록 설정인
- 새 스레드T2실행 가능으로 생성 및 표시됨
- 스케줄러 선택T2다른 CPU 코어에 넘겨주세요
- T1이제 사용자 입력을 기다립니다.T2여전히 다른 코어에서 실행 중
상태는 무엇인가인차단/실행?
프로세스 상태를 결정하는 논리는 무엇입니까?
답변1
스레드는 기존 프로세스와 동일한 상속 속성을 공유하지 않습니다.
적어도 POSIX에서는 스레드가 서로 피어*로 간주됩니다. 단일 프로세스에서 스레드를 생성하면 이제 P1이라는 컨테이너의 동일한 메모리 영역(및 계정 공간)에 바인딩된 두 개의 스레드 T1과 T2가 있습니다.
이는 실제로 프로그램 설계자에게 혼란을 야기할 수 있습니다. 특히 신호가 도착하면 원래 생성된 첫 번째 스레드뿐만 아니라 모든 스레드 또는 모든 스레드가 계층 구조에서 동일한 "동일한" 레벨에 있기 때문에 신호를 수신할 수 있기 때문입니다. 다른.
제시한 예에는 실제로 세 개의 스레드가 있습니다. T1(즉, P1), T2 및 T3(생성된 두 개의 스레드)
P1(T1)의 상태는 실행 가능, 절전, 실행 중 또는 다른 스레드를 특별히 기다리지 않는 한 다른 상태일 수 있으므로 정의되지 않습니다.
스레드와 프로세스 간의 관계를 이해하려면 아래 다이어그램을 참조하세요.
pthread_create()
┌──Pid┼P1──┐ ┌──Pid┼P1──┐
│ │ clone(...CLONE_THREAD...) │ │
│ Thread T1│ clone(...CLONE_THREAD...) │ Thread T1│
│ │ ... │ Thread T2│
│ │ clone(...CLONE_THREAD...) │ ... │
│ │ ─────────────────────────────► │ Thread TN│
└──────────┘ └──────────┘
─────────────────────────────────────────────────────────────────
fork()
┌──Pid┼P1──┐ ┌──Pid┼P1──┐
│ │ clone() │ Thread T1│ ...
│ Thread T1│ clone() └──────────┘
│ │ ...
│ │ clone() ┌──Pid┼P2──┐ ┌──Pid┼PN──┐
│ │ ───────────► │ Thread T1│ │ Thread T1│
└──────────┘ └──────────┘ └──────────┘
PID는 실제로 내부에서 동일한 리소스를 공유하는 모든 스레드를 기록하고 설명하는 컨테이너입니다. **
실행하는 대부분의 PID에는 내부에 스레드(기술적으로는 실행 가능한 컨텍스트)가 있습니다. 새 스레드를 생성하면 동일한 PID 컨테이너 내에서 두 개의 실행 가능한 컨텍스트를 선언하기만 하면 됩니다.
그렇게 하면 fork()
새로운 컨테이너와 그 안에 새로운 스레드가 생깁니다.
*전체 PID의 동작을 다시 설명하는 특정 호출만 허용하는 "기본" 스레드(프로세스의 초기 스레드)가 있습니다. 이것은 계층 구조에 가장 가까운 것입니다.
**설명의 명확성을 위해 스레드와 프로세스의 기본 특성을 설명하기 위해 스레드의 다른 많은 속성과 공유 항목, 프로세스 계층 구조 및 공유 항목을 무시했습니다.