프로세서 선호도

컴퓨터 과학에서 **프로세서 선호도**(processor affinity)는 **CPU 피닝**(CPU pinning) 또는 **캐시 선호도**(cache affinity)라고도 불리며, 프로세스 또는 스레드를 특정 CPU 또는 CPU 범위에 바인딩(binding) 및 언바인딩(unbinding)하여, 해당 프로세스 또는 스레드가 다른 어떤 CPU가 아닌 지정된 CPU에서만 실행되도록 하는 기능이다. 이는 대칭형 다중 처리 운영 체제의 기본 중앙 큐 스케줄링 알고리즘을 수정한 것으로 볼 수 있다. 큐의 각 항목에는 관련 프로세서를 나타내는 태그가 있다. 자원 할당 시 각 작업은 다른 프로세서보다 관련 프로세서에 우선적으로 할당된다. 프로세서 선호도는 특정 프로세서에서 실행되었던 프로세스의 잔여물(예: CPU 캐시의 데이터)이 다른 프로세서가 실행된 후에도 해당 프로세서의 상태에 남아 있을 수 있다는 사실을 활용한다. 인터럽트가 적은 CPU 집약적 프로세스를 동일한 프로세서에서 실행하도록 스케줄링하면 캐시 미스와 같은 성능 저하 이벤트를 줄여 성능을 향상시킬 수 있지만, 일반 프로그램은 해당 CPU가 다시 사용 가능해질 때까지 기다려야 하므로 속도가 느려질 수 있다.access-date=2021-06-08 프로세서 선호도의 실용적인 예는 일부 그래픽 렌더링 소프트웨어와 같이 스레드를 사용하지 않는 애플리케이션의 여러 인스턴스를 실행하는 것이다. 스케줄링 알고리즘 구현은 프로세서 선호도에 대한 준수 여부가 다양하다. 특정 상황에서 일부 구현은 효율성이 높아진다면 작업이 다른 프로세서로 변경되는 것을 허용한다. 예를 들어, 두 개의 프로세서 집약적 작업(A와 B)이 하나의 프로세서에 선호도를 가지고 있고 다른 프로세서가 사용되지 않는 경우, 많은 스케줄러는 프로세서 사용을 극대화하기 위해 작업 B를 두 번째 프로세서로 옮길 것이다. 그러면 작업 B는 두 번째 프로세서에 대한 선호도를 얻게 되고, 작업 A는 원래 프로세서에 대한 선호도를 계속 유지하게 된다.
# 사용법
프로세서 선호도는 캐시 문제를 효과적으로 줄일 수 있지만, 지속적인 부하분산 문제를 줄이지는 못한다."White Paper - Processor Affinity" - From tmurgent.com. Accessed 2007-07-06. 또한 비균일 아키텍처를 가진 시스템에서는 프로세서 선호도가 더 복잡해진다는 점을 명심해야 한다. 예를 들어, 두 개의 듀얼 코어 하이퍼스레드 CPU를 가진 시스템은 스케줄링 알고리즘에 어려움을 준다. 하이퍼스레딩을 통해 동일한 코어에 구현된 두 가상 CPU 사이에는 완전한 선호도가 존재하고, 동일한 물리적 프로세서 내의 두 코어 사이에는 부분적인 선호도(코어들이 일부 캐시를 공유하지만 전부는 아님)가 존재하며, 별개의 물리적 프로세서 사이에는 선호도가 존재하지 않는다. 다른 자원들도 공유되기 때문에 프로세서 선호도만으로 CPU 디스패치의 근거로 사용될 수는 없다. 만약 프로세스가 주어진 코어 내의 한 가상 하이퍼스레드 CPU에서 최근에 실행되었고, 그 가상 CPU가 현재 사용 중이지만 그 파트너 CPU가 사용 가능할 경우, 캐시 선호도는 해당 프로세스가 유휴 파트너 CPU로 디스패치되어야 한다고 제안할 것이다. 그러나 두 가상 CPU는 사실상 모든 컴퓨팅, 캐시, 메모리 자원을 놓고 경쟁한다. 이러한 상황에서는 사용 가능한 다른 코어나 CPU로 프로세스를 디스패치하는 것이 일반적으로 더 효율적일 수 있다. 이 경우 프로세스가 캐시를 다시 채울 때 페널티가 발생할 수 있지만, 프로세스가 CPU 내에서 자원 경쟁을 할 필요가 없으므로 전반적인 성능은 더 높아질 수 있다.
# 특정 운영 체제
리눅스에서는 taskset(1) 프로그램Linux과 sched_setaffinity(2) 시스템 호출을 사용하여 프로세스의 CPU 선호도를 변경할 수 있다. 스레드의 선호도는 pthread_setaffinity_np(3) 또는 pthread_attr_setaffinity_np(3) 라이브러리 함수 중 하나를 사용하여 변경할 수 있다. SGI 시스템에서 dplace는 프로세스를 CPU 세트에 바인딩한다.dplace.1 date=2007-07-01 - From sgi.com. Accessed 2007-07-06. DragonFly BSD 1.9 (2007년) 및 이후 버전에서는 usched_set 시스템 호출을 사용하여 프로세스의 선호도를 제어할 수 있다.access-date= 2019-07-28access-date= 2019-07-28 NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 및 이후 버전에서는 pthread_setaffinity_np와 pthread_getaffinity_np를 사용할 수 있다.`pthread_setaffinity_np(3)` – NetBSD, FreeBSD and DragonFly BSD Library Functions Manual NetBSD에서는 psrset 유틸리티NetBSD를 사용하여 스레드의 선호도를 특정 CPU 세트로 설정한다. FreeBSD에서는 cpusetFreeBSD 유틸리티를 사용하여 CPU 세트를 생성하고 프로세스를 이 세트에 할당한다. DragonFly BSD 3.1 (2012년) 및 이후 버전에서는 usched 유틸리티를 사용하여 프로세스를 특정 CPU 세트에 할당할 수 있다.access-date= 2019-07-28 윈도우 NT 및 그 후속 버전에서는 SetThreadAffinityMaskSetThreadAffinityMask - MSDN 라이브러리 및 SetProcessAffinityMaskSetProcessAffinityMask - MSDN 라이브러리 API 호출 또는 작업 관리자 인터페이스(프로세스 선호도에만 해당)를 통해 스레드 및 프로세스 CPU 선호도를 개별적으로 설정할 수 있다. MacOS는 선호도 APIwebsite=Developer.apple.com를 노출하여 커널에 선호도 세트에 따라 스레드를 스케줄링하는 방법에 대한 힌트를 제공한다. 솔라리스에서는 pbind(1)pbind(1M) - Solaris man page 프로그램을 사용하여 프로세스 및 LWP의 프로세서 바인딩을 제어할 수 있다. 프로그래밍 방식으로 선호도를 제어하려면 processor_bind(2)processor_bind(2) - Solaris man page를 사용할 수 있다. 프로세서 세트 및 지역성 그룹 개념을 사용하는 pset_bind(2)pset_bind(2) - Oracle Solaris 11.1 Information Library - man pages section 2 또는 lgrp_affinity_get(3LGRP)lgrp_affinity_get(3LGRP) - Memory and Thread Placement Optimization Developer's Guide와 같은 더 일반적인 인터페이스도 있다. AIX에서는 bindprocessor 명령date=November 16, 2006website=IBM과 bindprocessor APIwebsite=IBM를 사용하여 프로세스 바인딩을 제어할 수 있다.