Linux는 스레드와 하위 프로세스를 어떻게 구별합니까?

Linux는 스레드와 하위 프로세스를 어떻게 구별합니까?

Linux는 실제로 프로세스와 스레드를 구별하지 않지만 둘 다를 데이터 구조로 구현합니다 task_struct.

그렇다면 Linux는 스레드와 프로세스의 하위 프로세스를 구별하기 위해 특정 프로그램에 무엇을 제공합니까? 예를 들어,Linux에서 프로세스가 소유한 모든 스레드의 세부 정보를 볼 수 있는 방법이 있습니까?

감사해요.

답변1

관점 에서 task_struct볼 때, 프로세스의 스레드는 동일한 스레드 그룹 리더(group_leader존재하다task_struct), 하위 프로세스에는 서로 다른 스레드 그룹 리더(각각 별도의 하위 프로세스)가 있습니다.

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

실제로 추적하려는 프로그램은그들만의 실운영 체제별 정보를 사용하는 대신 사용 중인 스레딩 라이브러리에서 제공하는 API에 의존합니다. 일반적으로 Unix 계열 시스템에서는 pthread를 사용하는 것을 의미합니다.

답변2

  1. top그러면 몇 가지 추가 옵션과 함께 명령이 실행됩니다 .

    top -H -b -n 1
    
    • -H매개변수는 top에 각 개별 스레드를 표시하도록 지시합니다. 일반적으로 top은 상위 프로세스 아래의 모든 스레드를 요약합니다.
    • -b매개변수를 사용하면 top이 배치 모드로 실행됩니다. 즉, 대화형 모드에서 실행하고 표시된 데이터를 새로 고치는 대신 정보가 수집되고 표시된 다음 표준 출력으로 덤프됩니다.
    • -b옵션을 사용하면 사용자는 실행할 횟수를 상단에 알려야 하며, 이는 -n실행 횟수에 대한 인수와 최종 매개변수를 통해 수행됩니다.

    따라서 top -H -b -n 1시스템에 "최상위 실행, 단일 스레드 표시, 배치 모드로 실행 및 한 번만 실행"하도록 지시하십시오.

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

    ps -eLf
    

    -eLf매개변수(사용 가능 -e -L -f)는 다음과 같이 분류됩니다.

    • eps소유자 또는 현재 상태(활성, 절전, 일시 중지, I/O 대기 등)에 관계없이 모든 프로세스를 표시하도록 지시합니다 .
    • Lps별도의 스레드를 표시하도록 지시합니다.
    • 출력을 전체 형식 목록으로 형식화하고 매개변수와 함께 fNLWP (스레드 수) 및 LWP(스레드 ID) 열을 출력에 추가하도록 지시합니다 .psL

답변3

PID p1을 사용한 프로세스를 고려하십시오.

하위 프로세스의 객체에는 task_structp1의 PPID(상위 PID)가 있고 해당 PID 및 TGID가 p2로 설정되어 있습니다.

p1 스레드의 개체에는 task_structPID가 p3으로 설정되어 있지만 TGID는 p1로 설정되어 있습니다.

관련 정보