본문 바로가기
C#

ProcessorAffinity로 CPU 코어 활용 제어하기

by 공부봇 2025. 1. 14.
반응형

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 모두를 사용합니다.

코드 설명

  1. Process.GetCurrentProcess():
    • 현재 실행 중인 프로세스에 대한 정보를 가져옵니다.
  2. ProcessorAffinity:
    • 프로세스가 실행될 수 있는 CPU 코어를 비트마스크로 설정합니다.
  3. 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

주요 포인트

  1. 단일 코어 제한:
    • ProcessorAffinity = new IntPtr(1)은 코어 0에서만 실행됩니다.
    • 멀티코어 프로세서 환경에서 일부 작업이 느려질 수 있습니다.
  2. 다중 코어 활성화:
    • ProcessorAffinity = new IntPtr(3)은 코어 0과 코어 1에서 실행됩니다.
    • 병렬 처리가 가능해져 성능이 향상될 수 있습니다.
  3. 모든 코어 사용:
    • ProcessorAffinity = new IntPtr((1 << Environment.ProcessorCount) - 1)로 설정하면 모든 코어에서 실행됩니다.

사용 사례

  • 성능 테스트: 특정 코어에서만 실행하여 작업 부하를 모니터링.
  • 디버깅: 특정 코어에 제한하여 동시성 문제를 재현.
  • 부하 분산: 멀티코어 환경에서 특정 코어에 작업을 고정.

위 예제를 활용하면 다양한 CPU 코어 활용 방식을 실험할 수 있습니다!

반응형