반응형
Process.GetCurrentProcess().ProcessorAffinity의 개념
ProcessorAffinity 속성은 현재 프로세스가 실행될 수 있는 CPU 코어를 지정하는 데 사용됩니다. 이를 통해 특정 프로세스를 지정된 CPU 코어에서만 실행되도록 제한하거나, 특정 코어의 사용량을 제어할 수 있습니다.
작동 원리
- ProcessorAffinity는 각 코어를 비트마스크로 표현합니다.
- 예: 2개의 CPU 코어가 있다면, 코어 0은 0b01, 코어 1은 0b10로 표현됩니다.
- new IntPtr(1)은 코어 0만 사용하도록 설정합니다.
- new IntPtr(2)는 코어 1만 사용합니다.
- new IntPtr(3)은 코어 0과 코어 1 모두를 사용합니다.
코드 설명
- Process.GetCurrentProcess():
- 현재 실행 중인 프로세스에 대한 정보를 가져옵니다.
- ProcessorAffinity:
- 프로세스가 실행될 수 있는 CPU 코어를 비트마스크로 설정합니다.
- new IntPtr(value):
- 사용 가능한 CPU 코어를 지정합니다.
- value는 CPU 코어에 대한 비트마스크 값입니다.
샘플 코드
아래는 ProcessorAffinity를 활용하여 특정 코어에서 프로세스를 실행하는 예제입니다.
using System;
using System.Diagnostics;
using System.Threading;
namespace ProcessorAffinityExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Processor Affinity Demo");
Console.WriteLine($"Available Logical Processors: {Environment.ProcessorCount}");
// 현재 프로세스를 가져오기
Process currentProcess = Process.GetCurrentProcess();
Console.WriteLine("Setting affinity to use only Core 0...");
currentProcess.ProcessorAffinity = new IntPtr(1); // 코어 0만 사용
RunCpuIntensiveTask();
Console.WriteLine("Setting affinity to use Core 0 and Core 1...");
currentProcess.ProcessorAffinity = new IntPtr(3); // 코어 0과 코어 1 사용
RunCpuIntensiveTask();
Console.WriteLine("Resetting to use all available cores...");
currentProcess.ProcessorAffinity = new IntPtr((1 << Environment.ProcessorCount) - 1); // 모든 코어 사용
RunCpuIntensiveTask();
}
static void RunCpuIntensiveTask()
{
Console.WriteLine("Running CPU-intensive task...");
Thread thread = new Thread(() =>
{
long counter = 0;
DateTime endTime = DateTime.Now.AddSeconds(3);
while (DateTime.Now < endTime)
{
counter++;
}
Console.WriteLine($"Task completed. Count: {counter:N0}");
});
thread.Start();
thread.Join();
}
}
}
출력 예시
실행 환경에 따라 다를 수 있지만, 일반적인 출력은 다음과 같습니다:
Processor Affinity Demo
Available Logical Processors: 8
Setting affinity to use only Core 0...
Running CPU-intensive task...
Task completed. Count: 150,000,000
Setting affinity to use Core 0 and Core 1...
Running CPU-intensive task...
Task completed. Count: 250,000,000
Resetting to use all available cores...
Running CPU-intensive task...
Task completed. Count: 600,000,000
주요 포인트
- 단일 코어 제한:
- ProcessorAffinity = new IntPtr(1)은 코어 0에서만 실행됩니다.
- 멀티코어 프로세서 환경에서 일부 작업이 느려질 수 있습니다.
- 다중 코어 활성화:
- ProcessorAffinity = new IntPtr(3)은 코어 0과 코어 1에서 실행됩니다.
- 병렬 처리가 가능해져 성능이 향상될 수 있습니다.
- 모든 코어 사용:
- ProcessorAffinity = new IntPtr((1 << Environment.ProcessorCount) - 1)로 설정하면 모든 코어에서 실행됩니다.
사용 사례
- 성능 테스트: 특정 코어에서만 실행하여 작업 부하를 모니터링.
- 디버깅: 특정 코어에 제한하여 동시성 문제를 재현.
- 부하 분산: 멀티코어 환경에서 특정 코어에 작업을 고정.
위 예제를 활용하면 다양한 CPU 코어 활용 방식을 실험할 수 있습니다!
반응형
'C#' 카테고리의 다른 글
C# APM(Asynchronous Programming Model) 패턴 (1) | 2025.01.20 |
---|---|
Windows 공유 폴더 동시 연결 제한 해결 방법 (0) | 2025.01.17 |
C# `ref`와 `out` 키워드의 차이점과 활용법 (2) | 2025.01.16 |
`TimeSpan.FromSeconds` vs `Thread.Sleep`: 차이와 올바른 사용법 (1) | 2025.01.16 |
C# 람다식: 간결하고 강력한 익명 함수 이해하기 (0) | 2025.01.13 |
C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법 (1) | 2025.01.13 |
SocketException: '각 소켓 주소는 하나만 사용할 수 있습니다' 에러 원인 및 해결법 (1) | 2025.01.10 |
C# internal: 어셈블리 내 접근 제한자 (0) | 2025.01.10 |