검색 과정, 닫기.
사실 처음에는 절망적이였던게 사실이다. 참고 사이트 : http://kltp.kldp.org/eunjea/smp/x42.html
일반적인 커널 아니요 & 네. 프로세스들을 특정 CPU 위에서 실행하게 하는 길은 없습니다. 그러나 리눅스 스케쥴러는 각 과정들을 위해 프로세서 성향을 가집니다. 그것은 프로세스들을 특정 CPU들에 연결시키게 하는 경향이 있습니다. OTL;
참고 사이트 :
http://kldp.org/node/23107
(위 링크의 답변 중 인용) SMP(대칭형 다중 처리)방식에서는 임의의 CPU에 작업을 할당할 수 없는 것으로 알고 있습니다. 어느 프로세서에게 프로세스를 할당할지는 오로지 커널이 결정할 일입니다.OTL;;
참고 사이트 :
http://www.ibm.com/developerworks/kr/forums/dw_thread.jsp?message=3068&cat=5&thread=1933&treeDisplayType=threadmode1&forum=8#3068
(위 링크의 답변 인용) 리눅스에서는 불가능한 것으로 알고 있습니다.OTL;;;
하지만 뜻이 있는 곳에 길도 있을.. 까?
참고 사이트 :
http://bebop.emstone.com/research/linux/programming_linux26/
(위에서 인용) CPU Affinity
CPU가 여러 개인 기계에서는 하나의 프로세스가 여러 CPU를 통해서 수행이 된다.
명시적으로 특정 프로세스를 특정 CPU에서 수행되게 하는 것.
장점
CPU 캐쉬 Hit 비율을 증가 시킨다.
NUMA (non-uniform memory access) 시스템에서의 성능 향상
다루기 힘든 프로세스 처리
자원 집중적인 프로세스를 특정 프로세서에 집중 시켜 다른 프로세스를 가용하게 만듬.
sched_setaffinity(), sched_getaffinity() 저거다!
물론, 위의 내용에 의하면 Linux Kernel 2.6에서부터 추가된 system call 이다. 즉, 그 이전의 Kernel에서는 지원하지 않는다.
(그러니까 불가능하다고 서술된 문서들은 그 문서가 서술된 시점에서 보면 틀린 말이 아니였던 것이다.) 그리고 다음에서 샘플 소스를 발견.
참고 사이트 :
http://www.ibm.com/developerworks/kr/library/l-pow-oprofile/ 그리고, 테스트용 샘플 제작.
(아래 샘플의 함수는 호출한 해당 프로세스를 0번 CPU만 제외한 다른 CPU를 점유하도록 유도하는 샘플임.)
#include <sched.h> #define __MAX_CPU 16 int prevent_cpu_0(void) { cpu_set_t cmask; unsigned long len = sizeof(cmask); int i; __CPU_ZERO(&cmask); for (i = 1; i < __MAX_CPU; i++) { __CPU_SET(i, &cmask); } if (sched_setaffinity(0, len, &cmask)) { return -1; } return 0; } __MAX_CPU는 임의로 정한 값이며, 원하는 대로 바꿔주어도 상관 없다.
그리고, 잘된다!
검색 과정, 닫기. 이상.