time
일부 UNIX 쉘에는 특정 명령을 실행하는 데 필요한 시간을 인쇄하는 명령이 있습니다 . 출력은 다음과 같습니다.
실제 1m0.000s
사용자 10m0.000s
시스템 0m0.000s
다중 코어에서 병렬화를 사용하는 프로그램을 작성하면 사용자 시간은 실시간의 배수가 될 수 있습니다.
내 질문은 사용자 시간이 사용된 스레드 수를 곱한 실시간에 매우 가까우면 프로그램이 가장 잘 병렬화된다고 결론을 내릴 수 있느냐는 것입니다. 즉, 예를 들어 어떤 스레드도 오랫동안 다른 스레드를 기다릴 필요가 없습니다.
답변1
간단히 말해서: 아니요.
많은 에너지를 낭비하는 것은 커널 공간과 사용자 공간 사이를 전환하는 것입니다. 이 전환은 가장 많은 낭비가 발생하는 곳입니다. 실제로 수행해야 하는 위치에 도달하려면 수행해야 할 작업이 많습니다. 필요한 스위치 수가 적을수록 가장 효율적인 작동~해야 한다예.
일부 작업은 전적으로 커널 공간에서 수행됩니다(그리고 이를 우회할 수 있는 (안전한) 방법은 없습니다). 이 경우 대부분의 시간은 커널 공간에서 소비되는데, 이는 이를 실행하는 가장 효율적인 방법입니다.
커널이 서비스/기능을 구현하지 않기 때문에 사용자 공간에서 수행해야 하는 다른 작업이 있습니다. 이러한 작업에서는 사용자 공간을 더 많이 사용할수록 작업 효율성이 높아집니다.
그러나 누군가는 덜 효율적인 알고리즘을 사용하여 사용자 공간에서 효율적인 커널 서비스를 구현했을 수도 있습니다. 이로 인해 사용자 시간은 늘어나지만 효율성은 떨어집니다. 커널 공간의 동일한 서비스와 비교해 보세요.
일부 다른 개발자는 한 번에 1MB를 읽는 상응하는 호출 대신(블록 대신 블록에 상응하는 함수가 있는 경우) 커널을 호출하여 한 번에 1바이트를 읽을 수 있습니다(각 바이트에 대해 전환해야 함). 바이트).
그리고 결국에는 커널 작업과 사용자 작업을 혼합하여 수행해야 합니다. 예를 들어, 디스크 블록을 읽으려면 커널이 이 기능을 제공해야 하며, 메모리 블록(버퍼)이 디스크 블록 읽기 결과로 채워질 때까지 "Fire and Forget" 기능을 제공해야 합니다. 프로세스 메모리(예: 프로그램 배열)에 액세스하려면 커널 호출이 필요하지 않습니다.
시간 효율성을 측정하는 쉬운 방법은 없습니다.