Seguinte, estou querendo fazer com que a thread principal de um
programa Linux temporariamente execute apenas quando o processador
estiver em idle (ou pelo menos só quando minhas threads de mais alta
prioridade não estiverem rodando).
Minha primeira tentativa foi mudar o sched policy das minhas threads
para SCHED_RR e dar prioridade 1 para todas.
Neste caso, esperava que a thread principal (que a princípio seria
SCHED_OTHER) só rodasse quando as outras estivessem bloqueadas. Mas a
filha da mãe continua sendo agendada e roubando CPU das threads
prioritárias. Depois tentei mudar o sched
policy da thread principal e dar prioridade 1, e, para as outras mais
importantes, prioridade 2. Mesma coisa.
Abaixo o trecho de código da minha segunda tentativa:
pthread_attr_t attr;
struct sched_param param, default_param;
int policy;
pthread_attr_init(&attr);
ASSERT(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0);
ASSERT(pthread_attr_setschedpolicy(&attr, SCHED_RR) == 0);
ASSERT(pthread_attr_getschedparam(&attr, ¶m) == 0);
param.sched_priority = 2;
ASSERT(pthread_attr_setschedparam(&attr, ¶m) == 0);
ASSERT(pthread_getschedparam(pthread_self(), &policy, ¶m) == 0);
default_param = param;
param.sched_priority = 1;
ASSERT(pthread_setschedparam(pthread_self(), SCHED_RR, ¶m) == 0);
ASSERT(pthread_create(&thread, &attr, thrd_Initialize, this) == 0);
Alguém por acaso sabe o que está errado no meu conceito?
Obrigado pela ajuda que eu sei que virá (com muita fé, irmão), rsrsrsrsrsrs
Wander
O que você precisa fazer é usar signals/mutex/conditions/etc para fazer isso.
Faça uma thread ficar em sleep esperando uma condição que será atingida quando
todas as outras threads sinalizarem.
Veja se o que está em 'man 2 sched_setscheduler' corresponde ao que você leu.
O que você precisa fazer é usar signals/mutex/conditions/etc para fazer isso.
Faça uma thread ficar em sleep esperando uma condição que será atingida quando
todas as outras threads sinalizarem.
Na verdade a thread principal nao bloqueia, apenas as atividades das
outras threads sao mais prioritarias.
Atualmente, a thread principal voltar a rodar quando todas as outras
finalizam seus trabalhos. Mas neste meio
tempo, existe CPU ociosa quando todas as threads estao esperando I/O.
Eu queria usar esse periodo ocioso
na thread principal, mas sem roubar CPU das threads mais prioritarias,
para otimizar o tempo de inicializacao do
programa.
O cenário parece simples.
O requisito é: o escalonador deve entregar um timeslice a um thread de
baixa prioridade apenas se, e somente se, não houver uma thread de
alta prioridade competindo por timeslices.
--
P.
O que estou fazendo eh uma otimizacao do produto (muito importante por
sinal), em cima de
uma arquitetura que ja existe, nao existe problemas de design, mas
estou tentando expremer um pouco
mais o limao pra ver se sai mais caldo.
Eu nao posso ficar detalhando
muito porque os caras da empresa
sao muito chatos (eu mesmo nao veria problema em abrir o que estou
fazendo, mas nao sou o dono
da empresa).