Afinidade do processador - Processor affinity

Afinidade de processador , ou CPU pinning ou "cache affinity", permite a ligação e desacoplamento de um processo ou um thread a uma unidade de processamento central (CPU) ou um intervalo de CPUs, de modo que o processo ou thread será executado apenas na CPU designada ou CPUs em vez de qualquer CPU. Isso pode ser visto como uma modificação do algoritmo de escalonamento de fila central nativo em um sistema operacional de multiprocessamento simétrico . Cada item na fila possui uma etiqueta indicando seu processador de parentesco . No momento da alocação de recursos, cada tarefa é alocada a seu processador de parentesco de preferência a outros.

A afinidade do processador aproveita o fato de que os restos de um processo que foi executado em um determinado processador podem permanecer no estado desse processador (por exemplo, dados na memória cache ) depois que outro processo foi executado naquele processador. Agendar um processo com uso intensivo de CPU e com poucas interrupções para execução no mesmo processador pode melhorar seu desempenho, reduzindo eventos degradantes, como perda de cache , mas pode desacelerar programas comuns porque eles precisariam esperar que a CPU ficasse disponível novamente. Um exemplo prático de afinidade do processador é a execução de várias instâncias de um aplicativo não encadeado, como alguns softwares de renderização de gráficos.

As implementações do algoritmo de agendamento variam em aderência à afinidade do processador. Sob certas circunstâncias, algumas implementações permitirão que uma tarefa mude para outro processador se resultar em maior eficiência. Por exemplo, quando duas tarefas intensivas do processador (A e B) têm afinidade com um processador enquanto outro processador permanece sem uso, muitos agendadores irão mudar a tarefa B para o segundo processador a fim de maximizar o uso do processador. A tarefa B então adquirirá afinidade com o segundo processador, enquanto a tarefa A continuará a ter afinidade com o processador original.

Uso

A afinidade do processador pode reduzir efetivamente os problemas de cache, mas não reduz o problema persistente de balanceamento de carga . Observe também que a afinidade do processador se torna mais complicada em sistemas com arquiteturas não uniformes. Por exemplo, um sistema com duas CPUs hipersegmentadas de núcleo duplo apresenta um desafio para um algoritmo de escalonamento.

Há afinidade completa entre duas CPUs virtuais implementadas no mesmo núcleo via hyper-threading, afinidade parcial entre dois núcleos no mesmo processador físico (já que os núcleos compartilham algum, mas não todos, cache) e nenhuma afinidade entre processadores físicos separados. Como outros recursos também são compartilhados, a afinidade do processador sozinha não pode ser usada como base para o despacho da CPU. Se um processo foi executado recentemente em uma CPU virtual hiperencadeada em um determinado núcleo e essa CPU virtual está ocupada, mas sua CPU parceira não, a afinidade de cache sugere que o processo deve ser despachado para a CPU parceira ociosa. No entanto, as duas CPUs virtuais competem por essencialmente todos os recursos de computação, cache e memória. Nessa situação, normalmente seria mais eficiente despachar o processo para um núcleo ou CPU diferente, se houver um disponível. Isso poderia resultar em uma penalidade quando o processo preenchesse novamente o cache, mas o desempenho geral poderia ser superior, pois o processo não teria que competir por recursos dentro da CPU.

Sistemas operacionais específicos

No Linux , a afinidade de CPU de um processo pode ser alterada com o programa taskset (1) e a chamada do sistema sched_setaffinity (2). A afinidade de um thread pode ser alterada com uma das funções da biblioteca: pthread_setaffinity_np (3) ou pthread_attr_setaffinity_np (3).

Em sistemas SGI , dplace vincula um processo a um conjunto de CPUs.

No DragonFly BSD 1.9 (2007) e versões posteriores, a chamada de sistema usched_set pode ser usada para controlar a afinidade de um processo. No NetBSD 5.0, FreeBSD 7.2, DragonFly BSD 4.7 e versões posteriores podem usar pthread_setaffinity_np e pthread_getaffinity_np. No NetBSD , o utilitário psrset para definir uma afinidade de thread para um determinado conjunto de CPU. No FreeBSD , o utilitário cpuset é usado para criar conjuntos de CPU e atribuir processos a esses conjuntos. No DragonFly BSD 3.1 (2012) e posterior, o utilitário usched pode ser usado para atribuir processos a um determinado conjunto de CPU.

No Windows NT e seus sucessores, as afinidades de CPU de thread e processo podem ser definidas separadamente usando chamadas de API SetThreadAffinityMask e SetProcessAffinityMask ou por meio da interface do Gerenciador de Tarefas (apenas para afinidade de processo).

O macOS expõe uma API de afinidade que fornece dicas ao kernel sobre como agendar threads de acordo com os conjuntos de afinidade.

No Solaris , é possível controlar ligações de processos e LWPs ao processador usando o programa pbind (1). Para controlar a afinidade programaticamente, pode-se usar o processador_bind (2). Existem interfaces mais genéricas disponíveis, como pset_bind (2) ou lgrp_affinity_get (3LGRP) usando conceitos de conjunto de processadores e grupos de localidade.

No AIX , é possível controlar ligações de processos usando o comando bindprocessor e a API bindprocessor.

Veja também

Referências