프로세스가 절전 상태로 들어가고 깨어나는 이유를 어떻게 알 수 있나요?

프로세스가 절전 상태로 들어가고 깨어나는 이유를 어떻게 알 수 있나요?

'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 수행 등).

관련 정보