프로세스가 왜 잠들었다가 깨어나는지 어떻게 알 수 있나요?

프로세스가 왜 잠들었다가 깨어나는지 어떻게 알 수 있나요?

'top'을 실행하면 Perl 스크립트 프로세스가 'S' 상태에 있음을 알 수 있습니다. 무엇이 이 Perl 프로세스를 잠자기 상태로 만들고 어떻게 깨울 수 있는지 알 수 있는 방법이 있습니까? 디버깅 방법을 사용하면 Perl 스크립트를 "S" 상태로 만드는 행에 대한 더 많은 통찰력을 얻을 수 있습니다.

답변1

상태에 있는 프로세스는 S일반적으로 파일이나 네트워크를 읽거나 쓰거나 다른 호출된 프로그램이 완료되기를 기다리는 등 차단 시스템 호출에 있습니다.

이를 사용하여 strace -p <pid>현재 어떤 시스템 호출이 발생하고 있는지 확인할 수 있습니다. 다음과 유사한 출력이 생성됩니다.

write(1,"foobar"...,4096

이는 프로세스가 "foobar"로 시작하는 4096바이트를 stdout(fd #1)에 쓰려고 시도하지만 리디렉션되는 곳마다 사용 중이고 출력 버퍼가 가득 찼음을 의미합니다.

답변2

프로세스는 무언가(보통 I/O)를 기다리는 동안 절전 모드로 전환됩니다.

S프로세스가 읽기 및 쓰기를 수행하는 동안 차단 상태가 됩니다. 이는 세마포어 또는 기타 동기화 프리미티브를 기다리는 경우에도 발생할 수 있습니다.

"깨울" 수는 없습니다. 대기 중인 데이터/리소스를 사용할 수 있을 때만 계속됩니다.

이는 정상적이고 예상되는 현상이며 일반적으로 문제가 되지 않습니다. 일반적으로 이 "프로그램"은 파일 없이 명령줄에서 실행됩니다.

while (<>) { print; }

대부분의 시간 동안 휴면 상태이므로 괜찮습니다. 사용자 입력을 기다리면서 CPU를 낭비하는 것을 원하지 않습니다.

만약 너라면생각하다이는 문제입니다. I/O 수행 방식을 변경해 보십시오(기본 장치 블록 크기의 배수로 더 큰 블록 읽기, 메모리 매핑된 I/O 수행 등).

관련 정보