임베디드 시스템 (glibc 2.6.1을 사용하는 ARM 프로세서의 Linux 커널 2.6.28)에서 여러 스레드로 구성된 응용 프로그램을 실행하고 있습니다. 나는 그 스레드 중 하나가 다른 스레드보다 더 많은 CPU 시간을 갖길 원합니다.pthreads에 대한 Nice-Level?
는 우선 순위를 설정하기위한 하나의 옵션이_RR
(또는
_FIFO
\
SCHED
) \
SCHED
와
_setschedparam
\
pthread
를 사용하는 것 같다
그러나 이것은 잠들지 않는 한, 그것의 동료로부터 멀리 모든 CPU를 먹고 (스레드 꽤 너무 많은 CPU를 제공합니다 스레드는 여전히 SCHED_OTHER
을 사용하고 있습니다).
또 다른 옵션은 스레드의 멋진 수준을 설정하는 것입니다. 그러나 이것은 정확히 내가 뭘 찾고 있었을까요 (스레드가 조금 더 많은 CPU를 갖지만 다른 스레드는 굶주릴 수는 없습니다), 제대로 작동하지 못합니다. 맨 페이지에 따르면 "스레드는 공통된 좋은 값을 공유하지 않습니다"라고 해석합니다. 동일한 프로세스에서 서로 다른 스레드에 개별 값을 설정할 수 있습니다. 그것은 그 TID를 보인다 그러나
pid_t tid;
tid = syscall(SYS_gettid);
int ret = setpriority(PRIO_PROCESS, tid, priority);
모든 스레드 사이에서 동일합니다
여기 내 코드입니다. 또한 스레드에 대한 개별 nice 수준을 설정하면 getpriority
을 호출 할 때 모든 스레드에서 최신 집합 nice 수준을 반환합니다. 일관된 성능 (즉, 동일한 작업으로 스레드 A와 스레드 B를 실행 한 다음 A를 -19로 설정하고 B를 19로 설정하면 거의 동일한 시간이 완료 됨).
그러나 스레드 A를 실행하면 -19로 설정 한 다음 B를 실행하고 +19로 설정하면 B가 최대 전력으로 실행됩니다 (A보다 앞쪽 끝).
그래서 스레드가 이후에 변경하지 않고 실행될 때 설정된 멋진 수준을 사용하는 것처럼 보입니다.
나는 더 많은 정보 또는 모든 종류의 확인을 위해 미친 듯이 봤지만 지금까지 발견 한 것은 다소 모호합니다. 여기 누가 리눅스 용 스레드 (2.6.28, glibc 2.6.1)를 처리하는지에 대한 설명이 있습니까? 그리고 이미 실행중인 스레드의 수준을 어떻게 바꿀 수 있을까요?
나는 이것이 파티에 조금 늦다는 것을 알고 있지만, 내가하려고하는 일을하려고하는 것처럼 보이고, Google 검색을 통해 여기에 왔다고 생각하면, 다른 사람들도 마찬가지 일 수 있습니다. 스레드를 어떻게 작성했는지 알고 싶습니까? pthreads에 따르면, 그들은 NTPL 스레드로 만들면 모든 스레드가 동일한 우선 순위를 공유해야한다고 말합니다. –