Por que o modelo de preempção do Linux não pode ser alterado pelo parâmetro do kernel? [fechadas]

0

O kernel do Linux tem um grande conjunto de parâmetros que permitem aos usuários ajustar o comportamento do kernel sem recompilá-lo. Não parece haver um parâmetro para ajustar o modelo de preempção:

-*- Preemption Model
            No Forced Preemption (Server) (PREEMPT_NONE)
        --> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
            Preemptible Kernel (Low-Latency Desktop) (PREEMPT)

Por que os desenvolvedores do kernel não adicionaram um switch para escolher entre eles?

    
por Rfraile 28.08.2018 / 14:59

1 resposta

3

A preempção é implementada usando um número (grande) de pontos de preempção explícitos (procure might_sleep no kernel), muitos dos quais estão em caminhos um pouco quentes. A preempção total ( CONFIG_PREEMPT ) tem um impacto ainda maior; por exemplo, os spinlocks verificam a contagem de preempção (pelo menos, em kernels não-SMP), assim como os IRQs.

Atualmente, o modelo de preempção escolhido é aplicado em tempo de compilação; Como resultado, sem preempção forçada, nenhum código de preempção sobrevive no kernel e você obtém o máximo rendimento. Da mesma forma, um kernel de preempção voluntária não tem nenhuma verificação de preempção no IRQ e nos pontos de entrada do kernel. Alterar isso para que a preempção possa ser alterada em tempo de execução significaria que todas as configurações teriam que verificar a configuração de preempção, pelo menos na inicialização, e sofrer algum custo, mesmo no melhor caso (por exemplo, mesmo se a preempção era uma configuração de tempo de inicialização, e a configuração de “sem preempção” poderia remendar os sites de chamadas relevantes, você ainda terminaria com código de nada ocupando espaço precioso em caches de código).

    
por 28.08.2018 / 16:46