Linux 프로 세 스 상태 분석 T, Z, X
라벨
위의 글 에서 우 리 는 리 눅 스 프로 세 스 의 R, S, D 세 가지 상 태 를 소 개 했 고 이 어 위의 글 에서 다른 세 가지 상 태 를 소개 했다.
Linux 프로 세 스 상태: T (TASK STOPPED or TASK TRACED), 일시 정지 상태 또는 추적 상태.
프로 세 스에 SIGSTOP 신 호 를 보 내 면 해당 신호 가 울 려 TASK 에 들 어 갑 니 다.STOPPED 상태 (이 프로 세 스 자체 가 TASK UNINTERRUPTIBLE 상태 에 있 지 않 고 신호 에 응답 하지 않 는 한).(SIGTOP 은 SIGKILL 신호 와 마찬가지 로 매우 강제 적 입 니 다. 사용자 프로 세 스 가 signal 시리즈 시스템 호출 을 통 해 해당 하 는 신호 처리 함 수 를 다시 설정 할 수 없습니다.) 프로 세 스에 TASK 에서 SIGCONT 신 호 를 보 낼 수 있 습 니 다.STOPPED 상태 에서 TASK 회복런 닝 상태.
프로 세 스 가 추적 되 고 있 을 때 TASK 에 있 습 니 다.TRACED 라 는 특별한 상태.'추적 당 하고 있 습 니 다' 는 프로 세 스 가 멈 추고 추적 을 기다 리 는 것 을 말 합 니 다.예 를 들 어 gdb 에서 추적 되 는 프로 세 스 의 다음 정지점, 프로 세 스 가 정지점 에서 멈 출 때 TASK 에 있 습 니 다.TRACED 상태.다른 때 는 추적 되 는 프로 세 스 가 앞에서 언급 한 상태 에 있 었 다.
프로 세 스 자체 에 대해 TASKSTOPPED 와 TASKTRACED 상 태 는 프로 세 스 가 중단 되 었 음 을 나타 내 는 것 과 유사 합 니 다.그리고 TASKTRACED 상 태 는 TASK 에 해당 합 니 다.STOPPED 위 에 보호 층 이 더 생 겨 TASKTRACED 상태의 프로 세 스 가 SIGCONT 신호 에 응답 하지 않 아 깨 워 집 니 다.디 버 깅 프로 세 스 가 ptrace 시스템 을 통 해 PTRACE 를 호출 할 때 까지 만 기다 릴 수 있 습 니 다.CONT、PTRACE_DETACH 등 작업 (ptrace 시스템 에서 호출 된 매개 변수 지정 작업) 이나 디 버 깅 프로 세 스 가 종료 되 어야 디 버 깅 된 프로 세 스 가 TASK 를 복구 할 수 있 습 니 다.런 닝 상태.
Linux 프로 세 스 상태: Z (TASK DEAD - EXIT ZOMBIE), 종료 상태, 프로 세 스 가 좀 비 프로 세 스 가 됩 니 다.
프로 세 스 가 종료 되 는 동안 TASKDEAD 상태.
이 종료 과정 에서 프로 세 스 가 차지 하 는 모든 자원 은 task 를 제외 하고 회 수 됩 니 다.struct 구조 (및 소수 자원) 이외.그래서 프로 세 스 는 task 만 남 았 습 니 다.struct 라 는 빈 껍데기 를 좀 비 라 고 부른다.task 를 유지 하 는 이유struct, taskstruct 에는 프로 세 스 의 종료 코드 와 통계 정보 가 저장 되 어 있 습 니 다.아버지 프로 세 스 가 이런 정보 에 관심 을 가 질 가능성 이 높다.예 를 들 어 셸 에서 $?변 수 는 마지막 으로 종 료 된 프론트 프로 세 스 의 종료 코드 를 저장 합 니 다. 이 종료 코드 는 if 문장의 판단 조건 으로 사 용 됩 니 다.물론 커 널 도 이 정 보 를 다른 곳 에 저장 하고 taskstruct 구조 가 방출 되 어 공간 을 절약 합 니 다.하지만 task 사용struct 구조 가 더욱 편리 합 니 다. 커 널 에 pid 에서 task 까지 구축 되 었 기 때 문 입 니 다.struct 는 관 계 를 찾 고 프로 세 스 간 의 부자 관 계 를 찾 습 니 다.task 방출struct, 부모 프로 세 스 가 하위 프로 세 스 의 종료 정 보 를 찾 을 수 있 도록 새로운 데이터 구 조 를 만들어 야 합 니 다.
부모 프로 세 스 는 wait 시리즈 의 시스템 호출 (예 를 들 어 wait 4, waitid) 을 통 해 특정한 하위 프로 세 스 의 종 료 를 기다 리 고 종료 정 보 를 얻 을 수 있 습 니 다.그리고 wait 시리즈 의 시스템 호출 은 하위 프로 세 스 의 시체 (task struct) 도 방출 합 니 다.하위 프로 세 스 가 종료 되 는 과정 에서 커 널 은 부모 프로 세 스에 신 호 를 보 내 부모 프로 세 스에 게 '시신 수습' 을 알 립 니 다.이 신 호 는 기본적으로 SIGCHLD 이지 만 클론 시스템 을 통 해 하위 프로 세 스 를 만 들 때 이 신 호 를 설정 할 수 있 습 니 다.
아래 코드 를 통 해 EXIT 를 만 들 수 있 습 니 다.ZOMBIE 상태의 프로 세 스:
#include
void main() {
if (fork())
while(1) sleep(100);
}
컴 파일 실행, 그리고 ps:
kouu@kouu-one:~/test$ ps -ax | grep a\.out
10410 pts/0 S+ 0:00 ./a.out
10411 pts/0 Z+ 0:00 [a.out]
10413 pts/1 S+ 0:00 grep a.out
부모 프로 세 스 가 종료 되 지 않 는 한 이 좀 비 상태의 하위 프로 세 스 는 계속 존재 합 니 다.그렇다면 부모 프로 세 스 가 종료 되면 누가 아들 프로 세 스에 게 시 체 를 수습 하 러 왔 을 까?프로 세 스 가 종 료 될 때 모든 하위 프로 세 스 를 다른 프로 세 스에 맡 깁 니 다. (다른 프로 세 스 의 하위 프로 세 스 로 만 듭 니 다.)누구 한테 맡 길 까요?프로 세 스 가 있 는 프로 세 스 그룹의 다음 프로 세 스 를 종료 하거나 1 번 프로 세 스 를 종료 할 수 있 습 니 다.그래서 모든 프로 세 스, 매 순간 부모 프로 세 스 가 존재 합 니 다.1 번 프로 세 스 가 아니면
1 번 프로 세 스, pid 가 1 인 프로 세 스, init 프로 세 스 라 고도 합 니 다.Liux 시스템 이 시 작 된 후 첫 번 째 로 만 든 사용자 상태 프로 세 스 는 init 프로 세 스 입 니 다.이것 은 두 가지 사명 이 있 습 니 다. 1. 시스템 초기 화 스 크 립 트 를 실행 하고 일련의 프로 세 스 를 만 듭 니 다. (모두 init 프로 세 스 의 자손 입 니 다.)2. 죽은 순환 에서 하위 프로 세 스 의 종료 사건 을 기다 리 고 waitid 시스템 호출 을 통 해 '시신 수습' 작업 을 수행 합 니 다.init 프로 세 스 는 중단 되 지 않 고 죽 이지 않 습 니 다.하위 프로 세 스 가 종료 되 기 를 기다 리 는 중 TASKINTERRUPTIBLE 상태, "시신 수습" 과정 에서 TASK런 닝 상태.
Linux 프로 세 스 상태: X (TASK DEAD - EXIT DEAD), 종료 상태, 프로 세 스 가 삭 제 됩 니 다.
프로 세 스 가 종료 하 는 과정 에서 task 를 유지 하지 않 을 수도 있 습 니 다.struct。예 를 들 어 이 프로 세 스 는 다 중 스 레 드 프로그램 에서 detach 에 의 해 진행 되 었 던 프로 세 스 입 니 다.또는 부모 프로 세 스 는 SIGCHLD 신 호 를 설정 한 handler 를 SIG 로 설정 합 니 다.IGN, SIGCHLD 신 호 를 명시 적 으로 무시 합 니 다.(이것 은 poix 의 규정 입 니 다. 하위 프로 세 스 의 종료 신 호 는 SIGCHLD 이외 의 다른 신호 로 설정 할 수 있 지만.) 이 때 프로 세 스 는 EXIT 에 설 치 됩 니 다.DEAD 종료 상 태 는 다음 코드 가 즉시 이 프로 세 스 를 완전히 풀 어 주 는 것 을 의미 합 니 다.그래서 EXITDEAD 상 태 는 ps 명령 을 통 해 포착 할 수 없 을 정도 로 매우 짧다.
프로 세 스 의 초기 상태
프로 세 스 는 fork 시리즈 의 시스템 호출 (fork, clone, vfork) 을 통 해 만 들 어 졌 으 며, 커 널 (또는 커 널 모듈) 도 kernel 을 통 해 만 들 수 있 습 니 다.thread 함수 가 커 널 프로 세 스 를 만 듭 니 다.하위 프로 세 스 를 만 드 는 함수 들 은 본질 적 으로 같은 기능 을 수행 합 니 다. 호출 프로 세 스 를 복사 하여 하위 프로 세 스 를 얻 습 니 다.(옵션 매개 변 수 를 통 해 각종 자원 이 공유 인지 개인 인지 결정 할 수 있 습 니 다.) 호출 프로 세 스 가 TASK 에 있 는 이상RUNNING 상태 (그렇지 않 으 면 실행 중인 것 이 아니라면 어떻게 호출 합 니까?) 하위 프로 세 스 는 기본적으로 TASK 에 있 습 니 다.런 닝 상태.또한, 시스템 에서 클 라 이언 트 와 커 널 함수 kernel 을 호출 합 니 다.thread 도 CLONE 받 아들 이기STOPPED 옵션 을 선택 하여 하위 프로 세 스 의 초기 상 태 를 TASK 로 설정 합 니 다.STOPPED。
프로 세 스 상태 변화
프로 세 스 가 생 성 된 후에 프로 세 스 가 종 료 될 때 까지 상태 가 일련의 변화 가 발생 할 수 있 습 니 다.프로 세 스 상태 가 여러 가지 가 있 지만 프로 세 스 상태의 변 화 는 두 가지 방향 만 있 습 니 다. TASK 에서RUNNING 상태 비 TASKRUNNING 상태 또는 비 TASKRUNNING 상태 가 TASK런 닝 상태.그 러 니까 TASK 를 주면INTERRUPTIBLE 상태의 프로 세 스 는 SIGKILL 신 호 를 보 냅 니 다. 이 프로 세 스 는 먼저 깨 워 진 다음 (TASK RUNNING 상태 로 들 어 갑 니 다) SIGKILL 신호 에 응답 하여 종료 합 니 다 (TASK DEAD 상태 로 변 합 니 다).TASKINTERRUPTIBLE 상태 에서 바로 종료 합 니 다.
프로 세 스 는 비 TASKRUNNING 상태 가 TASKRUNNING 상 태 는 다른 프로 세 스 (중단 처리 프로그램 일 수도 있 음) 가 깨 우기 작업 을 수행 하여 이 루어 집 니 다.깨 우 는 프로 세 스 설정 을 실행 합 니 다. 깨 우 는 프로 세 스 의 상 태 는 TASK 입 니 다.RUNNING, 그리고 그 taskstruct 구 조 는 CPU 의 실행 가능 한 대기 열 에 추 가 됩 니 다.그래서 깨 어 난 프로 세 스 가 실 행 될 기회 가 있 습 니 다.
프로 세 스 는 TASKRUNNING 상태 비 TASKRUNNING 상 태 는 두 가지 경로 가 있 습 니 다. 1. 신호 에 응답 하여 TASK 에 들 어 갑 니 다.STOPED 상태 또는 TASKDEAD 상태;2, 실행 시스템 호출 주동 적 으로 TASKINTERRUPTIBLE 상태 (예 를 들 어 nanosleep 시스템 호출) 또는 TASKDEAD 상태 (예: exit 시스템 호출);또는 시스템 호출 에 필요 한 자원 을 만족 시 키 지 못 해 TASK 에 들 어 갑 니 다.INTERRUPTIBLE 상태 또는 TASKUNINTERRUPTIBLE 상태 (예 를 들 어 select 시스템 호출).분명히 이 두 가지 상황 은 프로 세 스 가 CPU 에서 실행 중인 상황 에서 만 발생 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 다 중 스 레 드 메커니즘 의 스 레 드 생 성target 을 실행 대상 으로 지정 한 name 을 이름 으로 하고 group 에서 참조 하 는 스 레 드 그룹의 일원 으로 새 Thread 대상 을 할당 합 니 다. 이 스 레 드 가 독립 된 Runnable 실...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.