O que é roubo de trabalho?

click fraud protection

Os computadores modernos têm vários núcleos de processamento. Supondo que haja processamento suficiente para que cada núcleo possa permanecer continuamente ocupado. eles receberão uma fila de itens de trabalho computacional. Ou encadeamentos a serem concluídos pelo agendador.

Durante a execução desses encadeamentos, é possível gerar novos encadeamentos ou itens de trabalho. Estes são threads separados que podem ser processados ​​simultaneamente. Eles podem precisar enviar os resultados de volta aos programas de desova ou permanecer completamente separados indefinidamente. Normalmente, esses threads filho são atribuídos ao mesmo núcleo de processamento que o pai.

Tudo isso pressupõe que todos os núcleos sejam mantidos ocupados. Isso acontecerá se nenhum encadeamento terminar ou novos encadeamentos forem gerados na mesma taxa ou mais rápido do que os encadeamentos existentes terminam. No mundo real, porém, a carga de trabalho de longo prazo raramente é tão simples, especialmente em dispositivos de computação do usuário final. Eventualmente, um núcleo de processamento provavelmente concluirá todas as tarefas atribuídas. Quando isso acontece, em vez de ficar ocioso e desperdiçar o desempenho potencial, ele verifica as filas de trabalho dos outros núcleos de processamento e rouba um item de trabalho deles.

Benefícios e Desvantagens

O roubo de trabalho significa que um núcleo de processamento ocioso procurará ativamente o trabalho para que ele seja concluído. Isso evita que uma fração potencialmente grande do processador geral fique ociosa, o que é útil. O roubo de trabalho pode ter alguns custos, no entanto. Por exemplo, o novo núcleo de processamento provavelmente terá que carregar quaisquer dados relevantes em sua memória cache.

Isso pode levar tempo, especialmente se tiver que ser solicitado da RAM do sistema em vez de ser atendido por uma camada de cache compartilhada. É possível que o processador original pudesse retomar esse item de trabalho nesse período de tempo, levando a uma execução geral mais rápida. Isso pode acontecer até mesmo se o núcleo de processamento do qual o item de trabalho foi roubado nunca tiver começado a processá-lo. Alguns valores armazenados em cache podem ser idênticos entre threads pai e filho.

Implementações

Várias linguagens de programação têm tempos de execução que podem agendar o trabalho diretamente em processadores dedicados. Por exemplo, a linguagem de programação Cilk, o runtime Rust Tokio e a .Net Task Parallel Library podem fazer isso. Alternativamente, o sistema operacional pode ser responsável por programar o tempo real do processador. Com o programa, basta adicionar tarefas a um conjunto de “threads de trabalho”, que são agendados pelo sistema operacional.

Isso acontece em sistemas onde o programa não tem acesso direto dedicado aos núcleos de processamento, mas deve compartilhar o acesso com outros processos. Cuidado extra deve ser tomado neste cenário para garantir que um encadeamento não seja roubado repetidamente enquanto fica ocioso.

Existem várias abordagens de como os itens de trabalho são selecionados para serem roubados. No conceito original, a abordagem era escolher outro núcleo aleatório. Se tiver um ou mais itens de trabalho em sua fila, pegue o último. Dependendo da preferência de um processo filho ser executado imediatamente pelo processador de origem. Ou, se for enviado para a fila do processador e o processo pai continuar a ser executado, o encadeamento pai ou filho será roubado.

Tudo pode ser resumido como Work Stealing, uma técnica de balanceamento de carga que garante que a carga de palavras seja distribuída uniformemente entre os processadores disponíveis. Dessa forma, todos os processadores estão fazendo algo para ajudar.

Conclusão

O roubo de trabalho é um processo que acontece automaticamente em CPUs multicore. Cada núcleo tem uma fila de tarefas a serem executadas. Quando um processador conclui suas tarefas, ele rouba outra tarefa da fila de outro núcleo de processamento. Isso ajuda a evitar que o processador tenha alguns núcleos ociosos enquanto outros ainda têm uma fila de tarefas a serem executadas.