2013-06-19 3 views
1

, 여기 내 첫 번째 포트에 시험설정 CPU 선호도 리눅스

#include<sched.h> 

void task_set(int pid) { 
     int result; 
     cpu_set_t mask; 
     CPU_ZERO(&mask); 
     CPU_SET(pid, &mask); 
     result = sched_setaffinity(0, sizeof(mask), &mask); 
     printf ("%d\n",result); 
} 

void main() 
{ //excuse me for the static 
task_set(1400); 
} 

아래 프로그램에 대한 크레딧 Alnitak에 C와 파이썬에서 프로그램으로 C 프로그래밍에서 최고되지 않음 내가 이런 짓을 컴파일 ..

gcc -D_GNU_SOURCE -o test test.c 

을하지만, 난 다시 가서 프로그램은 다음 스크립트를 사용하여 실행 위치를 확인하려고하면

def which_core(pid): 
     f = file(os.path.join('/proc', str(fpid), 'stat'), 'rb') 
     val = f.read() 
     f.close() 
     return int(val.split(' ')[-6]) 
print 'core_id',which_core(1400) 
을 그것은이 매우 혼란

core_id 32997376 

... 실수가 무엇 :

그것은 나에게 다음과 같은 출력을 제공합니다?

+0

fpid가 오타입니까? 함수 인수가 pid가 아니어야합니까? –

+0

예, 제가 한 실수였습니다. – pistal

답변

2

확인. 이것은 지금까지 할 수있는 가장 바보 같은 일입니다!

CPU_SET(pid, &mask); 

    CPU_SET(coreid, &mask); 

coreid으로 변경하면됩니다.

다른 실수는 여기에 있었다 :

result = sched_setaffinity(pid, sizeof(mask), &mask); 
0

당신은 아마 마지막으로 실행 (1부터 계산) 필드 (39)

프로세서 % d 개 (이후 리눅스 2.2.8) CPU 번호를 찾고 에. (man proc에서)

(편집 : 결국 -6 = 39처럼 보이는, 미안 그 - P 몰래 경우) /proc/[pid]/stat 파일을 구문 분석

+0

제 커널 버전은'3.7.10-1.11-desktop'입니다. 따라서 그 값은 정확합니다. 그게 내 초기 의심 이었어. 내가 얻는 결과 값은'-1'입니다. – pistal

0

을 조금 까다 롭습니다 당신 때문에 파일 이름에 공백과 괄호를 포함 할 수 있습니다. 이들은 어떤 식 으로든 이 아니며이 아닙니다.

는 진짜 효과를 볼 수있는 올바른 절차가 pid, 프로세스 ID로 " ("의 첫 번째 항목을 포함하지 최대하지만 모든 것을 걸릴 것입니다

cp /bin/cat ') fake (' && './) fake (' < /proc/self/stat && rm -f ') fake (' 

실행합니다. 의 마지막 부분 인까지는 ") "이 나오지만 실행 가능한 프로세스의 파일 이름은 comm입니다. (다른 필드는 문자열 유형이므로 파일의 다른 곳에는 괄호가 없어야합니다.) 다음 필드는 모두 공백으로 구분되며 /proc/[pid]/stat에 나열된 man 5 proc에 나열됩니다. 프로세서는 comm 또는 전체 39 번째 필드 다음 37 번째 필드입니다. (우분투 3.8.0-25- 일반 x86-64에서, 필드는 끝에서부터 6 번째가 아니라 14 번째입니다.하지만 새로운 필드가 항상 끝에 추가 될 수 있기 때문에 변경 될 수 있습니다.)

리눅스 2.6.26 이상 (모든 3.xy 버전 이상 포함)으로 자신을 제한하는 경우 Cpus_allowed_list: 줄을 /proc/[pid]/status 대신 볼 수 있습니다.구문 분석이 더 쉽고 프로세스가 마지막으로 실행 된 CPU (의 processor 필드가 설명 됨)가 아닌 프로세스를 실행할 수있는 코어를 커널에 알려줍니다.

희망이 도움이됩니다.

관련 문제