Tuesday, April 8, 2008

Processor Affinity

SMP 같이 여러 프로세서를 사용하는 경우, 프로세서를 바꿀 때 마다 cache 효과가 사라지는 단점이 있다. (오늘날의 SMP에서는 프로세서간에 Cache 접근이 가능하도록 인텔에서 설계하나, 커널 단에서 이를 고려하고 있는지는 모르겠다.) 그래서 스케쥴러는 되도록 이면 특정 프로세스를 특정 프로세서에서 동작시켜려고 하는 경향이 있는데 이를 'soft affinity' 라고 한다. 이 경향은 프로세서가 아주 imbalance해질 때 풀어지는데, 코드 상에서 특정 프로세서에서만 실행되도록 한다면 이는 'hard affinity' 가 된다. 몇개의 매크로와 sched_setaffinity(), sched_getaffinity()를 사용하여 hard affinity를 줄 수 있는데, 귀찮다... 소스하나만 보고 가자.

cpu_set_t set;
int ret, i;

CPU_ZERO (&set);
CPU_SET (0, &set); // CPU0을 선택
CPU_CLR (1, &set); // CPU1을 배제
// 첫째 인자는 pid
ret = sched_setaffinity(0, sizeof(cpu_set_t), &set);

// 이제 출력해 보면,
// (CPU_SETSIZE는 한 프로세서가 최대로
// 가질 수 있는 프로세서 수이다.)
for (i=0; i<CPU_SETSIZE; i++)
{
int cpu;
cpu = CPI_ISSET(i, &set);
printf ("cpu=%i is %s\n", i,
cpu ? "set" : "unset");
}

No comments:

Post a Comment