
좋은 것이 있습니다질문과 답변'실제', '사용자', '시스템' 간의 관계를 설명합니다.
'실제'가 달라질 수 있는 이유를 설명하고 '사용자'와 'sys'를 프로세스가 실제로 프로세서에서 실행하는 데 소비한 시간으로 정의합니다.
이제 '진짜'를 완전히 무시하자. 동일한 응용 프로그램을 여러 번 실행할 때 'sys'와 'user'가 서로 다르게 표시되는 것을 확인했습니다.
$time dummy_app
user 0m0.032s
sys 0m0.064s
$time dummy_app
user 0m0.020s
sys 0m0.084s
dummy_app은 0-100000까지 계산되는 for 루프일 뿐입니다.
동일한 바이너리 실행이 프로세서에서 다른 시간을 소비하는 이유는 무엇입니까? 즉, 동일한 앱에 대해 'user'와 'sys'가 항상 동일하지 않은 이유는 무엇입니까?
답변1
여러 실행에서 동일한 바이너리의 실행 시간이 다른 이유
여기서 핵심 문제는 CPU 작동 방식으로 인한 비결정적 동작입니다. 최신 수퍼스칼라 CPU는 한 번에 여러 명령을 실행하거나 실행될 명령의 순서를 변경할 수 있습니다(비순차 실행). 귀하의 예와 관련하여 캐시 사용 최적화가 적용될 수도 있습니다. RAM은 CPU 자체보다 몇 배 느리므로 집중적인 캐싱이 사용됩니다. 바이너리의 두 번째 실행은 캐시에서 실행될 수 있으므로 CPU 주기(CPU가 메모리에서 데이터가 검색될 때까지 기다리는 주기)를 덜 소모합니다.
실제, 사용자 및 시스템 프로세스 시간 통계의 차이
이 중 하나는 다른 것과 다릅니다. 실수는 실제 경과 시간을 나타냅니다. User 및 Sys는 사용된 CPU 시간을 나타냅니다.과정에 의해서만.
진짜벽시계 시간은 통화 시작부터 끝까지의 시간입니다. 이는 다른 프로세스에서 사용하는 시간 조각과 프로세스가 차단된 데 소요되는 시간(예: I/O가 완료되기를 기다리는 경우)을 포함한 모든 경과 시간입니다.
사용자소비된 CPU 시간입니다.사용자 모드에서코드(커널 외부)이내에과정. 이는 프로세스 실행에 사용된 실제 CPU 시간일 뿐입니다. 다른 프로세스와 해당 프로세스가 차단된 데 소요되는 시간은 이 수치에 포함되지 않습니다.
시스템소비된 CPU 시간입니다.커널에서프로세스 내에서. 이는 시스템 호출에 소비된 CPU 시간을 실행하는 것을 의미합니다.커널 내에서,사용자 공간에서 여전히 실행 중인 라이브러리 코드와는 대조적입니다. '사용자'와 마찬가지로 이는 프로세스에서 사용하는 CPU 시간일 뿐입니다. 커널 모드('감독자' 모드라고도 함)와 시스템 호출 메커니즘에 대한 간략한 설명은 아래를 참조하세요.
User+Sys
프로세스가 사용한 실제 CPU 시간을 알려줍니다. 이는 모든 CPU에 적용되므로 프로세스에 여러 스레드가 있는 경우 에서 보고한 벽시계 시간을 잠재적으로 초과할 수 있습니다 Real
. 출력에는 모든 하위 프로세스(및 하위 프로세스)의 시간 User
과 시간이 포함되며, 예를 들어 또는 에 의해 수집될 수 있었던 시기도 포함 됩니다. 단, 기본 시스템 호출은 프로세스와 해당 하위 프로세스에 대한 통계를 별도로 반환합니다.Sys
wait(2)
waitpid(2)