Linux는 실제로 프로세스와 스레드를 구별하지 않지만 둘 다를 데이터 구조로 구현합니다 task_struct
.
그렇다면 Linux는 스레드와 프로세스의 하위 프로세스를 구별하기 위해 특정 프로그램에 무엇을 제공합니까? 예를 들어,Linux에서 프로세스가 소유한 모든 스레드의 세부 정보를 볼 수 있는 방법이 있습니까?
감사해요.
답변1
관점 에서 task_struct
볼 때, 프로세스의 스레드는 동일한 스레드 그룹 리더(group_leader
존재하다task_struct
), 하위 프로세스에는 서로 다른 스레드 그룹 리더(각각 별도의 하위 프로세스)가 있습니다.
이 정보는 사용자 공간에 노출됩니다.통과하다파일 /proc
시스템. or의 필드를 보면 부모와 자식을 추적 할 수 있고 ppid
(이것은 상위 pid를 제공합니다) or의 필드를 보면 스레드를 추적할 수 있습니다(이는 그룹 리더의 PID이기도 한 스레드 그룹 ID를 제공합니다). 프로세스의 스레드는 디렉터리에 표시됩니다. 각 스레드에는 자체 하위 디렉터리가 있습니다. (각 프로세스에는 적어도 하나의 스레드가 있습니다.)/proc/${pid}/stat
.../status
tgid
.../status
/proc/${pid}/task
실제로 추적하려는 프로그램은그들만의 실운영 체제별 정보를 사용하는 대신 사용 중인 스레딩 라이브러리에서 제공하는 API에 의존합니다. 일반적으로 Unix 계열 시스템에서는 pthread를 사용하는 것을 의미합니다.
답변2
top
그러면 몇 가지 추가 옵션과 함께 명령이 실행됩니다 .top -H -b -n 1
- 이
-H
매개변수는 top에 각 개별 스레드를 표시하도록 지시합니다. 일반적으로 top은 상위 프로세스 아래의 모든 스레드를 요약합니다. - 이
-b
매개변수를 사용하면 top이 배치 모드로 실행됩니다. 즉, 대화형 모드에서 실행하고 표시된 데이터를 새로 고치는 대신 정보가 수집되고 표시된 다음 표준 출력으로 덤프됩니다. - 이
-b
옵션을 사용하면 사용자는 실행할 횟수를 상단에 알려야 하며, 이는-n
실행 횟수에 대한 인수와 최종 매개변수를 통해 수행됩니다.
따라서
top -H -b -n 1
시스템에 "최상위 실행, 단일 스레드 표시, 배치 모드로 실행 및 한 번만 실행"하도록 지시하십시오.- 이
이
ps
명령은 현재 실행 중인 프로세스의 스냅샷을 보고합니다.ps -eLf
이
-eLf
매개변수(사용 가능-e -L -f
)는 다음과 같이 분류됩니다.e
ps
소유자 또는 현재 상태(활성, 절전, 일시 중지, I/O 대기 등)에 관계없이 모든 프로세스를 표시하도록 지시합니다 .L
ps
별도의 스레드를 표시하도록 지시합니다.- 출력을 전체 형식 목록으로 형식화하고 매개변수와 함께
f
NLWP (스레드 수) 및 LWP(스레드 ID) 열을 출력에 추가하도록 지시합니다 .ps
L
답변3
PID p1을 사용한 프로세스를 고려하십시오.
하위 프로세스의 객체에는 task_struct
p1의 PPID(상위 PID)가 있고 해당 PID 및 TGID가 p2로 설정되어 있습니다.
p1 스레드의 개체에는 task_struct
PID가 p3으로 설정되어 있지만 TGID는 p1로 설정되어 있습니다.