2017-11-18 4 views
3

라즈베리 파이 3을 사용하고 기본적으로 약간의 트립 와이어를 밟았습니다.두 개의 동일한 프로세스가 이중 CPU로드를 사용하지 않는 이유

나는 많은 메모리를 소비하고 큰 CPU 부하가있는 매우 크고 복잡한 프로그램이 있습니다. 처음 프로세스가 실행되는 동안 동일한 프로세스를 시작하면 동일한 양의 메모리가 필요하며 특히 CPU로드가 두 배가된다는 것이 정상적인 현상이라고 생각했습니다. 나는 그것이 더 많은 메모리를 없애지 않으며 CPU 부하에 영향을 미치지 않는다는 것을 알았다. 이 동작은 내 프로그램에서 온 경우

을 확인하려면, 나는 매우 높은 메모리 사용량이있는 작은 C++ 프로그램을 작성, 여기있다 :

#include <iostream> 

using namespace std; 

int main() 
{ 
    for(int i = 0; i<100; i++) { 

     float a[100][100][100]; 
     for (int i2 = 0; i2 < 99; ++i2) { 
      for (int i3 = 0; i3 < 99; ++i3){ 
       for (int i4 = 0; i4 < 99; ++i4){ 
        a[i2][i3][i4] = i2*i3*i4; 
        cout << a[i2][i3][i4] << endl; 
       } 
      } 
     } 
    } 
    return 0; 
} 

는 CPU 부하는 대한 인의 30 %에서 max-level, 나는 한 터미널에서 코드를 시작했다. 이상하게도 다른 터미널에서 동시에 시작했을 때 CPU로드에 영향을주지 않았습니다. 나는이 행동이 내 프로그램에서 올 수 없다고 결론을 내렸다.

지금 나는 알고 싶어

  • 프로세스의 특정 유형이 아닌 그릴 당신의 코어를한다는 것을 보장하는 "잠금"이 있습니까?

  • 두 개의 동일한 프로세스가 CPU로드를 두 배로 늘리는 이유는 무엇입니까?

답변

1

글쎄, 나는 확실히 프로세스가 떨어져 모든 메모리를 고려하지 않습니다하게하고, CPU 부하가 100 %에 올라가 만드는는 "잠금"이 것을 발견했다. 더 많은 프로세스가있는 것보다 더 많은 CPU 부하가 존재하지만 선형적인 방식은 아닙니다.

또한 동작을 찾기 위해 작성한 코드는 메모리 사용량이 높으며 30 % 수준은 표준 라이브러리의 cout에서 가져온 것입니다. 여러 프로세스가 동시에 CPU로드를 늘리지 않고도 명령을 사용할 수는 있지만 인쇄 속도에 영향을줍니다.

내가 알게되었을 때, 나는 프로그램 속도에 대해 의심 스러웠다. 내 IDE에서 분석을 사용하여 C++에서 원래 프로그램의 지속 시간을 확인했으며 실제로는 2 배 더 느린 것으로 나타났습니다.

그게 내가 찾고있는 해결책 인 것 같지만, 라즈베리 파이의 구조가 매우 특별한 이래로 많은 사람들에게 적용 할 수 없다고 생각합니다. 다른 시스템에서 어떻게 작동하는지 모르겠습니다.

BTW : 자물쇠가 있다고 짐작할 수 있습니다. 즉, CPU로드 최대 레벨의 15 %를 제거하는 10 개의 프로세스를 시작하면 CPU 사용량이 150 %가됩니다. 불가능한!