리눅스는 자식 프로세스와는 별도로 스레드를 어떻게 알려줍니까? 프로세스로부터 프로세스

리눅스는 실제로 프로세스와 스레드를 구별하지 않으며 데이터 구조로 구현합니다 task_struct.

그렇다면 리눅스는 자식 프로세스로부터 프로세스 스레드를 알리기 위해 어떤 프로그램에 무엇을 제공합니까? 예를 들어, 프로세스가 Linux에있는 모든 스레드의 세부 사항을 볼 수있는 방법이 있습니까?

감사.



답변

A로부터 task_struct관점, 프로세스의 스레드 (동일한 스레드 그룹 리더가 group_leadertask_struct 자식 프로세스가 다른 스레드 그룹 리더 (각 개별 자식 프로세스)가있는 반면,).

이 정보는 사용자 공간에 노출 을 통해/proc 파일 시스템. 또는 의 ppid필드를 보면 부모와 자녀를 추적 할 수 있습니다 (부모가 pid를 제공함). 필드를 보고 스레드를 추적 할 수 있습니다 (이것은 그룹 리더의 pid 인 스레드 그룹 ID를 제공합니다). 프로세스 스레드는 디렉토리에 표시됩니다 . 각 스레드는 자체 하위 디렉토리를 가져 옵니다 . (모든 프로세스에는 하나 이상의 스레드가 있습니다.)/proc/${pid}/stat.../statustgid.../status/proc/${pid}/task

실제로 자체 스레드를 추적하려는 프로그램은 OS 별 정보를 사용하는 대신 사용중인 스레딩 라이브러리에서 제공하는 API를 사용합니다. 일반적으로 pthread를 사용하는 유닉스 계열 시스템에서.


답변

  1. top몇 가지 추가 옵션으로 명령을 실행합니다 .

    top -H -b -n 1
    
    • -H인수는 top에 각 개별 스레드를 표시하도록 지시합니다. 일반적으로 top은 상위 프로세스 하의 모든 스레드를 요약합니다.
    • -b인수는 배치 모드에서 정상 실행한다 – 정보가 수집, 표시 및 대화 형 모드에서 실행하고 데이터가 표시 새로 고침에 반대 한 후 표준 출력에 덤프.
    • -b옵션을 사용하면 사용자는 몇 번을 실행해야하는지 알아야합니다.이 작업은 -n인수 로 수행되며 마지막 인수는 실행 횟수로 수행됩니다.

    따라서 top -H -b -n 1시스템에 “최상위 실행, 개별 스레드 표시, 배치 모드에서 실행 및 한 번만 실행”을 지시합니다.

  2. ps명령은 현재 실행중인 프로세스의 스냅 샷을보고합니다.

    ps -eLf
    

    -eLf인수 ( 또한 사용 가능 -e -L -f)는 다음과 같이 분류됩니다.

    • eps누가 프로세스를 소유하고 있는지 또는 현재 상태 (활성, 휴면, 일시 중지, I / O 대기 등)에 관계없이 모든 프로세스를 표시하도록 지시 합니다.
    • Lps개별 스레드를 표시하도록 지시 합니다.
    • f지시 ps와 풀 포맷 리스팅로서 출력과 함께 포맷 LNLWP (스레드의 수)와 LWP은 (쓰레드 ID) 열 출력에 추가되는 인자.

답변

PID p1을 사용한 프로세스 고려

task_struct자식 프로세스 의 객체는 p1로 PPID (부모 PID)를 가지며 PID와 TGID는 p2로 설정됩니다.

task_struct(P1)의 스레드의 목적은 P1에 관해서는 PID 세트, 말의 P3하지만 TGID 설정해야합니다.