De acordo com Agendando prioridades no MSDN :
Threads are scheduled to run based on their scheduling priority. Each thread is assigned a scheduling priority. The priority levels range from zero (lowest priority) to 31 (highest priority). Only the zero-page thread can have a priority of zero. (The zero-page thread is a system thread responsible for zeroing any free pages when there are no other threads that need to run.)
The system treats all threads with the same priority as equal. The system assigns time slices in a round-robin fashion to all threads with the highest priority. If none of these threads are ready to run, the system assigns time slices in a round-robin fashion to all threads with the next highest priority. If a higher-priority thread becomes available to run, the system ceases to execute the lower-priority thread (without allowing it to finish using its time slice), and assigns a full time slice to the higher-priority thread. The priority of each thread is determined by the following criteria:
- The priority class of its process
- The priority level of the thread within the priority class of its process
Acredito que esse agendador de threads descreve um algoritmo chamado fila multinível , que é um algoritmo de agendamento muito mais simples do que a fila de feedback multinível . Observe que o agendador de processo do Windows usa a fila de feedback multinível , de acordo com Wikipedia . Desde o Windows 7 e Windows Server 2008 R2, há também User-Mode Scheduling que permite que os processos gerenciem seus próprios agendamentos de threads.
Como mencionado por outros, o Linux trata processos e encadeamentos da perspectiva do agendamento. O agendamento de processos / threads no Linux é configurável, existem vários algoritmos de agendamento e alguns podem ser configurados recompilando o kernel:
- Um agendador O (n) era padrão em 2.4
- Um planejador O (1) era o padrão em 2.6 antes de 2.6.23
- Completely Fair Scheduler é o agendador padrão desde 2.6.23 em diante
- O Brain Fuck Scheduler é um agendador de terceiros disponível como um conjunto de patches
- O mais antigo programador de prazo final está disponível desde a versão 3.14 projetada para carga de trabalho em tempo real
Observe que o padrão acima significa padrão no kernel vanilla. Algumas distribuições são fornecidas com um kernel padrão que é pré-configurado para usar um agendador padrão diferente.
Além do algoritmo de agendamento, há também políticas do agendador : SCHED_FIFO, SCHED_BATCH, SCHED_IDLE, SCHED_OTHER e SCHED_RR; que pode ser alterado em tempo de execução, que descreve o tipo de carga de trabalho que um processo possui.
O agendador padrão atual Completely Fair Scheduler, usa uma árvore vermelha e preta para manter a integridade do agendamento. De Dentro do Linux 2.6 Completely Fair Scheduler :
The main idea behind the CFS is to maintain balance (fairness) in providing processor time to tasks. This means processes should be given a fair amount of the processor. When the time for tasks is out of balance (meaning that one or more tasks are not given a fair amount of time relative to others), then those out-of-balance tasks should be given time to execute.
To determine the balance, the CFS maintains the amount of time provided to a given task in what's called the virtual runtime. The smaller a task's virtual runtime—meaning the smaller amount of time a task has been permitted access to the processor—the higher its need for the processor. The CFS also includes the concept of sleeper fairness to ensure that tasks that are not currently runnable (for example, waiting for I/O) receive a comparable share of the processor when they eventually need it.
But rather than maintain the tasks in a run queue, as has been done in prior Linux schedulers, the CFS maintains a time-ordered red-black tree (see Figure 1). A red-black tree is a tree with a couple of interesting and useful properties. First, it's self-balancing, which means that no path in the tree will ever be more than twice as long as any other. Second, operations on the tree occur in O(log n) time (where n is the number of nodes in the tree). This means that you can insert or delete a task quickly and efficiently.
Então, principais diferenças:
Windows
- Agendamento de processo usando fila de feedback multinível + Agendamento de thread usando a fila multinível. O agendador de threads simplesmente escolhe o thread de maior prioridade, o agendador de processos é mais inteligente e usa a fila de feedback.
Linux
- Processo unificado e agendador de threads, configurável, por padrão, usa o CFS. O escalonador usa uma métrica de justiça e usa a prioridade para distorcer a distribuição da CPU para processos de maior prioridade.