좋은 것이 있습니다질문과 답변"실제", "사용자" 및 "시스템" 간의 관계를 설명합니다.
"실제"가 어떻게 달라질 수 있는지 설명하고 "사용자"와 "시스템"을 프로세스가 실제로 프로세서에서 실행되는 시간으로 정의합니다.
지금은 "현실"을 완전히 무시합시다. 동일한 응용 프로그램을 여러 번 실행할 때 "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가 메모리에서 데이터가 검색될 때까지 기다리는 주기)를 소비할 수 있습니다.
실제, 사용자 및 시스템 프로세스 시간 통계의 차이점
이 중 하나는 다른 것과 다릅니다. Real은 실제 경과 시간을 나타내며, User 및 Sys는 사용된 CPU 시간을 나타냅니다.과정을 통해서만.
진짜벽시계 시간은 통화 시작부터 끝까지의 시간입니다. 이는 다른 프로세스에서 사용하는 시간 조각과 프로세스가 차단된 시간(예: I/O가 완료되기를 기다리는 경우)을 포함한 모든 경과 시간입니다.
사용자소비된 CPU 시간입니다.사용자 모드에서코드(커널 외부)이내에의 과정. 이는 프로세스를 실행하는 동안 사용된 실제 CPU 시간입니다. 다른 프로세스와 해당 프로세스에 의해 차단된 시간은 이 수치에 포함되지 않습니다.
체계소비된 CPU 시간입니다.커널에서프로세스 내에서. 이는 시스템 호출을 실행하는 데 소요된 CPU 시간을 의미합니다.커널에서는사용자 공간에서 여전히 실행 중인 라이브러리 코드와 반대입니다. "사용자"와 마찬가지로 이는 프로세스에서 사용하는 CPU 시간일 뿐입니다. 커널 모드("하이퍼바이저" 모드라고도 함) 및 시스템 호출 메커니즘에 대한 간략한 설명은 아래를 참조하세요.
User+Sys
프로세스가 실제로 사용한 CPU 시간을 알려줍니다. 이는 모든 CPU에 적용되므로 프로세스에 여러 스레드가 있는 경우 보고된 벽시계 시간이 초과될 수 있습니다 Real
. 출력에서 이 숫자에는 모든 하위 프로세스(및 그 하위 프로세스)의 시간 User
과 Sys
시간뿐만 아니라, wait(2)
또는 를 통해 수집할 수 있는 시간도 포함됩니다 waitpid(2)
. 단, 기본 시스템 호출은 프로세스와 해당 프로세스에 대한 통계를 반환합니다. 아이들은 따로.