리눅스는 실제로 프로세스와 스레드를 구별하지 않으며 데이터 구조로 구현합니다 task_struct
.
그렇다면 리눅스는 자식 프로세스로부터 프로세스 스레드를 알리기 위해 어떤 프로그램에 무엇을 제공합니까? 예를 들어, 프로세스가 Linux에있는 모든 스레드의 세부 사항을 볼 수있는 방법이 있습니까?
감사.
리눅스는 실제로 프로세스와 스레드를 구별하지 않으며 데이터 구조로 구현합니다 task_struct
.
그렇다면 리눅스는 자식 프로세스로부터 프로세스 스레드를 알리기 위해 어떤 프로그램에 무엇을 제공합니까? 예를 들어, 프로세스가 Linux에있는 모든 스레드의 세부 사항을 볼 수있는 방법이 있습니까?
감사.
답변:
A로부터 task_struct
관점, 프로세스의 스레드 (동일한 스레드 그룹 리더가 group_leader
의task_struct
자식 프로세스가 다른 스레드 그룹 리더 (각 개별 자식 프로세스)가있는 반면,).
이 정보는 사용자 공간에 노출 을 통해/proc
파일 시스템. 또는 의 ppid
필드를 보면 부모와 자녀를 추적 할 수 있습니다 (부모가 pid를 제공함). 필드를 보고 스레드를 추적 할 수 있습니다 (이것은 그룹 리더의 pid 인 스레드 그룹 ID를 제공합니다). 프로세스 스레드는 디렉토리에 표시됩니다 . 각 스레드는 자체 하위 디렉토리를 가져 옵니다 . (모든 프로세스에는 하나 이상의 스레드가 있습니다.)/proc/${pid}/stat
.../status
tgid
.../status
/proc/${pid}/task
실제로 자체 스레드를 추적하려는 프로그램은 OS 별 정보를 사용하는 대신 사용중인 스레딩 라이브러리에서 제공하는 API를 사용합니다. 일반적으로 pthread를 사용하는 유닉스 계열 시스템에서.
(sleep 120 | sleep 120) &
의 Tgid
값 을 실행 하고 살펴보면 이를 확인할 수 있습니다 . sleep
/proc/${pid}/status
top
몇 가지 추가 옵션으로 명령을 실행합니다 .
top -H -b -n 1
-H
인수는 top에 각 개별 스레드를 표시하도록 지시합니다. 일반적으로 top은 상위 프로세스 하의 모든 스레드를 요약합니다.-b
인수는 배치 모드에서 정상 실행한다 - 정보가 수집, 표시 및 대화 형 모드에서 실행하고 데이터가 표시 새로 고침에 반대 한 후 표준 출력에 덤프.-b
옵션을 사용하면 사용자는 몇 번을 실행해야하는지 알아야합니다.이 작업은 -n
인수 로 수행되며 마지막 인수는 실행 횟수로 수행됩니다.따라서 top -H -b -n 1
시스템에 "최상위 실행, 개별 스레드 표시, 배치 모드에서 실행 및 한 번만 실행"을 지시합니다.
이 ps
명령은 현재 실행중인 프로세스의 스냅 샷을보고합니다.
ps -eLf
-eLf
인수 ( 또한 사용 가능 -e -L -f
)는 다음과 같이 분류됩니다.
e
ps
누가 프로세스를 소유하고 있는지 또는 현재 상태 (활성, 휴면, 일시 중지, I / O 대기 등)에 관계없이 모든 프로세스를 표시하도록 지시 합니다.L
ps
개별 스레드를 표시하도록 지시 합니다.f
지시 ps
와 풀 포맷 리스팅로서 출력과 함께 포맷 L
NLWP (스레드의 수)와 LWP은 (쓰레드 ID) 열 출력에 추가되는 인자. PID p1을 사용한 프로세스 고려
task_struct
자식 프로세스 의 객체는 p1로 PPID (부모 PID)를 가지며 PID와 TGID는 p2로 설정됩니다.
task_struct
(P1)의 스레드의 목적은 P1에 관해서는 PID 세트, 말의 P3하지만 TGID 설정해야합니다.