최적의 사용자 시간 대 실시간 비율이 효율적인 병렬화의 지표입니까?

최적의 사용자 시간 대 실시간 비율이 효율적인 병렬화의 지표입니까?

time일부 UNIX 쉘에는 특정 명령을 실행하는 데 필요한 시간을 인쇄하는 명령이 있습니다 . 출력은 다음과 같습니다.

실제 1m0.000s
사용자 10m0.000s
시스템 0m0.000s

다중 코어에서 병렬화를 사용하는 프로그램을 작성하면 사용자 시간은 실시간의 배수가 될 수 있습니다.

내 질문은 사용자 시간이 사용된 스레드 수를 곱한 실시간에 매우 가까우면 프로그램이 가장 잘 병렬화된다고 결론을 내릴 수 있느냐는 것입니다. 즉, 예를 들어 어떤 스레드도 오랫동안 다른 스레드를 기다릴 필요가 없습니다.

답변1

간단히 말해서: 아니요.

많은 에너지를 낭비하는 것은 커널 공간과 사용자 공간 사이를 전환하는 것입니다. 이 전환은 가장 많은 낭비가 발생하는 곳입니다. 실제로 수행해야 하는 위치에 도달하려면 수행해야 할 작업이 많습니다. 필요한 스위치 수가 적을수록 가장 효율적인 작동~해야 한다예.

일부 작업은 전적으로 커널 공간에서 수행됩니다(그리고 이를 우회할 수 있는 (안전한) 방법은 없습니다). 이 경우 대부분의 시간은 커널 공간에서 소비되는데, 이는 이를 실행하는 가장 효율적인 방법입니다.

커널이 서비스/기능을 구현하지 않기 때문에 사용자 공간에서 수행해야 하는 다른 작업이 있습니다. 이러한 작업에서는 사용자 공간을 더 많이 사용할수록 작업 효율성이 높아집니다.

그러나 누군가는 덜 효율적인 알고리즘을 사용하여 사용자 공간에서 효율적인 커널 서비스를 구현했을 수도 있습니다. 이로 인해 사용자 시간은 늘어나지만 효율성은 떨어집니다. 커널 공간의 동일한 서비스와 비교해 보세요.

일부 다른 개발자는 한 번에 1MB를 읽는 상응하는 호출 대신(블록 대신 블록에 상응하는 함수가 있는 경우) 커널을 호출하여 한 번에 1바이트를 읽을 수 있습니다(각 바이트에 대해 전환해야 함). 바이트).

그리고 결국에는 커널 작업과 사용자 작업을 혼합하여 수행해야 합니다. 예를 들어, 디스크 블록을 읽으려면 커널이 이 기능을 제공해야 하며, 메모리 블록(버퍼)이 디스크 블록 읽기 결과로 채워질 때까지 "Fire and Forget" 기능을 제공해야 합니다. 프로세스 메모리(예: 프로그램 배열)에 액세스하려면 커널 호출이 필요하지 않습니다.

시간 효율성을 측정하는 쉬운 방법은 없습니다.

관련 정보