2009-05-23 5 views
12

임베디드 시스템 (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)를 처리하는지에 대한 설명이 있습니까? 그리고 이미 실행중인 스레드의 수준을 어떻게 바꿀 수 있을까요?

+0

나는 이것이 파티에 조금 늦다는 것을 알고 있지만, 내가하려고하는 일을하려고하는 것처럼 보이고, Google 검색을 통해 여기에 왔다고 생각하면, 다른 사람들도 마찬가지 일 수 있습니다. 스레드를 어떻게 작성했는지 알고 싶습니까? pthreads에 따르면, 그들은 NTPL 스레드로 만들면 모든 스레드가 동일한 우선 순위를 공유해야한다고 말합니다. –

답변

5

Errm,이 질문을 게시 한 후에 갑자기 실수를 깨달았습니다. 기본 스레드에서 함수를 호출하여 좋은 수준으로 설정 했으므로 물론 모든 스레드 ID가 동일합니다 (컨텍스트에서 실행 됨). 메인 스레드). DOH !!!!

올바른 tid를 사용하면 모든 것이 정상적으로 작동합니다.

지금이 질문을 어떻게 삭제합니까?

+0

나는 그것을 그대로 두는 것이 좋다고 생각한다, 스티븐. 나는 사람들이 이미 그것을 닫았거나 그것을 downvote했을 것 같아요. –

+0

지금부터 충분한 담당자가 없으므로 자신의 질문을 삭제할 수 없습니다. faq를 참조하십시오. –