2012-02-19 2 views
4

Windows에서 프로세스의 CPU 사용을 제한 할 수있는 프로그램이 있습니다. 예 : BESThreadMaster. 이 프로그램과 동일한 기능을하지만 다른 구성 기능을 가진 자체 프로그램을 작성해야합니다. 아무도 프로세스의 CPU 스로틀이 어떻게 완료되는지 (코드) 알고 있습니까? 나는 프로세스의 우선 순위를 설정하는 것이 아니라, CPU 시간을 놓고 경쟁하는 다른 프로세스가 없더라도 CPU 사용량을 예를 들어 15 %로 제한하는 방법을 말하는 것이다.Windows에서 프로세스의 CPU 사용을 어떻게 제한합니까? (필요 코드, 응용 프로그램 아님)

업데이트 : 이미 실행 중이며 소스 코드에 액세스 할 수있는 프로세스를 제한 할 수 있어야합니다.

+0

32 비트 (x86), 64 비트 (x64) 또는 둘 다 컴파일해야합니까? – reuben

+0

그리고이 작업을 자신의 스레드 또는 다른 프로세스의 스레드로 수행 하시겠습니까? 유스 케이스는 무엇입니까? –

+5

BES 용 소스 코드를 사용할 수 있습니다. 왜 사용하지 않으시겠습니까? –

답변

4

매우 간단,이 같은 어떻게 든 일할 수 :

  1. 어떤 합리적인 작은 대기 시간 (아마도이 ​​100ms)을 주기적 때 Waitable 타이머를 만듭니다. GetProcessTimes을 한 번 호출하여 관련 프로세스의 "마지막"값을 가져옵니다.
  2. 타이머를 차단하여 영원히 반복합니다.
  3. 당신이 깨어 때마다 :
    • 경우 GetProcessAffinityMask 0을 반환, SetProcessAffinityMask(old_value)를 호출합니다. 이것은 우리가 마지막 반복에서 그 과정을 중지했다는 것을 의미하며, 이제 우리는 다시 그것을 실행할 수있는 기회를주고 있습니다. 다른
    • 전화 GetProcessTimesSetProcessAffinityMask(0) 다음 전화를 old_value = GetProcessAffinityMask 원하는 것보다
    • cpu_usage = (deltaKernelTime + deltaUserTime)/(deltaTime)
    • 이 더 있다면 현재
    • 에서 마지막 빼서 "현재"값을
    • 전화 GetSystemTimeAsFileTime
    • 계산 델타를 얻을 수 있습니다 프로세스가 오프라인 상태가됩니다.

이것은 기본적으로 유저 랜드에서 구현 된 커널에서 실행되는 스케줄러의 매우 원시적 인 버전입니다. 그것은 당신이 옳다고 생각하는 것보다 더 많은 CPU 시간을 사용했다면 "잠자기"프로세스를 약간의 시간 동안 둡니다. 보다 정교한 측정이 1 초 또는 5 초가 넘는다면 가능할 수 있습니다.

프로세스의 모든 스레드를 일시 중단하려는 경우가 있습니다. 그러나 우선 순위가있는 파일을 이 아닌이 아니며 이 아닌SuspendThread을 사용하는 것이 중요합니다. 프로그램이 수행중인 작업을 정확히 알지 못하면 교착 상태 및 기타 부작용이 발생할 수 있습니다.다른 스레드가 실행 중일 때 중요한 섹션을 보유하고있는 스레드를 일시 중단하고 동일한 객체를 얻으려고하는 경우를 생각해보십시오. 또는 12 개의 스레드를 일시 중단하는 중간에 프로세스가 교체되어 절반이 실행 중이고 나머지 절반이 실행 중지 된 것으로 가정하십시오.

선호도 마스크를 0으로 설정한다는 것은 단순히 프로세스의 단일 스레드가 어떤 프로세서에서도 시간 조각을 가져 오지 않는다는 것을 의미합니다. 친화력을 재설정하면 동시에 원자 적으로 동시에 모든 스레드가 다시 실행할 가능성이 생깁니다.

불행히도 SetProcessAffinityMask은 적어도 설명서에 따라 SetThreadAffinityMask과 같이 이전 마스크를 반환하지 않습니다. 따라서 추가 Get... 전화가 필요합니다.

+1

스레드를 되살려 죄송 합니다만,'SetProcessAffinityMask (current_process, 0)'는 마지막 에러 코드로'ERROR_INVALID_PARAMETER'를 사용하여'FALSE'를 리턴합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? –

+1

Windows 8 이상의 경우 Jerry Coffin이 설명한대로 JOBOBJECT_CPU_RATE_CONTROL_INFORMATION과 함께 SetInformationJobObject를 사용하는 것이 더 좋습니다 – skyde

+0

친 화성 0x0이 실제로 지원됩니까? Windows 7에서 시도한 및 호출 오류 87 (ERROR_INVALID_PARAMETER) 함께 실패합니다. PROCESS_SET_INFORMATION 권한으로 프로세스 핸들을 열었습니다. –

6

작업 개체에서 프로세스를 실행하고 작업 개체의 최대 CPU 사용량을 SetInformationJobObject (JOBOBJECT_CPU_RATE_CONTROL_INFORMATION)으로 설정하는 것이 좋습니다.

+2

이 Windows 작업 개체 사용은 Windows 8 개발자 미리보기에 도입 된 것 같습니다. Windows 7/Server 2008 또는 이전 Windows 릴리스에서는 사용할 수 없습니다. – reuben

+1

@Reuben : 좋은 지적; 나는 그것을 언급 했어야했다. –

+2

허용되는 답변보다 훨씬 좋은 옵션입니다. –

0

QueryProcessCycleTime을 사용하면 CPU 사용량을 계산하는 것이 매우 간단합니다. 컴퓨터의 프로세서 속도는 HKLM \ HARDWARE \ DESCRIPTION \ System \ CentralProcessor \\ ~ MHz에서 얻을 수 있습니다 (여기서 프로세서 번호는 각 프로세서에 대해 하나의 항목입니다). 이 값을 사용하면 프로세스의 CPU 사용량을 계산하고 필요에 따라 Sleep()을 사용하여 CPU 사용량을 제한 할 수 있습니다.

관련 문제