애플리케이션이 .NET 또는 Java에서 다중 코어 또는 CPU를 어떻게 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/37089

  •  09-06-2019
  •  | 
  •  

문제

.NET 또는 Java에서 스레드나 프로세스를 시작할 때 실행되는 프로세서나 코어를 선택할 수 있는 방법이 있습니까?이러한 경우 공유 메모리 모델은 어떻게 작동합니까?

도움이 되었습니까?

해결책

다중 스레드를 사용하는 경우 운영 체제는 다중 코어 사용을 자동으로 처리합니다.

다른 팁

실행되는 프로세서나 코어를 선택할 수 있는 방법이 있나요?

작업 관리자를 사용하여 프로그램을 실행할 수 있는 CPU를 Windows에 알려줄 수 있습니다.일반적으로 이는 멀티스레딩 구현이 손상된 레거시 프로그램의 문제를 해결하는 데에만 유용합니다.이것을하기 위해,

  • 작업 관리자 실행
  • 다음에서 프로세스를 찾아보세요. Processes 창문.
  • 마우스 오른쪽 버튼을 클릭하고 선택하세요. Set Affinity...
  • 애플리케이션 실행을 허용하려는 CPU 옆의 확인란을 선택합니다.그러면 Windows는 해당 프로세스의 스레드만 해당 특정 CPU로 예약합니다.

내가 올바르게 기억한다면 Windows는 이후 프로세스가 실행될 때 이러한 설정을 '기억'할 것입니다. 그러나 이에 대해 내 말을 인용하지 마십시오. 직접 몇 가지 테스트를 실행하십시오. :-)

프로그램을 시작한 후 .NET에서 프로그래밍 방식으로 이 작업을 수행할 수도 있습니다. System.Diagnostics.Process.ProcessorAffinity 속성이지만 설정을 '기억'하지 않을 것이라고 생각하므로 앱이 적합하다고 판단되는 CPU 창에서 실행되는 짧은 기간이 항상 있을 것입니다.죄송합니다. Java에서 이 작업을 수행하는 방법을 모르겠습니다.

메모:

이는 전체 프로세스 수준에 적용됩니다.CPU0에 대해서만 선호도를 설정한 다음 50개의 스레드를 시작하면 해당 스레드 중 50개는 모두 CPU0에서 실행되고 CPU1, 2, 3 등은 아무 작업도 하지 않습니다.

요점을 다시 한번 말씀드리자면, 이는 깨진 레거시 소프트웨어 문제를 해결하는 데 주로 유용합니다.소프트웨어가 손상되지 않았다면 이러한 설정을 어지럽혀서는 안 되며, Windows가 프로그램을 실행하는 데 가장 적합한 CPU를 결정하도록 하여 나머지 시스템 성능을 고려할 수 있도록 해야 합니다.


'공유 메모리' 모델의 경우 동일하게 작동하지만 앱이 단일 CPU의 타임슬라이스가 아닌 여러 CPU에서 실행될 때 미묘하게 잘못될 수 있는 사항이 더 많습니다.

놀라운 예를 보려면 다음을 읽어보세요. CPU와 메모리 장벽에 관한 이 말도 안되는 기사.

PowerPC의 OSX 개발을 목표로 하고 있지만 모든 곳에 적용할 수 있을 만큼 일반적입니다.IMHO 그것은 내가 읽은 '모든 개발자가 읽어야 할' 기사 상위 10개 중 하나입니다.

가상 머신이 기본 스레드(녹색 스레드와 반대)를 사용할 때 운영 체제는 멀티스레딩을 처리하며 특정 스레드에 대한 프로세서 선택과 같은 낮은 수준의 세부 정보를 지정할 수 없습니다.일반적으로 사용 가능한 프로세서보다 더 많은 스레드가 있으므로 운영 체제는 모든 스레드가 실행될 수 있도록 시간 분할을 수행해야 하기 때문에 이 방법이 더 좋습니다.

즉, 중요한 작업이 있는 경우 스레드 우선순위를 설정할 수 있으며 일반적으로 스레딩 API가 이러한 가능성을 제공합니다.예를 들어 Java API를 참조하세요. http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

추신:구문 분석 엔진에 뭔가 문제가 있습니다 ...위의 링크를 일반 텍스트로 추가해야 했습니다.

.NET 프레임워크에 대한 병렬 확장을 살펴보겠습니다.아직이에요 CTP, 그러나 멀티 코어 프로세서를 최대한 활용해야 합니다..NET을 시작하는 가장 쉬운 곳은 병렬 팀 블로그.

Java에 관해서는 전혀 모릅니다.

내 핵심 0이 좀 엉망이 되었기 때문에 나는 이것을 몇 가지 프로그램에서 사용했습니다.

// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();

// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);

또는

// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);

이에 대한 자세한 내용은 "Process.ProcessorAffinity 속성".

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