문제

시스템 리소스를 너무 많이 차지하지 않도록 하나의 CPU에서만 실행하고 싶은 프로그램이 있습니다.문제는 사용 가능한 모든 CPU 코어를 자동으로 사용하는 외부 DLL을 호출한다는 것입니다.외부 DLL에 대한 소스 코드가 없습니다.DLL을 하나의 CPU만 사용하도록 제한하려면 어떻게 해야 합니까?

편집하다:도움을 주셔서 감사합니다. 다음은 하나의 CPU(Windows)로 제한하는 데 사용한 코드입니다.

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

편집하다:프로세스 우선순위를 설정하는 Brannon의 접근 방식은 내가 원하는 것, 즉 프로세스가 리소스를 소모하지 않도록 하는 데 훨씬 더 효과적이라는 것이 밝혀졌습니다.해당 코드는 다음과 같습니다(Windows).

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
도움이 되었습니까?

해결책

프로세서 선호도 설정은 잘못된 접근법입니다. OS가 스케줄링을 처리하도록하십시오.

기계가 유휴 상태 인 경우 가능한 한 많은 프로세서를 사용하고 싶습니다. 그렇지 않으면 아무 이유없이 일을 적게하고 있습니다. 기계가 바쁘다면 "무료"사이클을 사용하고 다른 프로세스에 부정적인 영향을 미치지 않습니다.

Windows에는이 기능이 내장되어 있습니다. 이에 대한 적절한 솔루션은 프로세스의 기본 우선 순위를 설정하는 것입니다.

보다 http://msdn.microsoft.com/en-us/library/ms686219(vs.85).aspx 자세한 내용은 SetPriorityClass().

코드를 쓰지 않고이 테스트하려면 작업 관리자를 사용하여 프로세스의 우선 순위를 변경하십시오.

다른 팁

프로그램의 CPU 친화력을 설정할 수 있습니다. 시도해보십시오 SetProcessAffinityMask Windows 또는 기능 sched_setaffinity Linux에서.

일반적으로 DLL은이를 호출하는 코드와 동일한 스레드/메모리 공간에 있습니다. DLL 자체를 호출하는 행위는 스레드를 생성해서는 안됩니다. DLL을 호출하는 것이 더 많은 스레드를 생성하는 것처럼 보이면 DLL 자체가 코드 어딘가에 스레드를 생성하고 있음을 의미합니다. DLL에 대한 소스 코드 나 문서가 없다면 DLL이 작업을 수행하기를 원한다면 이에 대해해야 할 일은 많지 않습니다).

애플리케이션의 우선 순위를 가지고 플레이 할 수 있습니다. 응용 프로그램의 우선 순위를 낮추면 CPU 사용이 생성 된 스레드가 변경되지 않더라도 CPU 사용량이 변경 될 수 있습니다. 그러나 당신이 정말로 원하는 것은이 짐승에 대한 문서를 얻는 것 같습니다. 코드가 어떻게 작동하는지 모르면 일반적으로 작동 방식을 변경하기 위해 할 수있는 일은 많지 않습니다. 슈퍼 천재는 그것을 바꿀 수 없습니다.

어......왜?진지하게, 그런 방식으로 추가 성능을 제공할 수 있는 라이브러리를 왜 제한하겠습니까?공유 리소스 등에 액세스하려고 하시나요?다중 스레드 라이브러리가 이를 안전하게 처리할 수 있다고 생각할 수도 있습니다.

당신이 언급하지 않은 것이 없다면 타당한 이유를 찾을 수 없습니다. 견딜 수 없는 다중 스레드 라이브러리를 단일 스레드로 제한합니다.

따라서 프로그램은 하나의 스레드를 사용하지만 외부 DLL이 둘 이상의 스레드를 사용하는 것을 원하지 않습니까? 외부 DLL이하는 일을 많이 통제 할 수 없지만 일부 접근 방식은 다음과 같습니다.

당신은 이것이 어떤 플랫폼인지 말하지 않았습니다. 여기서 창문을 가정하겠습니다.

자식 프로세스를 만들고 a와 연결하십시오 작업 대상. 그런 다음 사용 가능한 CPU 코어 중 하나만 포함하도록 해당 작업 개체의 프로세서 친화력을 설정할 수 있습니다. 아동 프로세스는 친화력 마스크를 작업 대상에 대한 프로세서 친화력의 하위 집합이 아닌 모든 것으로 변경할 수 없습니다. 또한 한계를 설정하지 않아야합니다. JOB_OBJECT_LIMIT_BREAKAWAY_OK 또는 확장 된 한계 JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 직장이나 그렇지 않으면 아동 과정이 직장에서 벗어날 수 있습니다.

또한 작업의 우선 순위 및 예약 클래스를 설정할 수 있습니다. 더 낮은 CPU 및/또는 IO 우선 순위 수준에서 아동 프로세스를 만드는 것이 충분할까요?

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