O que é uma thread estacionada no contexto do kernel Linux? Uma thread que está em TASK_PARKED
estado?
Como esse estado difere de TASK_INTERRUPTIBLE
e TASK_UNINTERRUPTIBLE
?
De qual estado uma thread pode ser despertada mais rapidamente? Geralmente, e em casos específicos, se usada para espera: kthread_parkme / kthread_unpark
em vez de [s]wait_event_... / [s]wake_up_...]
?
Sei que as filas de espera aceitam vários garçons, mas estou interessado apenas em um único par de pessoas dormindo/acordando.
O estacionamento da CPU é um recurso de economia de energia que permite desligar um núcleo de CPU ocioso, interrompendo o consumo de energia. Quando a CPU volta a ser demandada, ela é desestacionada.
Antes que uma CPU possa ser estacionada, todas as threads nela presentes devem ser desvinculadas da CPU ou estacionadas. Presumivelmente, se a CPU for estacionada, outras CPUs estarão disponíveis e ociosas, permitindo que threads em execução sejam desvinculadas do núcleo da CPU e movidas para outros núcleos. Mas se uma thread também estiver ociosa (possivelmente aguardando a conclusão de E/S, um timeout ou uma thread do kernel apenas aguardando trabalho), em vez de realizar a custosa operação de desvincular uma thread e movê-la para outro núcleo, ela também pode ser estacionada.
Quando o kernel estaciona uma thread, ele a desperta e a instrui a estacionar. Uma thread do kernel tem a chance de fazer qualquer limpeza que desejar, incluindo a liberação de recursos que poderiam causar um deadlock, e então chama o método parkme, que lida com algumas condições de corrida e marca a thread como estacionada. Assim que todas as threads de um núcleo forem migradas ou estacionadas, o kernel pode estacionar a CPU.
Presumivelmente, desestacionar um thread (e a CPU em que ele está) seria mais rápido do que esperar para ser agendado em uma CPU ocupada ou vinculá-lo a outra CPU já ociosa (que poderia estar estacionada de qualquer maneira).
Observe que alguns threads especiais do kernel são dedicados ao núcleo ao qual estão vinculados, portanto, sempre seriam estacionados em vez de desvinculados.