2009-12-06 2 views
5

또는 운영 체제에서 제어합니까? Google의 새로운 Go 언어에는 프로그래머가 세분화 된 기능을 내장하거나 잘못 이해했는지 여부가 들었습니다.스레드가 실행해야하는 멀티 코어 CPU 코어를 프로그래밍 방식으로 선택하여 선택할 수 있습니까?

+2

가능할 수도 있지만, 왜 그렇게하고 싶습니까? 일반적으로 운영 체제는 사용자 공간 응용 프로그램보다 코드를 실행할 CPU에 대해 훨씬 더 나은 결정을 내릴 수 있습니다. –

+2

@ Zach 일부 알고리즘은 각 CPU의 기능을 잘 제어 할 수 있다면 실제로 더 잘 실행됩니다. 예를 들어, 롤 소유의 스핀 록을 사용하는 알고리즘은 스레드가 선점되면 매우 잘 수행되지 않으므로 각 스레드의 특정 코어에 바인딩하는 것이 가장 좋습니다. 아니면 매우 CPU 바인딩 된 물건에 대한 관련이 있다고 상상할 수 있습니다. 그건 ... 당신 말이 맞아요, 그건 종류의 틈새 물건입니다. – asveikau

+0

@asveikau 물론, 어떤 CPU를 사용하고 있어도 선매 득점 여부에 영향을주지 않습니다. NUMA 아키텍처에서 중요한 부분을 생각할 수 있습니다. 그러나 사용자 공간 프로그램이 무작위로 선택하는 것보다 더 나은 이점을 얻을 수있는 결정을 내릴 수 있을지는 의문입니다. –

답변

2

Linux OS의 경우 sched_setaffinity이 답입니다. 리눅스 커널 2.5.8부터 지원됩니다.

이름

sched_setaffinity, sched_getaffinity은 - 설정하고 프로세스의 CPU 선호도가 선호도 마스크 실제로 는 각각 독립적으로 조절 될 수있는 스레드 별 속성입니다

#define _GNU_SOURCE 
#include <sched.h> 

int sched_setaffinity( pid_t pid, 
    size_t cpusetsize, 
    cpu_set_t *mask); 

int sched_getaffinity( pid_t pid, 
    size_t cpusetsize, 
    cpu_set_t *mask); 

마스크를 얻을 스레드 그룹의 스레드는 입니다. gettid (2) 호출에서 반환 된 값 은 을 인수 pid로 전달할 수 있습니다. 0뿐만 지정 PID는 호출 한 쓰레드의 특성을 설정하며, 스레드 그룹 메인 쓰레드에 대한 속성 를 설정한다 (2) GETPID를 호출 반환 된 값을 전달. (당신이 POSIX 스레드 API를 사용하는 경우, 대신 sched_setaffinity의) pthread_setaffinity_np (3()를 사용합니다.)

3

운영 체제에 따라 결정됩니다.

pthread_attr_setaffinity_np()으로 힌트를 설정할 수 있습니다.

하지만 운영 체제가 사용자를 무시할 수 있습니다. 위의 호출은 프로그램이 OS에 제공하는 제안 일뿐입니다.

이동에 관해서는 아직 작업하지 않았거나 너무 깊이 훑어 보지 못했지만 Go에 대한 이해는 많은 병렬 처리가 다소 암묵적이라는 것입니다. 당신에게는 공동 루틴이 있습니다 (그들은 "장난"이라고 말합니다). 그것은 CPU 친 화성과 같으며 스레딩 자체의 개념은 분리되어 있습니다. 즉, 언어 런타임이 최선의 결정을 내리면 1 개의 CPU에서 모든 것을 수행하기로 결정할 수도 있습니다 ... 그러나 다시 한 번 강조하지만 너무 심하게 보지 않았으므로 잘못 될 수 있습니다. :-)

2

대답은 '예, 당신은 프로그래밍 프로세스가 실행되는 코어를 선택할 수 있습니다. 언급 된 arsane과 같이, 대답은 sched_set_affinity()와 pthread에 대한 pthread_setaffinity_np()에 있습니다. 여기

프로세스로이 작업을 수행하는 방법에 대한 nifty tutorial입니다 (this 질문에 대한 답변에서 유래한다.)

는 기본적으로,이 비트 마스크를 사용하여 수행됩니다. 즉 정수 (예 : 32 비트)가 있고 첫 번째 비트 == 1이면 해당 프로세스는 프로세서 1에서 실행될 수 있습니다. 두 번째 비트 == 1이면 해당 프로세스가 실행될 수 있습니다 프로세서 2 등.

기본적으로 선호도 비트 마스크 = 1 ... 111 (32 배). "프로세스가 프로세서 1, 2, 3, ..., 32에서 실행될 수 있습니다." 물론 코어가 2 개인 경우 추가 30 비트가 적용되지 않습니다.

그러나 비트 마스크를 0 ... 010으로 설정하면 "프로세서 2"만 해당 프로세스를 실행할 수 있습니다.

또한 리눅스에서 지원하는 프로세서가 maximum number 인 이유는 무엇입니까? (즉, x86 하드웨어를 사용하지 않고, 흔히 발견되는 하드웨어의 대부분, 클러스터링이없는 등).

관련 문제