문제

집중적인 계산을 수행하는 특정 스레드에 대해 최대 CPU 로드를 설정하는 우아한 방법이 있는지 궁금합니다.

지금은 스레드에서 가장 시간이 많이 소요되는 루프(압축만 수행함)를 찾아서 다음을 사용합니다. GetTickCount() 그리고 Sleep() 하드코딩된 값을 사용합니다.루프가 특정 시간 동안 계속되고 특정 최소 시간 동안 휴면 상태가 되도록 합니다.그것은 어느 정도 작업을 수행합니다.스레드가 CPU를 50% 이상 사용하지 않도록 보장합니다.
그러나 동작은 CPU 코어 수(큰 단점)에 따라 달라지며 단순히 추악합니다(작은 단점 :)).
어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

OS의 스케줄러가 원하는 작업을 수행하도록 하는 API에 대해 알지 못합니다(스레드가 유휴 우선순위인 경우에도 우선순위가 더 높은 준비된 스레드가 없으면 실행됩니다).그러나 이미 수행 중인 작업을 기반으로 상당히 우아한 조절 기능을 즉석에서 만들 수 있다고 생각합니다.기본적으로 (Windows 개발 컴퓨터가 없습니다):

스레드가 각 반복을 휴면 상태로 유지하는 기본 시간을 선택합니다.그런 다음 각 반복마다(또는 조절 기능 자체가 상당한 CPU 로드가 되지 않도록 n번째 반복마다) 다음을 수행합니다.

  1. 조절 기능이 마지막으로 호출된 이후 스레드가 사용한 CPU 시간을 계산합니다(이것을 dCPU라고 부르겠습니다).당신은 사용할 수 있습니다 GetThreadTimes() 스레드가 실행된 시간을 가져오는 API입니다.
  2. 조절 기능이 마지막으로 호출된 이후 경과된 실시간 시간을 계산합니다(이것을 dClock이라고 부르겠습니다).
  3. dCPU / dClock은 CPU 사용량(CPU 1개당) 비율입니다.원하는 것보다 높으면 수면 시간을 늘리고, 낮으면 수면 시간을 줄이세요.
  4. 계산된 시간 동안 스레드를 휴면 상태로 만듭니다.

워치독이 CPU 사용량을 계산하는 방법에 따라 다음을 사용할 수 있습니다. GetProcessAffinityMask() 시스템에 CPU가 몇 개 있는지 알아보세요.dCPU / (dClock * CPU)는 사용 가능한 총 CPU 시간의 비율입니다.

여전히 초기 절전 시간과 증가/감소량에 대해 몇 가지 마법의 숫자를 선택해야 하지만, 이 알고리즘을 조정하면 스레드가 결정된 CPU 비율에 거의 가깝게 실행되도록 조정할 수 있다고 생각합니다.

다른 팁

Linux에서는 nice()를 사용하여 스레드의 예약 우선순위를 변경할 수 있습니다.

나는 당신이 원하는 어떤 크로스 플랫폼 방식(또는 보장된 완전한 정지 방법)을 생각할 수 없지만 GetTickCount를 사용하고 있기 때문에 아마도 크로스 플랫폼에 관심이 없을 수도 있습니다. :)

프로세스 간 통신을 사용하고 집약적인 프로세스를 적절한 수준으로 설정하여 필요한 것을 얻을 수 있지만 이것이 귀하의 상황에 적합한지 잘 모르겠습니다.

편집하다:나는 동의한다 남자 이름 그렇기 때문에 스레드보다는 프로세스가 더 적합할 수 있지만 귀하의 목적에는 적합하지 않을 수도 있습니다.

문제는 작업이 있는 동안 CPU를 유휴 상태로 두는 것이 정상이 아니라는 것입니다.일반적으로 백그라운드 작업을 IDLE 우선 순위로 설정하고, 대화형 작업에서 사용하지 않는 모든 CPU 시간을 OS가 예약하도록 합니다.

문제는 감시 프로세스인 것 같습니다.

백그라운드 작업이 CPU 바인딩된 경우 해당 작업에 사용되지 않은 CPU 시간을 모두 사용하려고 합니다.

감시 프로그램 수정을 살펴봐야 할까요?

스레드의 우선순위를 변경할 수 있지만 최대 사용률을 변경하려면 발생하는 작업 수를 제한하기 위해 폴링 및 해킹이 필요하거나 프로세스의 최대 사용률을 설정할 수 있는 OS 도구를 사용해야 합니다.그러나 나는 당신이 이것을하고 싶어하는 어떤 상황도 보지 못했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top